常見的反模式

你不應該把 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,因此我們保持單一的事實來源。