当前位置: 首页 > 面试题库 >

构造函数vs componentWillMount; componentWillMount可以做什么而构造函数不能做什么?

华烈
2023-03-14
问题内容

据我所知,一个唯一componentWillMount可以做的事和一个constructor不能做的事就是打电话给setState

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

由于我们尚未调用render,因此setStatein
componentWillMount会在进入render()第一遍之前准备状态对象。本质上是相同的constructor

constructor(props) {
    super(props);
    this.state = { isLoaded: false };
}

但是我看到了另一个componentWillMount有用的用例(在服务器端)。

让我们考虑一些异步的东西:

componentWillMount() {
    myAsyncMethod(params, (result) => {
        this.setState({ data: result });
    })
}

在这里,我们不能使用constructoras分配来this.state不会触发render()

怎么样setStatecomponentWillMount?根据React
docs

componentWillMount()在挂载发生之前立即调用。在之前调用render(),因此在此方法中设置状态不会触发重新渲染。避免在此方法中引入任何副作用或订阅。

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

问题1:
在内部componentWillMount,这是否意味着如果我们调用setState异步方法的回调(可以是promise回调),React会
阻止初始渲染, 直到执行该回调?

客户端进行 此设置(是的,我在服务器端渲染中看到了该用例),如果我假设上述情况是正确的,那么在我的异步方法完成之前,我将看不到任何东西。

我是否缺少任何概念?

问题2:componentWillMount仅使用而不使用constructorand
可以实现的其他用例componentDidMount吗?


问题答案:

这是否意味着在componentWillMount内部,如果我们在异步方法的回调(可以是promise回调)中调用setState,React会阻止初始渲染,直到执行该回调?

不,请看 这里。

以下代码不会阻止渲染(请记住,无论如何在那里调用setState都是一种反模式)

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

问题2:我是否可以仅使用componentWillMount来实现其他用例,而不使用构造函数和componentDidMount来实现?

不,对于ES6类,您可以丢弃componentWillMount 。仅当您使用时才需要React.createClass({... })

编辑:显然,我错了。感谢@Swapnil指出这一点。这里是讨论。

反应引发警告,如果有在副作用constructor中的另一组件,其修饰状态,因为它假设setStateconstructor本身和潜在期间render()被调用。因此,不需要任何副作用constructor

如果在中执行此操作,则不是这种情况componentWillMount,不会引发任何错误。另一方面,来自Facebook的家伙componentWillMount也阻止了副作用。因此,如果您没有任何副作用,可以使用constructor代替componentWillMount。对于副作用,建议使用componentDidMount代替componentWillMount。无论哪种方式,您都不需要componentWillMount



 类似资料:
  • 问题内容: 我是一名Java初学者,了解以下Java编译器规则: 如果该类没有超类,则将其扩展到Object类 如果该类没有构造函数,请添加默认的无参数构造函数 如果构造函数的第一行不是“ super()”或“ this()”,请添加“ super()”以调用超类的默认构造函数。 我知道我们创建的所有对象都是从超类Object派生的。我的问题是被调用时Object类中的构造函数做什么? 编辑:我的

  • 问题内容: 如果我在构造函数中返回一些值或对象,那么var会得到什么? 在两种情况下都会得到什么n? 其实这是一个测验问题,答案是什么? 自定义对象构造函数返回什么? a)新实例化的对象 b)未定义-构造函数不返回值 c)不论return语句是 d)等于return语句是什么;新实例化的对象(如果没有return语句) 问题答案: 我发现了这个很棒的链接: 上面提到的第二点魔术是构造函数返回特定的

  • 本文向大家介绍请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?相关面试题,主要包含被问及请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JAVA构造函数 当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一

  • 问题内容: 在Python中,用于初始化不可变类型,通常用于初始化可变类型。如果将其从语言中删除,该怎么办(轻松)? 例如, 可以这样重写: 为澄清问题的范围:这不是一个问题关于如何以及是使用或它们之间有什么区别。这是一个问题,如果从语言中删除将会发生什么。有什么坏事吗?事情会变得很难或不可能吗? 问题答案: 您可以在中进行的所有操作都可以在中完成。 那么,为什么要使用? 因为您不必将实例存储在变

  • 问题内容: 我想我了解Lisp宏及其在编译阶段的作用。 但是在Python中,您可以将一个函数传递给另一个函数 因此,我们在这里得到了懒惰的评估。我可以使用宏而不是使用函数作为一流对象怎么办? 问题答案: 首先,Lisp也具有一流的功能,因此您也可以问:“如果我已经具有一流的功能,为什么在Lisp中需要宏”。答案是一流的函数不允许您使用语法。 从表面上看,一流的函数允许您编写或,但不允许编写。尽管

  • 问题内容: 这些来自github上的spring amqp示例,位于https://github.com/SpringSource/spring-amqp- samples.git 这些是 什么类型的Java构造函数?它们是吸气剂和吸气剂的捷径吗? 与此相反 问题答案: 这些构造函数被重载以使用调用另一个构造函数。第一个无参数构造函数使用空参数调用第二个。第二呼叫的第三构造(未示出),其必须采取,