我是一个初级程序员,努力理解我应该如何处理孙子状态(或者看看有孙子状态是否是个好主意)。
我的问题是。。。
1.是否可以通过this.setState((prevState))
更改孙子?
2.在美国生孙子是个坏主意吗?
为了举例说明,这里是一个组件的构造函数。
constructor(props) {
super(props);
this.state = {
input: {
example: "",
},
invalid:{
example: false
},
};
this.handleChange = this.handleChange.bind(this);
this.submit = this.submit.bind(this);
}
我把this.state.invalid
看作是子,而this.state.invalid.example
看作是孙子。
这里是一个JSX。
<div className="input">
<input type="text" value={this.state.input.example || ''} onChange={this.handleChange} />
{ this.state.invalid.example ? <span> This input is invalid </span> : null }
</div>
//Here are similar input fields...
<button onClick={this.submit} type="button">Submit</button>
当触发onClick={this.submit}
时,我想验证函数'this.submit'中的输入。
submit(){
for (var key in this.state.input) {
if(!this.state.input[key]){
this.setState((prevState, key) => ({
invalid[key]:true, //This causes an error, saying that "SyntaxError: Unexpected token, expected ,"
}));
}
}
在这个例子中,this.state.invalid.example
应该被设置(即更改),但是上面的代码不起作用。
也许分解此应用程序并生成
因为我不知道我周围有谁在学习ReactJS,任何建议都将不胜感激!
如果您想这样做,方法是:
constructor() {
this.state = {
input: {
example: "",
},
invalid:{
example: false
},
};
}
assignChildState(state) {
var state = Object.assign({}, this.state);
state.input = Object.assign({}, state.input);
state.input.example = "New Value";
this.setState(state);
}
您当然可以创建一个函数来处理它,类似于:
function assignChildState(path, value) {
var pieces = path.split(".");
var state = Object.assign({}, this.state);
var current = state;
for (var i = 0; i < pieces.length - 1; i++) {
var piece = pieces[i];
console.log(current, piece);
if (current[piece].toString() === "[object Object]") {
current[piece] = Object.assign({}, current[piece]);
} else if (typeof current[piece] === "object" /* array */) {
current[piece] = current[piece].concat();
}
current = current[piece];
}
current[pieces[i]] = value;
this.setState(state);
}
然后你可以做:
this.assignChildState("input.example", true);
它将适当地更新子状态。
尽管如此,我肯定会研究redux或flux,或者我个人最喜欢的flummox。
我认为在组件中嵌套状态本身并不是一个坏主意。但是要记住,setState
将nextState浅合并到当前状态
请参阅react文档中的。
所以如果你的州是
{
input: {
example: "asd",
other: "123"
},
invalid: {
example: false,
other: false
}
}
然后调用setState({invalid:{example:true}}})
,结果状态如下
{
input: {
example: "asd",
other: "123"
},
invalid: {
example: true
}
}
注意,invalid
下的所有内容都被替换为新状态,而input
下的对象保持不变(即执行浅合并)。
在您的提交函数中,我将在循环中创建整个无效对象,然后像这样调用setState。
最后一个代码段中的错误只是语法错误。不能像这样构造对象:{invalid[key]:true}
,它应该是{invalid:{[key]:true}
。
不能按状态将祖先组件的状态传递给后代组件。你可以通过道具来完成,但它会导致道具向下传递许多级别。上下文也有可能,但这也不是好方法。
最好的方法是使用助焊剂或还原剂。我更喜欢redux,在redux中,你可以通过使用连接方法从一个存储中获取你的对象需要的变量。
https://github.com/reactjs/react-redux/blob/master/docs/api.md
也检查这些视频
当您通过提交表单调用API请求时,如何设置Axios响应?我想从/在POST方法中发送表单,并获得API响应,然后用API响应重定向到/result页面。我的代码在下面,它引发 警告:无法对卸载的组件执行React状态更新。 这是一个no-op,但它表示应用程序中存在内存泄漏。 若要修复,请取消useEffect清理函数中的所有订阅和异步任务。在家(在app.js:21) 完成handleSubm
我有一个祖父母组件,它通过在数组上映射来呈现卡片父组件。那些家长卡上有孩子。处理表单提交功能的调用在祖父母中。我怎么知道表格来自哪位家长? 我读了好几次这篇文章来解释道具和状态之间的区别,我认为我可能需要进入状态而不是道具,但是当我在函数中,它是空的。 在我做作的例子中,我有一套猴子和一套纸杯蛋糕。纸杯蛋糕包含对猴子的引用(存储在mongodb和my state中),因此每个纸杯蛋糕都属于一只猴子
问题内容: 我有以下基于渲染下拉列表呈现用户的类。如果我选择“字母”,则将按字母顺序列出用户;当我选择“组”时,将按组顺序列出用户。 在组件中,我正在通过props.members中的函数设置组件状态对象。 当我选择“组”排序时,组件正在卸载并且正在DOM中安装。同样,当我切换回“字母”排序时,在组件中预先设置的状态变量(成员)将变为NULL,因为该组件已从DOM中删除。 重新渲染b’coz时道具
问题内容: constructor(){ super(); this.state = { address: { street:null, city:null, postalCode: null } }; } postalCodeChange(e){ this.setState.address.postalCode = e.target.value; console.log(this.state);
父组件如何与孙子组件进行状态同步
提前谢了。我有一个状态数组,如下所示。 我需要添加一个项目到状态数组,我发现我们不需要做状态突变。如何使用PrevState设置状态。 如何调用set State以追加此状态数组。 像这样的东西?