重定向到 React Router 中的另一个路由后的警告

Posted

技术标签:

【中文标题】重定向到 React Router 中的另一个路由后的警告【英文标题】:Warning after redirect to another route in React Router 【发布时间】:2018-11-25 23:17:18 【问题描述】:

我是 React 的新手,我有一个关于重定向路由器和已安装组件的问题,因为我收到了警告。请查看可能的组件:

class Activation extends React.Component 
  constructor(props)
    super()
    this.token = props.match.params.id
    this.state = 
        fadeOn: false
    
 
 componentDidMount()
    fetch('/api/activate/' + this.token, 
        method: 'PUT'
    ).then((response) => response.json())
    .then((message)=>
        if(message.success)
            this.setState(
                fadeOn: true,
                msg: message.message
            )  
         else 
            this.setState(
                fadeOn: true,
                errMsg: message.message
            )  
        
    )

render()
    return (
        <Grid>
            <Row>
                <img className="rabbit" src=rabbit/>
                <Fade in=this.state.fadeOn>
                    this.state.msg?
                        <Alert bsStyle="success" className="activeAlert">this.state.msg</Alert>
                        :
                        <Alert bsStyle="danger" className="activeAlert">this.state.errMsg</Alert> 
                    
                </Fade>
            </Row>
            <Redirect to="/"/>
        </Grid>

    )
  

export default Activation

path="/"中的组件

class Users extends Component 
 render() 
 return (
  <div>
    <h1>Users page!!!</h1>
  </div>
  );
 

export default Users;

我的目标是在激活他的帐户后重定向用户。一切正常,但重定向后我收到以下警告:Can't call setState (or forceUpdate) on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method。你能解释一下我做错了什么,以及我的组件如何?

【问题讨论】:

请在路径"/"中添加要显示的组件的代码 更新问题 【参考方案1】:

这是因为在初始渲染本身中,您将重定向到“/”,然后在 componentDidMount 中设置状态。所以,

在构造函数中设置状态为,

this.state = 
        fadeOn: false,
        activationComplete: false ,
    

而在 fetch 的.then 中,你应该将状态设置为,

this.setState(
                fadeOn: true,
                msg: message.message,
                activationComplete:true
            )

然后,在渲染中,将现有的重定向语句替换为,

render()
    if(this.state.activationComplete)
      return <Redirect to="/"/>
    else
      return (
        <Grid>
            <Row>
                <img className="rabbit" src=rabbit/>
                <Fade in=this.state.fadeOn>
                    this.state.msg?
                        <Alert bsStyle="success" className="activeAlert">this.state.msg</Alert>
                        :
                        <Alert bsStyle="danger" className="activeAlert">this.state.errMsg</Alert> 
                    
                </Fade>
            </Row>

        </Grid>

    )
  

【讨论】:

以上是关于重定向到 React Router 中的另一个路由后的警告的主要内容,如果未能解决你的问题,请参考以下文章

路由/重定向不在 React Router 4 和 Redux 授权中呈现

React Hooks with React Router v4 - 我如何重定向到另一个路由?

React Router Dom v6 - 重定向到另一个路由

React Router Dom v6 - 重定向到另一个路由

React Router v4 - 使用不同的查询参数重定向到相同的路由

react-router-dom之Redirect(重定向)理解