对象作为 React 子对象无效。如果您打算渲染一组子项,请改用数组 - 错误 Solidity - React

Posted

技术标签:

【中文标题】对象作为 React 子对象无效。如果您打算渲染一组子项,请改用数组 - 错误 Solidity - React【英文标题】:Objects are not valid as a React child. If you meant to render a collection of children, use an array instead - Error Solidity - React 【发布时间】:2020-07-31 14:16:45 【问题描述】:

我正在开发一个带有 ReactJS 和 solidity 的文档验证系统 - 智能合约。我想在前端显示我的智能合约 get().call() 方法的结果,带有弹出窗口甚至是简单的文本。我现在面临的问题是,当我尝试显示该方法的响应时,它会向我抛出该错误:

对象作为 React 子级无效。如果您打算渲染一组子项,请改用数组

这是我的solidity合约的代码:

pragma solidity ^0.5.0;
contract Proof1 
  struct FileDetails 
    uint256 timestamp;
    string owner;
  
  mapping(string => FileDetails) files;
  event logFileAddedStatus(
    bool status,
    uint256 timestamp,
    string owner,
    string fileHash
);

function set(string memory owner, string memory fileHash) public 
  if (files[fileHash].timestamp == 0) 
    files[fileHash] = FileDetails(block.timestamp, owner);

    emit logFileAddedStatus(true, block.timestamp, owner, fileHash);
   else 
    emit logFileAddedStatus(false, block.timestamp, owner, fileHash);
  


function get(string memory fileHash)
public
view
returns (uint256 timestamp, string memory owner)

  return (files[fileHash].timestamp, files[fileHash].owner);

这里是 onClick 方法中的.get().call() 方法:

onSubmitGet = async (event) => 
  event.preventDefault();
  const hash = document.getElementById("hash").value;

  this.state.design = await this.state.contract.methods
    .get(hash)
    .call( from: this.state.address )
    .then((res) => this.setState( result: res ));
;

这就是我使用 React 显示结果的方式:

const  result  = this.state;

<div>result</div>

【问题讨论】:

您应该将代码发布为文本而不是屏幕截图。我认为这就是为什么你的票数被否决的原因。 非常感谢您的帮助! 试试console.log(result) 看看它是什么类型的对象。它必须是一个字符串,null 或一个反应组件实例。如果不是,那么让它成为其中之一,它应该可以工作...... 如果我做这样的事情:(result: JSON.stringify(res)) 它会以 json 格式返回给我并显示它。这里的问题是我不想作为 json 我想找到其他方式来显示它。 【参考方案1】:

我不知道你为什么写下面的代码:

this.state.design = await this.state.contract.methods

ReactJS 没有two-way-data-binding,ReactJS 不像 VueJS 或 Angular,要更改状态,您应该使用 this.setStateuseStatethis.state.design = 永远不会改变任何状态。

现在回答你的问题。为结果设置初始状态,如下所示:

this.state = 
  result: undefined,
;

然后在 JSX 中编写如下:

const  result  = this.state;

<div>
  result && result.map((item, index) => (
    <div key=item.uniqueThing>item.title</div>
  ))
</div>

其实你不需要index,我只是想知道你可以拥有它。即使你可以写得更好:

const  result  = this.state;

<div>
  result && result.map(( title, uniqueThing ) => (
    <div key=uniqueThing>title</div>
  ))
</div>

注意:你一定要把key传递给map回调函数返回的第一个JSX元素,而且应该是唯一的,请不要使用index,它的代价很糟糕让 ReactJS 处理它有时可能会陷入严重的错误。

【讨论】:

感谢您的回答,但我完全按照您对我说的做了,但仍然无法正常工作。它向我抛出了这个错误:未处理的拒绝(TypeError):result.map 不是函数。有什么我需要改变的吗? @ThanasisDes,这意味着您的 ajax 请求不返回数组。 map 函数仅在数组下可用。 我在问题末尾添加了屏幕截图。您可以点击阅读。 @ThanasisDes,很明显这不是一个数组,它是一个对象。 API 设计不太好,后端开发者可以将0, 1 键作为数组传递并与timestamp 分开,你能改变后端的API 响应吗?

以上是关于对象作为 React 子对象无效。如果您打算渲染一组子项,请改用数组 - 错误 Solidity - React的主要内容,如果未能解决你的问题,请参考以下文章

对象作为 React 子对象无效(找到:带键的对象)。如果您打算渲染一组孩子,请改用数组

React 错误:对象作为 React 子级无效,如果您打算渲染子级集合,请改用数组

错误:对象作为 React 子项无效(找到:带有键 的对象)。如果您打算渲染一组孩子,请改用数组

对象作为 React 子级无效。如果您打算渲染一组孩子,请改用数组 - FlatList

对象作为 React 子对象无效(找到:带键的对象$$typeof,render)。如果您要渲染子对象的集合,请改用数组

对象作为 React 子级无效如果您要渲染子级集合,请改用数组