将对象推入数组中的概念问题

时间:2019-10-02 11:55:14

标签: javascript reactjs

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

取消注释s的push语句(即this.state.products)时,该产品在屏幕上显示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);

  });

};

2 个答案:

答案 0 :(得分:1)

您以错误的方式设置了状态。您应该在回调函数中设置状态。

WebDriverWait wait = new WebDriverWait(driver, 10);

List<WebElement> list = driver.findElements(By.xpath("//div[contains(@class,'menuRoot')]//ul//li//a"));

System.out.println(list.size());

for(int i=0;i<list.size();i++) {

    System.out.println(list.get(i).getText());

    if(list.get(i).getText().equals("Workflow")) {          

        //driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 

        wait.until(
            ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[1]/ul/li[5]/a"))
        );

        list.get(i).click();
        break;

    }

}

答案 1 :(得分:0)

切勿直接更改状态,而应使用setState

通过进行j.push(res.data);,您基本上就在进行this.state.admin.push(res.data),因为变量分配在Javascript上起作用。

因此,您正在更改状态,您应该直接绝对不要进行更改,因为在this.state.admin数组中推送新项不会替换基础数组。

好读的书:https://medium.com/pro-react/a-brief-talk-about-immutability-and-react-s-helpers-70919ab8ae7c