今天小编给大家分享一下React状态提升的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
所谓 状态提升 就是将各个子组件的 公共state 提升到它们的父组件进行统一存储、处理(这就是所谓的”单一数据源“),负责setState
的函数传到下边的子级组件,然后再将父组件处理后的数据或函数props到各子组件中。
那么如果子组件 要 修改父组件的state该怎么办呢?我们的做法就是 将父组件中负责setState的函数,以props的形式传给子组件,然后子组件在需要改变state时调用即可。
实现方式
实现方式是 利用最近的共同的父级组件中,用props的方式传过去到两个子组件,props中传的是一个setState的方法,通过子组件触发props传过去的方法,进而调用父级组件的setState的方法,改变了父级组件的state,调用父级组件的render方法,进而同时改变了两个子级组件的render。
这是 两个有关连的同级组件的传值,因为react的单项数据流,所以不在两个组件中进行传值,而是提升到 最近的共同的父级组件中,改变父级的state,进而影响了两个子级组件的render。
官网介绍
通常,多个组件需要反映相同的变化数据,这时我们建议将共享状态提升到最近的共同父组件中去。
先写一个温度输入组件:
class TemperatureInput extends React.Component { state = { temperature: '' }; handleChange = (e) => { this.setState({ temperature : e.target.value }) }; render() { return ( <fieldset> <legend>输入{scaleNames[this.props.scale]}:</legend> <input type="number" value={this.state.temperature} onChange={this.handleChange} </fieldset> ) } }
这个组件就是一个普通的受控组件,有state
和props
以及处理函数。
我们在写另一个组件:
class Calculator extends React.Component { render () { return ( <div> <TemperatureInput scale='c'/> <TemperatureInput scale='f'/> </div> ) } }
这个组件现在没有什么存在的价值,我们仅仅是给两个温度输入组件提供一个父组件,以便我们进行后续的状态提升。
现在我们看看网页的样子:
我们可以输入摄氏度和华氏度,但是我们现在想要让这两个温度保持一致,就是我们如果输入摄氏度,那么下面的华氏度可以自动算出来,如果我们输入华氏度,那么摄氏度就可以自动算出来。
那么我们按照现在这种结构的话,是非常难以实现的,因为我们知道这两个组件之间没有任何关系,它们之间是不知道对方的存在,所以我们需要把它们的状态进行提升,提升到它们的父组件当中。
那我们看看如何做修改,首先把子组件(温度输入组件)的状态(state)全部删除,看看是什么样子:
class TemperatureInput extends React.Component { handleChange = (e) => { }; render() { return ( <fieldset> <legend>输入{scaleNames[this.props.scale]}:</legend> <input type="number" value={this.props.temperature} onChange={this.handleChange}/> </fieldset> ) } }
可以看到所有与state
有关的东西全部删掉了,然后input
的value
也变成了props
,通过父组件传入。那么现在这个温度输入组件其实就是一个受控组件了,仔细回忆一下我们之前讲的受控组件,看看是不是这样意思?
我们通常会在受控组件发生改变的时候传入一个onChange
函数来改变受控组件的状态,那么我们这里也是一样,我们通过给 温度输入组件 传入某个函数来让 温度输入组件 中的input
发生变化的时候调用,当然这个函数我们可以随意命名,假如我们这里叫做onTemperatureChange
函数,那么我们继续修改子组件:
class TemperatureInput extends React.Component { handleChange = (e) => { this.props.onTemperatureChange(e.target.value); }; render() { return ( <fieldset> <legend>输入{scaleNames[this.props.scale]}:</legend> <input type="number" value={this.props.temperature} onChange={this.handleChange}/> </fieldset> ) } }
好了,我们的子组件差不多就是这样了,当然我们可以省略那个handleChange
函数,因为可以看到这个函数就是调用了一下那个props
里的函数,所以我们完全把input
的onChange
这么写 <input type="number" value={this.props.temperature} onChange={this.props.onTemperatureChange}/>
这么写的话注意onTemperatrueChange
函数的参数是那个事件,而不是我这里写的e.target.value
。
再看看我们的父组件如何修改,我们首先补上state
,以及子组件对应的onChange
处理方法,以及子组件的值。写好之后大概是这个样子:
class Calculator extends React.Component { state = { celsius: '', fahrenheit: '' }; onCelsiusChange = (value) => { this.setState({ celsius: value, fahrenheit: tryConvert(value, toFahrenheit) }); }; onFahrenheitChange = (value) => { this.setState({ celsius: tryConvert(value, toCelsius), fahrenheit: value }); }; render() { return ( <div> <TemperatureInput scale='c' temperature={this.state.celsius} onTemperatureChange={this.onCelsiusChange}/> <TemperatureInput scale='f' temperature={this.state.fahrenheit} onTemperatureChange={this.onFahrenheitChange}/> </div> ) } }
以上就是“React状态提升的方法是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。