如何在 react.js ES6 中使用道具设置状态

Posted

技术标签:

【中文标题】如何在 react.js ES6 中使用道具设置状态【英文标题】:How to set states with props in react.js ES6 【发布时间】:2017-01-21 20:43:36 【问题描述】:

我想知道,如何使用 ES6 使用 props 参数设置我的状态

之前:

const MyComponent = React.createClass(
  getInitialState: function() 
    return 
      name: this.props.name || 'Initial data...'
    ;
  
);

现在我正在尝试这样做,但 this.props 不存在:

class MyComponent extends React.Component 
  constructor() 
    super()
      this.state =  name: this.props.name || 'Joseph Flowers' ;
  

【问题讨论】:

【参考方案1】:

实际上,你不需要一个有状态的组件来做你想做的事情(反模式:https://facebook.github.io/react/tips/props-in-getInitialState-as-anti-pattern.html)。

相反,另一个更简单、更好的解决方案:

class MyComponent extends React.PureComponent 

    static propTypes =             // <- This is not related to your question
        name: PropTypes.string,     //    but always declare your propTypes :-)
    

    static defaultProps =          // <- React provides defaultProps specifically
        name: 'Joseph Flowers',     //    for your use case !
    

【讨论】:

您好@jail 我正在尝试实施您的解决方案,但出现错误:static defaultProps = &gt; 4 | static defaultProps = | ^ 5 | name: 'Default name...' 6 | ; node -- version -> v6.3.1 @Jail,你为什么使用 React.PureComponent? 对不起@Jail 其他问题...如何验证 props.name 是否不是空字符串?导致其他组件正在发送和空字符串,但在这种情况下,我想将其设置为默认值,例如 if this.props.name === '' ? '' this.props.name : '默认值' @JosephFlowers 你能详细说明你的错误吗?消息是什么?你能复制/粘贴你的代码吗? @JosephFlowers 很好的问题:PureComponent 告诉 React 你正在编写一个纯组件,这意味着一个无状态组件:它呈现的内容仅取决于它接收到的道具。知道这一点后,React 可以实现一些性能优化。【参考方案2】:

你只需要在构造方法中传递 props 参数:

import React from 'react';

class MyComponent extends React.Component 
    constructor(props)  // <-- this parameter
        super(props)
        this.state = 
            name: props.name || 'Joseph Flowers' // <-- then used like this
        ;
    

请注意,在某些情况下它不是反模式:

(对于更复杂的逻辑,只需将计算隔离在一个方法中。)

但是,如果您明确表示 prop 只是组件内部控制状态的种子数据: 来源:https://facebook.github.io/react/tips/props-in-getInitialState-as-anti-pattern.html

顺便说一句,对于 ES6,如果你想设置默认属性,你必须在类声明的下一个声明:

import React from 'react';
import ReactDOM from 'react-dom';

class MyComponent extends React.Component 

    /**
    This is the ES7 way to use
    static propTypes =             
        name: React.PropTypes.string,
    

    static defaultProps =          
        name: 'My default value using ES7'
    
    */

    constructor(props) 
        super(props)
        // this still could be the best solutions in cases
        // of the unexpected values in the props sent 
        // for the out side component
        this.state = 
            name: props.name && props.name !== '' ? props.name :'Joseph Flowers';
        ;
    


// This is the ES6 way to use
MyComponent.propTypes = 
    name: React.PropTypes.string


MyComponent.defaultProps = 
    name: 'My default value'


ReactDOM.render(<MyComponent name="" />, document.getElementById('my-container-id'));

【讨论】:

感谢您的快速回答,效果很好!! 请注意...如果 props.name 更改,它不会反映在您的状态中...这是反模式,除非您将道具名称更改为“initialName”,但它是情况下,您不需要硬编码另一个...更多信息:facebook.github.io/react/tips/… @Jalil 感谢您的警告,因为设置“const”组件值可能是一个很好的解决方案 没听懂你……你在说什么? 你是对的,但如果你只需要一次使用道具设置状态(例如,ajax REST url 或不会改变的whataver),在构造函数中设置状态可能是一个很好的解决方案,不要你不觉得吗?【参考方案3】:

您可以对无状态组件执行此操作

const MyComponent = (props) => 
 return <div>Hi props.name || 'Joseph Flowers'! </div>

【讨论】:

【参考方案4】:

在 es7 中你可以像这样初始化 state。

class App extends React.Component 
    static propTypes = 
        title: React.PropTypes.string.isRequired,
       

    // or pass from parent Componet 
    static defaultProps = 
        title: 'hello',
    

    state = 
        title: this.props.title
    
    // ...

【讨论】:

以上是关于如何在 react.js ES6 中使用道具设置状态的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React js 中将道具传递给 API URL?

如何修复React.js中的箭头功能来处理道具

React.js:将默认值设置为道具

如何通过链接和路由传递道具/状态 - react.js

如何在 React.js 中将道具从一个类传递到另一个类

如何将从 API 获取的数据作为道具传递给其路由在 React JS 的另一个页面中定义的组件?