有没有办法在 React 代码中的 render 中使用 await 关键字
Is there a way to use await keyword inside render in React code
我正在尝试使用 Substrate UI 来显示我的 运行-time 模块中可用的功能。代码是用 React 编写的。我正在尝试创建一个组件来帮助我跟踪结构的所有先前状态。
runtime.template.assets(i)
调用采用十六进制值 i
作为输入,returns 结构 kitty
具有键 parent_hash
(具有十六进制值).我希望 while
循环执行直到我达到一个特殊的十六进制值,在这种情况下是 "0x11da6d1f761ddf9bdb4c9d6e5303ebd41f61858d0a5647a1a7bfe089bf921be9"
我已将其转换为 String
以实现终止条件。
请忽略 <KittyShrieks>
标签,因为我用它来显示 UI 中的一些值。基本上我无法在 while 循环内执行此操作
var kitty = await runtime.template.kitties(i);
.
.
i = kitty.parent_hash;
所需代码
export class TrackCards extends ReactiveComponent {
constructor(props) {
super(['hash'])
}
unreadyRender() {
return <span>Nothing to track</span>
}
async readyRender() {
let kitties = [];
var i = this.state.hash;
var root_hash = "0x11da6d1f761ddf9bdb4c9d6e5303ebd41f61858d0a5647a1a7bfe089bf921be9";
var root = "17,218,109,31,118,29,223,155,219,76,157,110,83,3,235,212,31,97,133,141,10,86,71,161,167,191,224,137,191,146,27,233";
var iter = 0;
var a;
while ((root != i.toString()) {
var kitty = await runtime.template.kitties(i);
kitties.push(
<div className="column" key={i}>
<KittyShrieks
owner_count = {runtime.template.kittyHistoryCount(i)}
hash_original = {this.state.hash}
/>
</div>
);
i = kitty.parent_hash;
}
return <div className="ui stackable six column grid">{kitties}</div>;
}
}
我不认为使用异步渲染是一件有效的事情,但我这样做是因为我似乎别无选择,只能使用 await keyword
。所以,问题是 UI 没有加载,我收到以下错误:
Uncaught Invariant Violation: Objects are not valid as a React child (found: [object Promise]). If you meant to render a collection of children, use an array instead.
如果我删除 async
关键字、var kitty = await runtime.template.kitties(i);
语句并在循环末尾插入 break
语句,UI 加载正常。因此,不允许我遍历循环。
我是 React 的新手,甚至 Javascript 总的来说。任何形式的帮助将不胜感激。
组件总是需要能够渲染某些东西(或null
)。在这里,实际上你要求 React 渲染一个 promise
,因此你的错误。
您应该将此逻辑提取到 componentDidMount()
生命周期中。以您的代码为例,它可能看起来像这样:
export class TrackCards extends ReactiveComponent {
constructor(props) {
super(['hash'])
this.state = {
kitties: []
}
}
async componentDidMount() {
const kitties = [];
var i = this.state.hash;
var root_hash = "0x11da6d1f761ddf9bdb4c9d6e5303ebd41f61858d0a5647a1a7bfe089bf921be9";
var root = "17,218,109,31,118,29,223,155,219,76,157,110,83,3,235,212,31,97,133,141,10,86,71,161,167,191,224,137,191,146,27,233";
var iter = 0;
var a;
while (root != i.toString()) {
var kitty = await runtime.template.kitties(i);
kitties.push(
<div className="column" key={i}>
<KittyShrieks
owner_count = {runtime.template.kittyHistoryCount(i)}
hash_original = {this.state.hash}
/>
</div>
);
i = kitty.parent_hash;
}
this.setState(
kitties
);
}
render () {
const { kitties } = this.state;
return (
kitties.length
? <div className="ui stackable six column grid">{kitties}</div>
: <span>Nothing to track</span>
)
}
}
我们最初返回 <span>Nothing to track</span>
,而您正在等待 kitties
完成。
我正在尝试使用 Substrate UI 来显示我的 运行-time 模块中可用的功能。代码是用 React 编写的。我正在尝试创建一个组件来帮助我跟踪结构的所有先前状态。
runtime.template.assets(i)
调用采用十六进制值 i
作为输入,returns 结构 kitty
具有键 parent_hash
(具有十六进制值).我希望 while
循环执行直到我达到一个特殊的十六进制值,在这种情况下是 "0x11da6d1f761ddf9bdb4c9d6e5303ebd41f61858d0a5647a1a7bfe089bf921be9"
我已将其转换为 String
以实现终止条件。
请忽略 <KittyShrieks>
标签,因为我用它来显示 UI 中的一些值。基本上我无法在 while 循环内执行此操作
var kitty = await runtime.template.kitties(i);
.
.
i = kitty.parent_hash;
所需代码
export class TrackCards extends ReactiveComponent {
constructor(props) {
super(['hash'])
}
unreadyRender() {
return <span>Nothing to track</span>
}
async readyRender() {
let kitties = [];
var i = this.state.hash;
var root_hash = "0x11da6d1f761ddf9bdb4c9d6e5303ebd41f61858d0a5647a1a7bfe089bf921be9";
var root = "17,218,109,31,118,29,223,155,219,76,157,110,83,3,235,212,31,97,133,141,10,86,71,161,167,191,224,137,191,146,27,233";
var iter = 0;
var a;
while ((root != i.toString()) {
var kitty = await runtime.template.kitties(i);
kitties.push(
<div className="column" key={i}>
<KittyShrieks
owner_count = {runtime.template.kittyHistoryCount(i)}
hash_original = {this.state.hash}
/>
</div>
);
i = kitty.parent_hash;
}
return <div className="ui stackable six column grid">{kitties}</div>;
}
}
我不认为使用异步渲染是一件有效的事情,但我这样做是因为我似乎别无选择,只能使用 await keyword
。所以,问题是 UI 没有加载,我收到以下错误:
Uncaught Invariant Violation: Objects are not valid as a React child (found: [object Promise]). If you meant to render a collection of children, use an array instead.
如果我删除 async
关键字、var kitty = await runtime.template.kitties(i);
语句并在循环末尾插入 break
语句,UI 加载正常。因此,不允许我遍历循环。
我是 React 的新手,甚至 Javascript 总的来说。任何形式的帮助将不胜感激。
组件总是需要能够渲染某些东西(或null
)。在这里,实际上你要求 React 渲染一个 promise
,因此你的错误。
您应该将此逻辑提取到 componentDidMount()
生命周期中。以您的代码为例,它可能看起来像这样:
export class TrackCards extends ReactiveComponent {
constructor(props) {
super(['hash'])
this.state = {
kitties: []
}
}
async componentDidMount() {
const kitties = [];
var i = this.state.hash;
var root_hash = "0x11da6d1f761ddf9bdb4c9d6e5303ebd41f61858d0a5647a1a7bfe089bf921be9";
var root = "17,218,109,31,118,29,223,155,219,76,157,110,83,3,235,212,31,97,133,141,10,86,71,161,167,191,224,137,191,146,27,233";
var iter = 0;
var a;
while (root != i.toString()) {
var kitty = await runtime.template.kitties(i);
kitties.push(
<div className="column" key={i}>
<KittyShrieks
owner_count = {runtime.template.kittyHistoryCount(i)}
hash_original = {this.state.hash}
/>
</div>
);
i = kitty.parent_hash;
}
this.setState(
kitties
);
}
render () {
const { kitties } = this.state;
return (
kitties.length
? <div className="ui stackable six column grid">{kitties}</div>
: <span>Nothing to track</span>
)
}
}
我们最初返回 <span>Nothing to track</span>
,而您正在等待 kitties
完成。