【问题标题】:TypeError: prevState.blockHash is not iterableTypeError:prevState.blockHash 不可迭代
【发布时间】:2020-04-15 21:15:24
【问题描述】:

我试图更新存储在数组中的对象。但得到 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: 0
transactionIndex: 0
transactionHash: "0x94f6d8671988ceb8ef1da862257637a198f4afefc3aef6cf3eb992dfcafb0eb1"
blockHash: "0xd26937f8535a335663c9af57335f7cc783aba0e9e376408cbb92c1b3f1b28166"
blockNumber: 20
address: "0x20B40e09b75a21E0B857F695dE5De92a5A5b5AD0"
type: "mined"
id: "log_0d967aac"
returnValues: Result
0: "1"
1: "bhavin"
2: "masterpiece"
3: "1000000000000000000"
4: "100"
5: "200"
6: "blah blah blah!!"
7: "0x04f78093E2a1C07BF6c4527Aaa00807d3132A1Df"
8: false
id: "1"
Artistname: "bhavin"
Artname: "masterpiece"
price: "1000000000000000000"
width: "100"
height: "200"
Description: "blah blah blah!!"
owner: "0x04f78093E2a1C07BF6c4527Aaa00807d3132A1Df"
purchased: false
__proto__: Object
event: "Artworkcreated"
signature: "0xf912339172a3b7eda9cb10ecdef181d10a74fc4411fe5d7e62f550ef3698d845"
raw: {data: "0x000000000000000000000000000000000000000000000000…16820626c6168212100000000000000000000000000000000", topics: Array(4)}
__proto__: Object

我需要将一个字符串推送到数组blockHash。

【问题讨论】:

  • this.setState(this.initialState) 对您的状态形状有什么作用?
  • componentWillMount() { this.initialState = this.state } 用作清除存储值的重置。

标签: javascript arrays json reactjs solidity


【解决方案1】:

您的整个 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]
  }],
}));

【讨论】:

  • 感谢您的快速回复,会通知您
  • 不幸的是,这不能正常工作。我正在尝试将字符串从 ABI 推送到数组 blockHash。
  • @DaveBhavin 我明白了,我想我可能知道但还有另一个问题。 fido 是一个数组,是否会向 it 添加新元素?
  • 没有 fido 是静态的,没有添加任何元素,但是在 fido 中,(即数组 blockHash)数组使用来自 ABI 响应的新元素进行更新。
【解决方案2】:

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

【讨论】:

  • 谢谢。是的,情况可能就是这样。能否请您详细说明一下,因为我仍然坚持使用与解决此问题相关的任何链接,将不胜感激。
猜你喜欢
  • 2019-08-15
  • 2011-02-18
  • 2017-02-21
  • 2015-03-06
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多