如何在Reactjs中使用setState映射更新对象

时间:2019-04-24 14:10:07

标签: reactjs

我处于这种状态:

state = {
  formdata:{
    name: null,
    about: null,
    price: null,
    offerPrice:null,
    playStoreUrl:null,
    appStoreUrl:null ,
    photo:null, 
  }
}

我想要的:模态内部的更新表单我用它来更新产品。我在componentWillReceiveProps内使用了新道具  我做到了:

componentWillReceiveProps(nextProps){
  let Updateproduct = nextProps.productlist.productlist.Products;    
  Updateproduct.map((item,i) => {
    let formdata  = Object.assign({}, this.state.formdata); 

    formdata.name = item.name 
    formdata.about = item.about 
    formdata.price = item.price 
    formdata.offerPrice = item.offerPrice 
    formdata.playStoreUrl = item.playStoreUrl 
    formdata.appStoreUrl = item.appStoreUrl
    formdata.photo = item.photo

    console.log(formdata)
    this.setState({formdata})

  })
}

MyProblem::这填充了对象,但仅以模态内部的形式,当单击以更新任何产品时,我看到的不是模态中的最后一个产品。 注意: Updateproduct包含:

{
  about: "about product1"
  appStoreUrl: "https://itunes.apple.com/us/app/snapchat/id447188370?mt=8"
  name: "p1"
  offerPrice: 99.99
  photo: "images/products/"
  playStoreUrl: "images/products/"
  price: 1000
}
{
  about: "about product2"
  appStoreUrl: "https://itunes.apple.com/us/app/snapchat/id447188370?mt=8"
  name: "p2"
  offerPrice: 99.99
  photo: "images/products/"
  playStoreUrl: "images/products/"
  price: 2000
}

3 个答案:

答案 0 :(得分:1)

问题是,您希望将用户单击的单个特定产品项存储在状态变量中,但是使用当前代码,您始终将存储最后一个产品项。同样,setState循环不是一个好方法。

要解决此问题,请仅在onClick处理程序函数内部而不是componentWillReceiveProps方法中以状态存储单击的产品详细信息。为此,您需要将产品ID与onClick函数绑定。

赞:

onClick={this.getProductId.bind(this, item.id)}

// click handler function
getProductId = (id) => {
  let productObj = {};
  let Updateproduct = this.props.productlist.productlist.Products;
  Updateproduct.forEach((item,i) => {
    if(item.id == id) {
      productObj = {
        name: item.name,
        about: item.about,
        price: item.price,
        offerPrice: item.offerPrice,
        playStoreUrl: item.playStoreUrl,
        appStoreUrl: item.appStoreUrl,
        photo: item.photo
      };
      this.setState({ formdata: productObj, id: id })
    }
  })
}

答案 1 :(得分:0)

I think that's because your setState() call is in the wrong place (and only one object at a time):

let data =[];
UpdateProduct.map((item, i) => {
  let formdata = null;
  // do your formdata stuff but append it as part of an array
  data.push(formdata);
});
this.setState({ formdata: data });

Then I think it should get all the products.

答案 2 :(得分:0)

您正在地图内设置状态。如果您将地图视为一个循环,则意味着每次迭代都将其覆盖。因此,您只会显示最后一个。