【发布时间】:2020-07-22 17:50:17
【问题描述】:
我有一个这样的函数,这个函数的目的是创建一个交易列表并返回它们,这个函数一切都很好。没有错误。
function ListTX() {
(async () => {
const arweave = Arweave.init();
var address = window.sessionStorage.getItem("WalletAddress");
const txids = await arweave.arql({
op: 'and',
expr1:
{
op: 'equals',
expr1: 'from',
expr2: address
},
expr2:
{
op: 'equals',
expr1: 'App-Name',
expr2: 'arshard'
}
})
console.log(txids);
const all_transactions = txids.map((transaction, idx) => {
return <li key={idx}>{transaction}</li>;
});
console.log(all_transactions);
return (
<ul>
{all_transactions}
</ul>
);
})();
}
即使all_transactions 不为空,React 也不会渲染它。同样的事情实际上适用于普通功能。
return (
<div>
<Header/>
<main>
<article>
{ListTX()}
</article>
</main>
</div>
);
这是完整的课程:
class Construct extends React.Component {
render() {
if (window.sessionStorage.getItem("wallet")) {
function ListTX() {
(async () => {
const arweave = Arweave.init();
var address = window.sessionStorage.getItem("WalletAddress");
const txids = await arweave.arql({
op: 'and',
expr1:
{
op: 'equals',
expr1: 'from',
expr2: address
},
expr2:
{
op: 'equals',
expr1: 'App-Name',
expr2: 'arshard'
}
})
console.log(txids);
const all_transactions = txids.map((transaction, idx) => {
return <li key={idx}>{transaction}</li>;
});
console.log(all_transactions);
})();
return (
<ul>
{all_transactions}
</ul>
);
}
return (
<div>
<Header/>
<main>
<article>
{ListTX()}
</article>
</main>
</div>
);
}
else {
return (<Redirect to="/upload_wallet"/>);
}
};
};
}
export default Construct;
这就是console.log(all_transactions) 返回的内容:
[
{
"type": "li",
"key": "0",
"ref": null,
"props": {
"children": "QWCFEHGEa0Lf2zywL_nBYmnEXhG3hLqyFcxQykhJhAc"
},
"_owner": null,
"_store": {}
},
{
"type": "li",
"key": "1",
"ref": null,
"props": {
"children": "cbVaHaRayhOkXR0lLL_1KFNnbyP8EEAWVQIGSKxo_2Y"
},
"_owner": null,
"_store": {}
},
{
"type": "li",
"key": "2",
"ref": null,
"props": {
"children": "gOrpgD3cVNEzf-u2fqI4KI5G49qaBA9jMwq-VMiQp_Q"
},
"_owner": null,
"_store": {}
},
{
"type": "li",
"key": "3",
"ref": null,
"props": {
"children": "PYT3WoT5dtzhyxjCQ_2dn-8ZJCqEtfZBI4-RaWJCBks"
},
"_owner": null,
"_store": {}
},
{
"type": "li",
"key": "4",
"ref": null,
"props": {
"children": "HJymy5uP2sqTwX5nbbzuqEXMyXliwodpIgjT5s0puxI"
},
"_owner": null,
"_store": {}
}
]
如果我这样做,它会起作用
if (window.sessionStorage.getItem("wallet")) {
function ListTX() {
(async () => {
const arweave = Arweave.init();
var address = window.sessionStorage.getItem("WalletAddress");
const txids = await arweave.arql({
op: 'and',
expr1:
{
op: 'equals',
expr1: 'from',
expr2: address
},
expr2:
{
op: 'equals',
expr1: 'App-Name',
expr2: 'arshard'
}
})
console.log(txids);
const all_transactions = txids.map((transaction, idx) => {
return <li key={idx}>{transaction}</li>;
});
console.log(all_transactions);
})();
return (
<p>
test
</p>
);
}
并且测试是写在网页上的。这就是为什么我怀疑它与异步函数有关,如果我尝试在异步中做同样的事情,它就不起作用。
在我们的外部函数ListTX() 中,渲染这个列表的真正方法是什么?
【问题讨论】:
-
不应该等待异步吗?你错过了
await。另外,我的建议是将您的逻辑拆分为 1)获取数据(异步)。 2) 从数据创建 JSX。然后一旦收到数据,将其设置为状态,它应该可以正常工作 -
我不知道我是否应该等待,但
await不适用于return(); -
渲染函数应该是一个基于 state 和 props 的纯函数。 Api 调用和其他有副作用的东西不应该在 render 中。在其中一种生命周期方法(例如,componentDidMount())中获取您的事务,然后将返回的数据设置为状态。
-
return将返回它。由于它是一个异步函数,因此存在延迟返回。因此,ListTX()在正常上下文中返回未定义。但是如果你让你的代码等待,它会得到正确的 JSX。但是,它不推荐。 -
为什么
ListTX()会返回未定义?我尝试了与return(<p>test</p>);之类的普通函数 without list 相同的方法,它确实有效。
标签: javascript reactjs