【发布时间】:2018-11-05 13:21:55
【问题描述】:
这个问题与 React 的实现细节有关,更具体地说,与状态封装有关。
this 对this 问题的回答中的演示演示了作为对象的 React 道具是通过引用传递的,在此转载:
const Parent = () => {
let myInt = 1;
let myObj = {a: "foo"};
setTimeout(function(){
myInt = 2;
myObj.a = "bar";
}, 500);
return <Child myInt={myInt} myObj={myObj} />;
}
const Child = ({myInt, myObj}) => {
setTimeout(function(){
console.log(myInt);
console.log(myObj);
}, 1000);
return (
<div>
<p>{myInt}</p>
<p>{JSON.stringify(myObj)}</p>
</div>
);
}
ReactDOM.render(<Parent />, document.getElementById("app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
在 React 中可以将 state 作为 prop 传递给子组件。鉴于对象/数组 props 是通过引用传递的,React 如何维护状态封装?
子组件是否在本地复制传递给它的道具?因此,子组件不关心 prop 的来源是 state(即避免在传递给子组件的 prop 中反映父组件级别的状态更改的风险)。
【问题讨论】:
-
“父组件级别的状态变化反映在传递给子组件的道具中”不是期望的行为吗?通过
setState改变状态。直接的 state/prop 突变在 React 中是一个很大的禁忌。 -
props是不可变的。
标签: javascript reactjs