【发布时间】:2017-04-11 05:07:08
【问题描述】:
据我所知,componentWillMount 唯一能做而constructor 不能做的就是打电话给setState。
componentWillMount() {
setState({ isLoaded: false });
}
由于我们还没有调用render,componentWillMount 中的setState 将在我们进入第一个render() 传递之前准备状态对象。这与constructor 所做的基本相同:
constructor(props) {
super(props);
this.state = { isLoaded: false };
}
但我看到另一个用例componentWillMount 很有用(在服务器端)。
让我们考虑一些异步的东西:
componentWillMount() {
myAsyncMethod(params, (result) => {
this.setState({ data: result });
})
}
这里我们不能使用constructor 作为对this.state 的赋值不会触发render()。
componentWillMount 中的setState 怎么样?根据React docs:
componentWillMount()在安装发生之前立即调用。它 在render() 之前调用,因此在此方法中设置状态将 不会触发重新渲染。避免引入任何副作用或 此方法中的订阅。
所以,在这里我认为 React 将使用新的状态值进行第一次渲染并避免重新渲染。
问题 1:这是否意味着,在 componentWillMount 内部,如果我们在异步方法的回调(可以是 Promise 回调)中调用 setState,React 会阻止初始渲染 直到回调被执行?
在客户端上进行此设置(是的,我在服务器端渲染中看到了该用例),如果我假设上述情况属实,那么在我的异步方法完成之前我将看不到任何东西。
我是否遗漏了任何概念?
问题 2:我可以仅使用 componentWillMount 而不是使用 constructor 和 componentDidMount 实现的任何其他用例吗?
【问题讨论】:
-
问题 1:这是否意味着,在 componentWillMount 内部,如果我们在异步方法的回调(可以是 Promise 回调)中调用 setState,React 会阻塞初始渲染,直到回调被执行?" 肯定不是——它怎么知道?React 很强大,但并不神奇。
-
我想知道我的第一个问题是否完全有效,否则我想知道
componentWIllMount的真实用例是什么。很抱歉在一个问题中问了两个问题。我不想在另一个问题中重复我所有的研究故事。 :)
标签: javascript class reactjs constructor ecmascript-6