【问题标题】:lifecycle event state and prevState in react.jsreact.js 中的生命周期事件状态和 prevState
【发布时间】:2016-10-01 12:50:21
【问题描述】:

下面是一个简单的 react 计数器。但我有3个问题。

  1. 第 3 行的状态是什么?它看起来像一个全局变量,如果它前面有varconst 会很有意义。那是生命周期函数/var 吗?

  2. 我必须从 react 中导入组件吗?我记得在 v15 中我不需要这样做。

  3. prevState 来自哪里?

import React, { Component } from 'react';

class Counter extends Component {
  state = { value: 0 };

  increment = () => {
    this.setState(prevState => ({
      value: prevState.value + 1
    }));
  };

  decrement = () => {
    this.setState(prevState => ({
      value: prevState.value - 1
    }));
  };

  render() {
    return (
      <div>
        {this.state.value}
        <button onClick={this.increment}>+</button>
        <button onClick={this.decrement}>-</button>
      </div>
    )
  }
}

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    这是一个带有注释代码的演示,可提供更多信息:http://codepen.io/PiotrBerebecki/pen/rrGWjm

    1.第 3 行的状态是什么?看起来像一个全局变量,它使 感觉它之前是否有 var 或 const 。那是一个生命周期吗 函数/变量?

    第 3 行中的state 只是 Counter 组件的一个属性。在 React 中使用 ES6 语法初始化状态的另一种方法如下:

    constructor() {
      super();
      this.state = {
        value: 0
      }
    }
    

    React 文档:https://facebook.github.io/react/docs/reusable-components.html#es6-classes

    [React ES6 类] API 与 React.createClass 类似,不同之处在于 获取初始状态。而不是提供单独的 getInitialState 方法,您在构造函数中设置自己的状态属性

    2。我必须从反应中导入组件吗?我记得我 在 v15 中不需要这样做。

    你也可以通过以下方式导入 React 并定义一个类:

    import React from 'react';
    
    class Counter extends React.Component {
    ...
    

    以下内容还允许您使用组件 API:

    import React, { Component } from 'react';
    
    class Counter extends Component {
    ... 
    

    3. prevState 来自哪里?

    prevState 来自 setState api:https://facebook.github.io/react/docs/component-api.html#setstate

    也可以传递带有签名的函数 功能(状态,道具)。当您需要时,这在某些情况下可能很有用 将查询先前值的原子更新排入队列 state+props 在设置任何值之前。例如,假设我们想要 在 state 中增加一个值:

    this.setState(function(previousState, currentProps) {
      return {
         value: previousState.value + 1
      };
    });
    

    您会经常看到开发人员通过以下方式更新状态。这不如上述方法可靠,因为状态可能会异步更新,我们不应该依赖它的值来计算下一个状态。

     this.setState({
       value: this.state.value + 1 // prone to bugs
     });
    

    来自我的 codepen 的完整代码:

    class Counter extends React.Component {
    
      // state = { value: 0 };
    
      // you can also initialise state in React
      // in the constructor:
      constructor() {
        super();
        this.state = {
          value: 0
        }
      }
    
      increment = () => {
        this.setState(prevState => ({
          value: prevState.value + 1
        })); 
      }
    
      decrement = () => {
        this.setState(prevState => ({
          value: prevState.value - 1
        }));  
      }
    
      render() {
        return (
          <div>
            {this.state.value}
            <button onClick={this.increment}>+</button>
            <button onClick={this.decrement}>-</button>
          </div>
        )
      }
    }
    
    
    ReactDOM.render(
      <Counter />,
      document.getElementById('app')
    );
    

    【讨论】:

    • 啊,这太清楚了,谢谢!意味着第一,作者没有“正确”地做到这一点?如果他这样做,我可以选择const state = {'value':0}
    • 我刚刚在问题 1 下添加了初始化状态的正确方法。
    • 我看到了,你是说作者做错了吗?你的意思是什么?我知道设置构造函数是做事的常用方法。
    • 当我说得正确时,我的意思是“根据 React 文档”:facebook.github.io/react/docs/… 说“你在构造函数中设置了自己的状态属性”。我刚刚将此添加到答案中。
    • 虽然如果您将初始状态设置为类主体中的属性,它也可以工作(至少在我使用“创建 React App”cli 制作的一些代码中),但可能是因为一些 ES6+ 特性喜欢在 ([babeljs.io/blog/2015/06/07/react-on-es6-plus]https://babeljs.io/…)
    【解决方案2】:

    您的代码中有一些与 ES6 (ES2015) 版本相关的功能,因此您可能会感到困惑:

    第 3 行的状态是什么?看起来像一个全局变量,如果它前面有 var 或 const 是有意义的。那是生命周期函数/var 吗?

    由于它位于class 主体内,因此它不是全局变量。在这种情况下,state 是一个属性,将设置为Counter 的实例,因此您可以通过this.state 访问它。

    我必须从 react 中导入组件吗?我记得在 v15 中我不需要这样做。

    使用类创建组件时,您需要扩展Component 类,因此在这种情况下:是的,您需要导入Component 或者您也可以使用class Counter extends React.Component

    prevState 从何而来?

    同样,ES6 特性。传递给this.setState() 方法的是一个函数。这可能会令人困惑,因为这是一个箭头函数=&gt;。所以previousState实际上是那个函数的一个参数。为了方便大家看图,上面的代码类似

    this.setState(function (prevState) {
      return {
        value: prevState.value - 1
      };
    });
    

    不过,“普通”和箭头函数之间存在一些差异,因此我建议您搜索 ES6 功能以便更熟悉它。

    【讨论】:

    • 通常人们会做const variableName = {propsName:'something}
    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2019-05-08
    • 1970-01-01
    • 2018-11-01
    • 2017-11-29
    相关资源
    最近更新 更多