Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在数组中推送对象的概念问题_Javascript_Reactjs - Fatal编程技术网

Javascript 在数组中推送对象的概念问题

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

我有两个名为products和admin的数组。在AddInfo函数中,我分别使用s&j等于products和admin。现在,在push语句上方的console.log语句中,控制台中数组的长度相等,在push语句之后,数组的长度也相等,即使产品的push语句已被注释掉

在取消s.e.this.state.products的push语句的注释时,该产品在屏幕上显示了2次,但是,它只在数据库中添加了一次,并且在刷新其中一个副本时会自动删除,这很奇怪

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,对吗?