您现在的位置:首页 >> 前端 >> 内容

React子组件修改父组件状态的方法教程

时间:2018/5/28 11:20:18 点击:

  核心提示:React子组件修改父组件的状态在React中,父子组件间的通信是通过props来传递参数的。一般情况下,父组件传一个值给子组件,同时还要传一个修改该值的方法函数。这样,在子组件中调用这个方法函数才能...

React子组件修改父组件的状态

在React中,父子组件间的通信是通过props来传递参数的。一般情况下,父组件传一个值给子组件,同时还要传一个修改该值的方法函数。这样,在子组件中调用这个方法函数才能修改该值,并再次传给子组件,从而修改子组件状态。 

虽然这个数据流非常绕,至少是能接受的,但一旦要传非常多的参数给子组件的时候,这样就很麻烦,比如要传十个参数,就必须再传十个修改函数,而且这十个修改函数还必须在父组件中写一遍定义,结果就如下一般繁琐:

class App extends Component {

    constructor(props) {

        super(props);

        this.state = {

            step: 1,

            isHome: '',

            isNewCar: false,

            plateNo: '',

            name: '',

            idCard: '',

            brandModel: '',

            engineNo: '',

            vin: '',

            hasRecord: 0,

            registerDate: ''

        };

    };

    //修改参数的函数

    setStep() {

        this.setState({

                step: ++this.state.step

            });

    }

    //修改参数的函数

    setIsHome(val) {

        this.setState({

                isHome: val

            });

    }

.

.

.

.

.

.

    //修改参数的函数

    setRegisterDate(val) {

        this.setState({

                registerDate: val

            });

    }

    render() {

        return (

            <p>

                <IndexDesk 

                    step={this.state.step} 

                    isHome={this.state.isHome} 

                    isNewCar= {this.state.isNewCar}

                    plateNo={this.state.plateNo} 

                    idCard={this.state.idCard}

                    brandModel={this.state.brandModel}

                    engineNo={this.state.engineNo}

                    vin={this.state.vin}

                    hasRecord={this.state.hasRecord}

                    registerDate={this.state.registerDate}

                    setStep={this.setStep.bind(this)}

                    setIsHome={this.setIsHome.bind(this)}

                    .

                    .

                    .

                    setRegisterDate={this.setRegisterDate.bind(this)}

                    />

            </p>

        );

    };

}

这是我最先想到的思路,显然,这个代码冗余实在是太大,后来发现,其实我可以传递一个函数就可以搞定所有的参数修改函数了:

//修改根组件的状态

    setSet(obj) {

        this.setState(obj);

    }

之前的组件可以写成如下模样

class App extends Component {

    constructor(props) {

        super(props);

        this.state = {

            step: 1,

            isHome: '',

            isNewCar: false,

            plateNo: '',

            name: '',

            idCard: '',

            brandModel: '',

            engineNo: '',

            vin: '',

            hasRecord: 0,

            registerDate: ''

        };

    };

//修改根组件的状态

    setSet(obj) {

        this.setState(obj);

    }

    render() {

        return (

            <p>

                <IndexDesk 

                    step={this.state.step} 

                    isHome={this.state.isHome} 

                    isNewCar= {this.state.isNewCar}

                    plateNo={this.state.plateNo} 

                    idCard={this.state.idCard}

                    brandModel={this.state.brandModel}

                    engineNo={this.state.engineNo}

                    vin={this.state.vin}

                    hasRecord={this.state.hasRecord}

                    registerDate={this.state.registerDate}

                    setSet={this.setSst.bind(this)}

                    />

            </p>

        );

    };

}

代码瞬间少了很多,世界顿时美好了起来!

Tags:RE EA AC CT 
作者:网络 来源:github_385