我在看Pluralsight关于React的课程,老师说道具不应该被改变。我现在正在读一篇关于道具vs.国家的文章(uberVU/react-guide),它说
道具和状态更改都会触发呈现更新。
文章后面说:
Props(属性的缩写)是组件的配置,如果可以的话,是它的选项。它们是从上面接收的,是不可变的。
所以道具可以改变,但它们应该是不可变的?
什么时候应该使用道具,什么时候应该使用状态?
如果你有一个React组件需要的数据,它应该通过道具或设置在React组件通过getInitialState?
大多数时候,你的子组件是无状态的,这意味着它们代表了它的父组件给它的数据/信息。
另一方面,状态处理的是处理组件本身,状态可以在组件内部通过setState和useState钩子改变。
例如
class Parent extends Component{
constructor(props){
super(props);
this.state = {
fruit: 'apple'
}
this.handleChange = this.handleChange.bind(this)
}
handleChange(){
this.setState({fruit: 'mango'})
}
render(){
return (
<div>
<Child fruit={this.state.fruit} />
<button onClick={this.handleChange}>Change state</button>
</div>
)
}
}
当点击按钮时,父类将其状态从apple更改为mango,并将其状态作为道具传递给子组件。现在,没有状态的子组件根据父组件的状态显示不同的标题。
class Child extends Component{
render(){
return(
<h1>I have received a prop {this.props.fruit}</h1>
)
}
}
所以在根级别上,道具是父进程与子进程的通信,而状态是描述父进程的情况等。
给出最简单的解释,补充上述评论:
根据React的官方文档,他们将“状态”视为
To “remember” things, components use state.
props可以理解为从父组件传递给子组件的变量。
如果你想在应用中记住一些东西,你会使用状态如果你想传递数据,你会使用道具。
让我给你另一个类比,假设你想把你脑子里的前25个自然数的序列相加。
1+2+3+4.....
从1开始,然后加2,现在是3,然后加到现在的总数(6),然后加4到现在的总数(6),所以新的总数是10。
当前的总和是程序的状态,假设您需要找到总和的平均值。你要把这个和代入一个方程,然后把这个和作为道具传下去。
希望这能说得通。
道具和状态之间的关键区别在于,状态是内部的,由组件本身控制,而道具是外部的,由呈现组件的任何东西控制。
function A(props) {
return <h1>{props.message}</h1>
}
render(<A message=”hello” />,document.getElementById(“root”));
class A extends React.Component{
constructor(props) {
super(props)
this.state={data:"Sample Data"}
}
render() {
return(<h2>Class State data: {this.state.data}</h2>)
}
}
render(<A />, document.getElementById("root"));
状态可以改变(可变的)
而道具不能(不可变)