ReactJS - 当我改变状态时,道具也会改变
ReactJS - When I change a state, props change too
我了解到,在 React 组件中,状态可以改变而道具不能,除非父组件改变它们。很容易理解。所以,现在我正在尝试使用数组制作父组件,将其传递给子组件并将其分配给状态。我添加了另一个道具以更好地理解问题:
import React from "react";
export default function Parent() {
return <Child list={["1", "3", "4"]} val="val" />;
}
这是我的子组件,它接收道具、管理和渲染它们:
class Child extends React.Component {
state = {
list: this.props.list,
val: this.props.val
};
onValueChange = (e, i) => {
let { list } = this.state;
list[i] = e.target.value;
this.setState(() => {
return { list };
});
};
render() {
console.log(this.props.list[0], this.props.val);
return (
<div className="App">
{this.state.list.map((item, i) => {
return (
<input
key={i}
value={item}
onChange={(e) => this.onValueChange(e, i)}
/>
);
})}
<div>
<input
value={this.state.val}
onChange={(e) => {
this.setState({ val: e.target.value });
}}
/>
</div>
</div>
);
}
}
如果我尝试编辑“val”状态(使用 val prop 初始化),val prop 不会改变。相反,如果我尝试编辑数组中的一项(使用列表属性初始化),状态和属性都会改变!
我原以为 props 永远不会改变,但似乎如果 prop 是一个数组,它就可以
我做错了什么?
这是这个奇怪行为的代码和框:
https://codesandbox.io/s/hidden-darkness-tfoxl?file=/src/App.js
以下是我可以推荐的:
onValueChange = (e, i) => {
// Copy the list state
let list = [...this.state.list];
// Make a copy of the item you want to update
let item = {...list [i]};
// Update it
item = e.target.value;
// Put it back into the list
list [i] = item;
// Return the new state
this.setState({list});
};
谢谢 Redha,这如我所料!
所以答案是:比方说,直接编辑状态,而不是直接编辑状态,这会复制状态然后编辑它,保持道具不变。再次感谢!
我了解到,在 React 组件中,状态可以改变而道具不能,除非父组件改变它们。很容易理解。所以,现在我正在尝试使用数组制作父组件,将其传递给子组件并将其分配给状态。我添加了另一个道具以更好地理解问题:
import React from "react";
export default function Parent() {
return <Child list={["1", "3", "4"]} val="val" />;
}
这是我的子组件,它接收道具、管理和渲染它们:
class Child extends React.Component {
state = {
list: this.props.list,
val: this.props.val
};
onValueChange = (e, i) => {
let { list } = this.state;
list[i] = e.target.value;
this.setState(() => {
return { list };
});
};
render() {
console.log(this.props.list[0], this.props.val);
return (
<div className="App">
{this.state.list.map((item, i) => {
return (
<input
key={i}
value={item}
onChange={(e) => this.onValueChange(e, i)}
/>
);
})}
<div>
<input
value={this.state.val}
onChange={(e) => {
this.setState({ val: e.target.value });
}}
/>
</div>
</div>
);
}
}
如果我尝试编辑“val”状态(使用 val prop 初始化),val prop 不会改变。相反,如果我尝试编辑数组中的一项(使用列表属性初始化),状态和属性都会改变!
我原以为 props 永远不会改变,但似乎如果 prop 是一个数组,它就可以
我做错了什么?
这是这个奇怪行为的代码和框:
https://codesandbox.io/s/hidden-darkness-tfoxl?file=/src/App.js
以下是我可以推荐的:
onValueChange = (e, i) => {
// Copy the list state
let list = [...this.state.list];
// Make a copy of the item you want to update
let item = {...list [i]};
// Update it
item = e.target.value;
// Put it back into the list
list [i] = item;
// Return the new state
this.setState({list});
};
谢谢 Redha,这如我所料! 所以答案是:比方说,直接编辑状态,而不是直接编辑状态,这会复制状态然后编辑它,保持道具不变。再次感谢!