为了账号安全,请及时绑定邮箱和手机立即绑定

TypeError:prevState.blockHash 不可迭代

TypeError:prevState.blockHash 不可迭代

红颜莎娜 2022-07-01 16:55:40
我试图更新存储在数组中的对象。但得到 TypeError: prevState.blockHash 是不可迭代的。这是我的构造函数constructor(props) {  super(props)  this.state = {    dir:"",    account: '',    name: [],    fido: [{      logIndex: [],      transactionIndex: [],      transactionHash: [],      blockHash: []    }],    loading: true  }我以这种方式设置状态-showusingBot= () => {  this.setState(this.initialState)  this.state.instance.events.Artworkcreated({    filter: { purchased: false},    fromBlock: 0  }).on('data', event => {    this.setState(prevState =>({      fido:[...prevState.fido.map({blockHash: [        ...prevState.blockHash,           event.blockHash              ]} )]}));    })  }我在控制台上的 ABI 响应如下。{logIndex: 0, transactionIndex: 0, transactionHash: "0x94f6d8671988ceb8ef1da862257637a198f4afefc3aef6cf3eb992dfcafb0eb1", blockHash: "0xd26937f8535a335663c9af57335f7cc783aba0e9e376408cbb92c1b3f1b28166", blockNumber: 20, …}logIndex: 0transactionIndex: 0transactionHash: "0x94f6d8671988ceb8ef1da862257637a198f4afefc3aef6cf3eb992dfcafb0eb1"blockHash: "0xd26937f8535a335663c9af57335f7cc783aba0e9e376408cbb92c1b3f1b28166"blockNumber: 20address: "0x20B40e09b75a21E0B857F695dE5De92a5A5b5AD0"type: "mined"id: "log_0d967aac"returnValues: Result0: "1"1: "bhavin"2: "masterpiece"3: "1000000000000000000"4: "100"5: "200"6: "blah blah blah!!"7: "0x04f78093E2a1C07BF6c4527Aaa00807d3132A1Df"8: falseid: "1"Artistname: "bhavin"Artname: "masterpiece"price: "1000000000000000000"width: "100"height: "200"Description: "blah blah blah!!"owner: "0x04f78093E2a1C07BF6c4527Aaa00807d3132A1Df"purchased: false__proto__: Objectevent: "Artworkcreated"signature: "0xf912339172a3b7eda9cb10ecdef181d10a74fc4411fe5d7e62f550ef3698d845"raw: {data: "0x000000000000000000000000000000000000000000000000…16820626c6168212100000000000000000000000000000000", topics: Array(4)}__proto__: Object我需要将一个字符串推送到数组blockHash。
查看完整描述

2 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

您的整个 fido 地图回调不正确,它应该采用一个函数,您正在传递一个对象。


this.setState(prevState =>({

  fido:[...prevState.fido.map({blockHash: [

    ...prevState.blockHash,   

    event.blockHash        

  ]} )]}));

})

正确的语法是map((current, index, originalArray) => {...}).


但我认为你不需要映射任何东西,我认为你只需要传播之前状态的 fido 数组并添加新元素


this.setState(prevState =>({

  fido:[...prevState.fido, event.blockHash]

}));

编辑 1


正如您所说,由于fido是静态的,因此我建议将其属性存储在一个对象中,就像您当前将其作为数组中的一个元素一样。


this.state = {

  dir:"",

  account: '',

  name: [],

  fido: {

    logIndex: [],

    transactionIndex: [],

    transactionHash: [],

    blockHash: []

  },

  loading: true

}

现在,当更新 fido 状态时,在之前的状态和带有新元素的blockHash数组中传播


this.setState(prevState =>({

  fido: {

    ...prevState.fido,

    blockHash: [...prevState.fido.blockHash, event.blockHash]

  },

}));

OFC,如果您想要/需要保持原样,您需要正确访问该元素


this.setState(prevState =>({

  fido: [{

    ...prevState.fido[0],

    blockHash: [...prevState.fido[0].blockHash, event.blockHash]

  }],

}));


查看完整回答
反对 回复 2022-07-01
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

blockHash不存在于状态中,它只存在于 的对象中state.fido。在您的情况setState下,您需要blockHash从每个元素访问,fido而不是从整体状态访问它。



查看完整回答
反对 回复 2022-07-01
  • 2 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号