【问题标题】:React/TypeScript/SPFx forEach and map function issues with complex objectsReact/TypeScript/SPFx forEach 和复杂对象的映射函数问题
【发布时间】:2019-11-13 20:18:00
【问题描述】:

我在使用动态 UI 渲染 React 时遇到问题。

我发现我的一个组件行为不端。

我有一个具有数组属性的对象,我通过 props 获得。

对象类似如下

对象:

{
  title: "title",
  id: 0,
  rTimes: [
  { idH: 0, hours: 2 }, 
  { idH: 1, hours: 3 }, 
  { idH: 2, hours: 1 }]
};

如果我使用 console.log() 记录对象,它会显示正确的输出,但如果我在 hours 数组上使用 forEach 进行迭代,它会变得很奇怪。

this.props.Obj.rTimes.forEach((rt) => {
  console.log(tr.hours);
});
=== Console Output ===

0
0
0

这阻止了我的渲染,因为它在render() 上传递了这些值,因为我正在映射这些值:

render()
{
    return(
           <div>
           {this.props.Obj.hours.map((h) => 
               <rhourComponent hours={h.hours} />
           )}
           </div>
          );
}

所以,我最终得到了 3 个以零为值的组件。

知道为什么会发生这种情况吗?

这是一个 React SPFx 客户端 Webpart。

【问题讨论】:

  • 你能用你的rhourComponent 更新问题吗?在安慰foreach 回调中的值时,您将迭代器作为rt 并作为tr 进行安慰,是在您的代码中输入发布问题还是拼写错误?
  • 这是问题代码中的错字。实际代码运行良好。这很奇怪,因为如果我执行 console.log(rTimes),当我在控制台中展开对象时,它会显示数组中的 3 个对象。但如果我这样做,例如 console.log (Obj.rTimes[1].hours) 它也会显示 0。

标签: javascript reactjs typescript sharepoint-online spfx


【解决方案1】:

rTimes 对象可能会在组件渲染后更新。

我会尝试:

  1. 通过控制台输出每个数组对象以验证idH是否正在更新;
  2. forEach封装在setTimeout中;
  3. 避免直接在 JSX 中使用组件 props,方法是将它们分配给内部组件变量,而不是映射该数组。

(3)的一个例子:

constructor(props) {
  super(props);
  this.state = {
    hours: this.props.Obj.hours
  };
}

然后在 JSX 上:

<div>
{this.state.hours.map((h) => 
    <rhourComponent hours={h} />
)}
</div>

或者(传递整个数组):

<div>
    <rhourComponent hours={this.state.hours} />
</div>

然后您可以像这样操作hours

this.setState(
  update(this.state, {
    hours: [], // any array you want to change to
  }),
);

【讨论】:

  • 我在主组件中设置状态并作为道具传递。我应该将道具传递给子组件的状态,然后将状态传递给他们的孩子吗?我现在使用 Object.assign 在传递对象之前克隆它们,这样它们就不会更新原始引用。此外,我还有一个回调,可以在主组件上更新其文本框中的值,并仅在那里设置状态。
  • rhourComponent 可以有自己的状态,在其构造函数中设置小时(通过您传递的道具)。分配给状态避免了道具对象读取问题。此外,通过使用immutability-helper 中的update,整个状态将根据旧状态进行重置,并且仅更新您要更改的对象(避免使用Object.assign)。
  • 我来看看 immutability-helper。这可能会使我的代码更简单。我也在尝试将其迁移到 React 16.8,以便我可以使用 Hooks。让我们看看这是怎么回事,因为所有这些行为对我来说都很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 2020-06-17
  • 2016-10-21
相关资源
最近更新 更多