Javascript 在数组中推送对象的概念问题
我有两个名为products和admin的数组。在AddInfo函数中,我分别使用s&j等于products和admin。现在,在push语句上方的console.log语句中,控制台中数组的长度相等,在push语句之后,数组的长度也相等,即使产品的push语句已被注释掉 在取消s.e.this.state.products的push语句的注释时,该产品在屏幕上显示了2次,但是,它只在数据库中添加了一次,并且在刷新其中一个副本时会自动删除,这很奇怪Javascript 在数组中推送对象的概念问题,javascript,reactjs,Javascript,Reactjs,我有两个名为products和admin的数组。在AddInfo函数中,我分别使用s&j等于products和admin。现在,在push语句上方的console.log语句中,控制台中数组的长度相等,在push语句之后,数组的长度也相等,即使产品的push语句已被注释掉 在取消s.e.this.state.products的push语句的注释时,该产品在屏幕上显示了2次,但是,它只在数据库中添加了一次,并且在刷新其中一个副本时会自动删除,这很奇怪 AddInfo(info){ let s
AddInfo(info){
let s = this.state.products;
let j = this.state.admin;
let obj ={name:info.productName};
axios.post('http://localhost:5000/admin',obj).then((res)=>{
if (info.productName !== "") {
console.log(this.state.products);
console.log(this.state.admin);
// s.push(res.data);
j.push(res.data);
console.log(this.state.products);
console.log(this.state.admin);
this.setState({
products:s,
admin:j
})
} else {
alert("Please fill all the fields.")
}
console.log("Products",this.state.products,res.data);
});
};
您将状态设置为错误的方式。。您应该在回调函数中设置状态
const newProduct ={...};
this.setstate(st => ({
products: [...st, newProduct]
}));
切勿直接更改状态,请改用setState。
通过做j.pushres.data;您基本上是这样做的。state.admin.pushres.data是因为变量赋值在Javascript上的工作方式
因此,您正在改变状态,您永远不应该直接这样做,因为在this.state.admin数组上推送新项不会替换基础数组
好的阅读:在push语句之后,即使产品的push语句已被注释掉,它也是相等的。-然后this.state.products===this.state.admin您分别在s和j中制作products和admin的副本。但在按下后,您将再次打印实际状态,而不是复制的状态,因此您将获得相同的值,但该值将添加到复制的数组中。推送后应打印复制的数组,并检查是否获得正确的值。正在将中的对象添加到两个状态数组中。我的意思是变量s没有被使用,并且仍然添加了一个对象。在前2个console.log语句中,这两个数组的长度都是0。在添加一个对象时,这两个对象的长度都变为1,这很奇怪,因为我甚至没有推送该对象。尽管如此,注释s.push语句已经为我解决了所有问题,但是为什么当我注释s.e.this.state.products的推送语句时,一切都正常工作,即this.state.admin的副本,更新它,不应该对国家有任何影响吗?如果执行j.push改变了状态或者像你说的那样改变了状态,那么这里就不应该使用setState,对吗?