【问题标题】:Fetching data in constructor在构造函数中获取数据
【发布时间】:2019-03-15 12:23:19
【问题描述】:

在 javascript 类 constructor() 中获取数据是一种好习惯吗?

例如在 react 类 constructor() 中,我找到的每个教程都在 componendDidMount() 中获取数据,但没有人解释为什么我们不能在 constructor() 中这样做。

问题完全涉及 javascript 类,而不仅仅是 react

【问题讨论】:

  • componentDidMount 更好,原因有很多。例如。构造函数将在服务器端渲染中运行,但componentDidMount 不会。

标签: javascript reactjs


【解决方案1】:

在安装组件之前调用构造函数(如#constructor doc 中所述:https://reactjs.org/docs/react-component.html)。

要回答您的问题,解释在于反应组件的生命周期以及状态更改时需要重绘。通过在构造函数中进行异步调用,您可以在组件挂载之前触发 setState。

如果在构造函数中调用 setState,在构造函数中执行异步调用会干扰重新渲染,并且您的组件有时不会重新渲染。

来自文档:

你不应该在constructor()中调用setState()。相反,如果您的组件需要使用本地状态,请直接在构造函数中将初始状态分配给 this.state:

避免在构造函数中引入任何副作用或订阅。对于这些用例,请改用 componentDidMount()。

【讨论】:

    【解决方案2】:

    类构造函数是一个函数,只有当函数在 DOM 中第一次初始化时才会被调用。 在琐碎的语言行为中,只有当我们使用 new 关键字实例化一个类时,它的构造函数才会被调用。 现在,如果我们在 Javascript Classes 构造函数中获取数据:

    1. 如果获取的数据负责交互,则作为 React 使用 DOM(UI),它会失败,因为只有在组件之后 DOM 才准备好 挂载,由 componentDidMount 保证。

    2. 当组件重新渲染时,数据获取函数也不会被调用,因为构造函数只被调用一次,因此数据不会更新 UI(DOM)

    构造函数通常用于默认值赋值和声明类相关属性。

    【讨论】:

      【解决方案3】:

      Javascript introducted classes in ECMAScript2015。 它们主要是 Javascript 基于原型的继承的语法糖。 React 有一个 Component 的类类型,它带有生命周期方法和其他一些好东西,你可以阅读更多关于 here 的信息。

      一般来说,最佳做法是在生命周期方法componentDidMount 中获取数据。您的组件在检索数据后需要一个放置数据的地方,并且当调用此生命周期方法时,您可以确信 render() 已被调用至少一次。

      【讨论】:

        猜你喜欢
        • 2016-03-11
        • 1970-01-01
        • 1970-01-01
        • 2021-07-12
        • 2016-08-17
        • 1970-01-01
        • 1970-01-01
        • 2017-05-30
        • 1970-01-01
        相关资源
        最近更新 更多