Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript TypeError:prevState.blockHash不可编辑_Javascript_Arrays_Json_Reactjs_Solidity - Fatal编程技术网

Javascript TypeError:prevState.blockHash不可编辑

Javascript TypeError:prevState.blockHash不可编辑,javascript,arrays,json,reactjs,solidity,Javascript,Arrays,Json,Reactjs,Solidity,我试图更新存储在数组中的对象。但是获取TypeError:prevState.blockHash不可编辑。 这是我的构造函数 constructor(props) { super(props) this.state = { dir:"", account: '', name: [], fido: [{ logIndex: [], transactionIndex: [], transactionHash: [],

我试图更新存储在数组中的对象。但是获取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

我需要将字符串推送到数组块哈希。

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

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

您的整个fido映射回调不正确,它应该接受一个函数,您正在传递一个对象

this.setState(prevState =>({
  fido:[...prevState.fido.map({blockHash: [
    ...prevState.blockHash,   
    event.blockHash        
  ]} )]}));
})
正确的语法是
map((当前、索引、原始数组)=>{…})

但是我不认为您需要映射任何东西,我认为您只需要扩展前一个州的fido数组并添加新元素

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

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

this.state = {
  dir:"",
  account: '',
  name: [],
  fido: {
    logIndex: [],
    transactionIndex: [],
    transactionHash: [],
    blockHash: []
  },
  loading: true
}
现在,在更新fido状态时,使用新元素将
块散列
数组分散到上一个状态

this.setState(prevState =>({
  fido:[...prevState.fido, event.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]
  }],
}));

您的整个fido映射回调都不正确,它应该接受一个函数,您正在传递一个对象

this.setState(prevState =>({
  fido:[...prevState.fido.map({blockHash: [
    ...prevState.blockHash,   
    event.blockHash        
  ]} )]}));
})
正确的语法是
map((当前、索引、原始数组)=>{…})

但是我不认为您需要映射任何东西,我认为您只需要扩展前一个州的fido数组并添加新元素

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

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

this.state = {
  dir:"",
  account: '',
  name: [],
  fido: {
    logIndex: [],
    transactionIndex: [],
    transactionHash: [],
    blockHash: []
  },
  loading: true
}
现在,在更新fido状态时,使用新元素将
块散列
数组分散到上一个状态

this.setState(prevState =>({
  fido:[...prevState.fido, event.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]
  }],
}));

this.setState(this.initialState)
对您的状态形状有什么作用?
componentWillMount(){this.initialState=this.state}
是重置以清除存储值。this.setState(this.initialState)
对您的状态形状有什么作用?
componentWillMount(){this.initialState=this.state}
用于重置以清除存储值。谢谢。是的,可能是这样。你能详细说明一下吗,因为我仍然坚持这个问题,任何与解决这个问题相关的链接都将不胜感激。谢谢。是的,可能是这样。请您详细说明,因为我仍然被困在这个任何有关解决这个问题的链接,将不胜感激。感谢您的快速响应,将让您知道不幸的是,这并没有工作,因为它应该。我正试图将一个字符串从ABI推送到数组块哈希。@DaveBhavin我明白了,我想我可能知道,但还有一个问题
fido
是一个数组,是否向其中添加了新元素?没有fido是静态的,没有添加元素,但在fido中,(即数组块哈希)数组使用ABI响应中的新元素进行更新。感谢快速响应,这将让您知道不幸的是,这并没有按预期工作。我正试图将一个字符串从ABI推送到数组块哈希。@DaveBhavin我明白了,我想我可能知道,但还有一个问题
fido
是一个数组,是否向其中添加了新元素?没有fido是静态的,没有添加元素,但在fido中,(即数组块散列),使用ABI响应中的新元素更新数组。