常见的反模式

你不应该把 props 保存到 state 中。它被认为是一种反模式 。例如:

export default class MyComponent extends React.Component {
    constructor() {
        super();

        this.state = {
            url: ''
        }

        this.onChange = this.onChange.bind(this);
    }

    onChange(e) {
        this.setState({
            url: this.props.url + '/days=?' + e.target.value
        });
    }

    componentWillMount() {
        this.setState({url: this.props.url});
    }

    render() {
        return (
            <div>
                <input defaultValue={2} onChange={this.onChange} />

                URL: {this.state.url}
            </div>
        )
    }
}

prop url 保存在 state 上,然后进行修改。相反,选择将更改保存到状态,然后使用 stateprops 构建完整路径:

export default class MyComponent extends React.Component {
    constructor() {
        super();

        this.state = {
            days: ''
        }

        this.onChange = this.onChange.bind(this);
    }

    onChange(e) {
        this.setState({
            days: e.target.value
        });
    }

    render() {
        return (
            <div>
                <input defaultValue={2} onChange={this.onChange} />

                URL: {this.props.url + '/days?=' + this.state.days}
            </div>
        )
    }
}

这是因为在 React 应用程序中,我们希望拥有单一的事实来源 - 即所有数据都由一个组件负责,而且只有一个组件。此组件负责将数据存储在其状态中,并通过 props 将数据分发到其他组件。

在第一个示例中,MyComponent 类及其父级都在其状态中维护 url。如果我们在 MyComponent 中更新 state.url,则这些更改不会反映在父级中。我们失去了单一的事实来源,通过我们的应用程序跟踪数据流变得越来越困难。将此与第二个示例进行对比 - url 仅维护在父组件的状态中,并在 MyComponent 中用作 prop,因此我们保持单一的事实来源。