据我所知,componentWillMount能做而constructor不能做的唯一一件事就是拨打setState.

componentWillMount() {
    setState({ isLoaded: false });
}

由于我们还没有调用rendercomponentWillMount中的setState将在我们进入第一个render()过程之前准备state对象.这与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().信息技术

因此,我认为React将在第一次渲染时使用新的状态值,并避免重新渲染.

Question 1:这是否意味着,在componentWillMount内部,如果我们在异步方法的回调(可以是promise 回调)中调用setState,则在执行回调之前对blocks initial rendering做出react ?

在服务器端使用异步渲染之前(如果我看到上面的设置为true,那么我将不使用异步渲染).

我遗漏了什么概念吗?

Question 2:是我仅使用componentWillMount就可以实现的任何其他用例,但不使用constructorcomponentDidMount吗?

推荐答案

这是否意味着,如果我们在

No, see here.

下面的代码不会阻止render(请记住,在那里调用setState将是一种反模式)

componentWillMount: function() {
     new Promise((resolve, reject) => {
        setTimeout(()=> {
            resolve();
        }, 2000)
     }).then(() => this.setState({ promiseResult: 'World' }));
  },

问题2:我还可以使用其他用例来实现吗

No, for ES6 classes you can discard componentWillMount.只有在使用React.createClass({... })时才需要

编辑:显然,我错了.感谢@Swapnil指出这一点.这是discussion.

如果constructor中存在修改另一个组件状态的副作用,React会抛出警告,因为它假定constructor中的setState本身以及render()期间可能正在被调用.因此,constructor%的药物没有副作用.

如果在componentWillMount分钟内完成,则不会抛出错误.另一方面,来自facebook的人也在componentWillMount例中阻止副作用.所以如果你没有任何副作用,你可以用constructor而不是componentWillMount.对于副作用,建议使用componentDidMount而不是componentWillMount.

Reactjs相关问答推荐

如何防止使用useCallback和memo重新渲染

替换谷歌 map api默认信息窗口与自定义

Reaction-路由v6动态路径RegExp

Next.js:提交表单时状态尚未就绪

无法在主组件的返回语句中呈现预期组件

无法将react 路由状态从路由传递给子组件

从 MongoDB createAt 字段中分割精确时间

为什么在 React 的 useEffect 中使用 onAuthStateChanged ?

BrowserRouter改变了URL但没有链接到页面

在 CrafterCMS Studio 中拖动字段

React 组件列表中的第一个计时器正在获取值 NaN

损坏的图像 React useState

Formik onChange() 字段挂钩覆盖显示值和 Select 机制

响应式媒体 React Tailwind

vdom 最终更新了 dom(在比较之后)任何 dom 更改实际上应该触发整个树的重绘和回流,那么 vdom 有什么用?

使用 React.UseEffect 从 api 获取但我的清理返回不起作用

不能在我的代码中使用 .给我一个警告!有人知道解决方案吗?

渲染的钩子比预期的少.这可能是由 React Hooks 中意外的提前返回语句引起的

将鼠标悬停在仅适用于该类的第一个实例的 p5.js 类上

将 set statehook 函数传递给子路由组件.解构错误