【发布时间】:2021-03-15 23:50:17
【问题描述】:
我一直在挠头试图弄清楚这一点,尝试了我能想到/在网上找到的所有东西,但没有运气。 当组件挂载时,我从 API 中检索一个列表,对其进行解析并将其推送到我所在州的另一个数组中。我检查了 api,它工作正常,我得到数据,在调试时我看到逻辑运行正常,我的控制台日志按预期触发。我看到的唯一问题是渲染。
我正在 ComponentDidMount 中进行以下调用:
ScheduleService.getScheduleList().then((response) =>
response.data.scheduleList.forEach((schedule: any, index: any) =>
this.state.nodes?.push({
id: index,
label: (
<div onClick={(e) => this.handleScheduleClick(e)}>
<Tooltip2
content={
"Start: " +
schedule.startTime.utc +
" Stop: " +
schedule.stopTime.utc +
" Type: " +
schedule.scheduleType
}
placement="right"
>
{schedule.id}
</Tooltip2>
</div>
),
isExpanded: false,
icon: "document",
})
)
);
我尝试在回调中添加此调用.. 不走运。尝试将值分配给数组并随后更新状态,结果相同。
当我第一次单击路由器并进入页面时,我的树没有填充。 Data not rendered
但在我立即切换回此页面后,我的数据呈现出来。
我知道每次状态更改时 React 都会更新组件,但我不明白为什么现在没有发生。
也试过运行this.forceUpdate(),结果一样。
非常感谢您的帮助!
编辑 1: 我在下面写了我正在使用的逻辑。
public state: IState= {
nodes: ITreeNode[],
}
class MyClass extends React.Component<IState> {
public componentDidMount(){
this.getScheduleList();
}
private getScheduleList = () => {
ScheduleService.getScheduleList().then((response) =>
response.data.scheduleList.forEach((schedule: any, index: any) =>
this.state.nodes?.push({
id: index,
label: (
<div onClick={(e) => this.handleScheduleClick(e)}>
<Tooltip2
content={
"Start: " +
schedule.startTime.utc +
" Stop: " +
schedule.stopTime.utc +
" Type: " +
schedule.scheduleType
}
placement="right"
>
{schedule.id}
</Tooltip2>
</div>
),
isExpanded: false,
icon: "document",
})
)
);
public render() {
return (
<div>
<Tree
contents={this.state.nodes}
className={
" focus-panelsList focus-panelsList-noborder"
}
/>
</div>
}
)
【问题讨论】:
-
this.state.nodes.push({})是一个状态突变,this.setState(this.state)似乎是一个无用的更新。您只是想填充this.state.nodes状态吗?能否提供更全面的代码示例? -
我已经编辑了帖子并为我正在尝试的更新方法添加了整个逻辑。我有一个节点列表的接口,我正在将数据推送到我在状态中设置的列表中。我将该节点列表传递给 BlueprintJS 树。
-
你真的不应该将 React 组件存储在状态中,这是拥有陈旧状态/回调外壳的可靠方法。它应该是 just 数据,然后在渲染时将数据映射到 JSX。你真正想做什么?你能提供一个Minimal, Complete, and Reproducible Code Example吗?
-
现在编辑帖子。
-
@DrewReese 我已经用我正在使用的逻辑更新了代码。不要认为我拥有的其他代码会影响这一点。至于 JSX 部分,我正在使用一个库并按照他们的示例进行操作。到目前为止,我不知道如何将 JSX 注入该树中,该组件不是由我构建的。
标签: reactjs typescript