为什么我们不应该在render()方法中使用browserHistory.push('/ some-path')?

时间:2018-11-02 09:37:03

标签: javascript reactjs react-router

下面是我的代码

let mut bh = BinaryHeap::new();
bh.push(0);
bh.push(1);
bh.push(2);

println!("{:?} => {:?}", bh, bh.peek());

// convert into a vector:
let mut v = bh.into_vec();
println!("{:?}", v);

// modify in a way that alters the order:
v[1] = -1;
println!("{:?}", v);

// convert back into a binary heap
let bh: BinaryHeap<_> = v.into();
println!("{:?} => {:?}", bh, bh.peek());

当将true作为isAuthenticated的值传递给LoginApp时,此代码发出如下警告:

警告:setState(...):在现有状态转换期间(例如在渲染或其他组件的构造函数中)无法更新。渲染方法应该纯粹是道具和状态的函数;构造函数的副作用是反模式,但可以将其移至componentWillMount。

到目前为止,无法在LoginApp组件中进行任何更改,因此在LoginContainer中做了一个小的解决方法(我真的不喜欢)

我带来的变化是

  1. 未将“ isAuthenticated”的值传递给LoginApp组件。
  2. 通过组件从容器组件本身重定向确实进行了安装并进行了更新

LoginContainer的新实现如下

class LoginContainer extends Component {
  ...
  render() {
    return <LoginApp  isAuthenticated={this.props.isAuthenticated} />
  }
}

/* ==> Implemetation of LoginApp is like below <== */

import { browserHistory } from 'react-router';
class LoginApp extends Component {
  ...
  render() {
    if (this.props.isAuthenticated) {
      browserHistory.push('/dashboard');
      return null;
    }
    /* code to render login form elements....*/
  }
}

现在我没有警告,并且我处于某种模式-我的代码正在运行(因为没有警告),但我不知道为什么?

反应版本:15 React-router版本:2.8.1

0 个答案:

没有答案