Ошибка типа: prevState.blockHa sh не повторяется - PullRequest
0 голосов
/ 16 апреля 2020

Я пытался обновить объекты, хранящиеся в массиве. но получение TypeError: prevState.blockHa sh не повторяется. вот мой конструктор

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

Мне нужно в pu sh строку в массив blockHa sh.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Ваш обратный вызов всей карты fido неверен, он должен принимать функцию, вы передаете объект.

this.setState(prevState =>({
  fido:[...prevState.fido.map({blockHash: [
    ...prevState.blockHash,   
    event.blockHash        
  ]} )]}));
})

Правильный синтаксис: map((current, index, originalArray) => {...}).

Но я не Не думаю, что вам нужно что-то отображать, я думаю, вам просто нужно расширить массив фидо предыдущего состояния и добавить новый элемент

this.setState(prevState =>({
  fido:[...prevState.fido, event.blockHash]
}));

Редактировать 1

Так как fido is stati c, как вы говорите, я предлагаю вместо этого просто сохранить его свойства в объекте, как вы делаете это с ним в настоящее время как элемент в массиве.

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]
  },
}));

OF C, если вы хотите / должны оставить его как есть, вам нужно правильно получить доступ к элементу

this.setState(prevState =>({
  fido: [{
    ...prevState.fido[0],
    blockHash: [...prevState.fido[0].blockHash, event.blockHash]
  }],
}));
0 голосов
/ 16 апреля 2020

blockHash не существует в состоянии, он существует только в объектах state.fido. В вашем setState вам необходимо получить доступ к blockHash из каждого элемента fido, а не к нему из общего состояния.

...