我是React的新手,我在这段代码中遇到了一个问题:
class Tests extends React.Component {
async getTests() {
var url = "http://127.0.0.1:100/getTestList"
var buttons=[];
const resp = await fetch(url);
const data = await resp.json();
for(let pkg in data){
console.log(pkg);
for (let cls in data[pkg]){
console.log(cls);
for (var i = 0; i < data[pkg][cls].length; i++) {
let m= data[pkg][cls][i];
buttons.push(<button value={cls}>{m}</button>);
}
}
}
return buttons;
}
render(){
return(
<div>
<h4>Using .map()</h4>
{this.getTests()}
</div>
)
}
}//fine classe
// ========================================
ReactDOM.render(
<Tests />,
document.getElementById('root')
);
我从POST服务中正确地获取JSON响应,正确地迭代JSON以获得一个包含值和文本的按钮数组,但我在Chrome上遇到了这个错误:
错误:对象作为React子对象无效(找到:[object Promise])。如果你想呈现一个子级集合,请使用数组代替。in div(at src/index.js:95)in Tests(at src/index.js:108)
一些提示?谢谢
3条答案
按热度按时间jhiyze9q1#
在这种情况下,我将使用一个带有
useState
和useEffect
的函数组件。在useEffect
中,您可以从端点获取数据,然后使用.map()
,您可以从useState
示例化的数组中表示按钮。请参阅以下可能解决此问题的解决方案:
我希望这对你有帮助!
c7rzv4ha2#
getTests()
是一个异步函数,它总是返回一个promise对象。React正在抱怨,因为你正在向render方法传递一个promise对象。你可以将API响应存储在一个状态中,并在
getTests
方法中设置这个状态。React将在状态更新时更新ui
。代码中的一些变化。
1.创建状态
1.运行
getTests()
incomponentDidMount
方法。1.循环遍历render方法中的值。
示例:
或者您可以使用一个功能组件来实现这一点。
3phpmpom3#
该错误是预期的。getTest方法从代码中返回一个按钮数组。不能从react组件渲染数组或对象。
相反你可以
1.使按钮成为状态变量,
1.在getTest方法中准备一个本地数组后设置状态。
1.使用math方法渲染你在数组中定义的按钮标签。