【发布时间】:2018-08-11 04:21:25
【问题描述】:
我的 reactjs 代码存在问题,其中 render() 函数不会按照存储在状态对象中的顺序打印数组。
这是我的代码,非常简单:
import React from "react";
export default class DonationDetail extends React.Component {
constructor(props) {
super(props);
this.state = { content: [] };
}
componentDidMount() {
let state = this.state;
state.content.push({ food: "burger" });
state.content.push({ food: "pizza" });
state.content.push({ food: "tacos" });
this.setState(state);
}
addPaymentItem() {
const item = { food: "" };
let state = this.state;
state.content.unshift(item);
this.setState(state);
}
render() {
console.log(this.state);
let ui = (
<div>
<button type="button" onClick={() => this.addPaymentItem()}>
add to top
</button>
{this.state.content.map((item, key) => (
<input type="text" key={key} defaultValue={item.food} />
))}
</div>
);
return ui;
}
}
当您按下按钮add to top 时,一个新项目将放置在state.content 数组的前面,您可以从console.log(this.state) 语句中验证这一点。但不寻常的是,生成的 HTML 不会将此新项目添加到用户界面输出的顶部。相反,另一个带有单词 taco 的输入字段被放置在用户界面中列表的底部。
为什么 ReactJS 不按实际存储的顺序打印我的 state.content 数组?
【问题讨论】:
-
您使用的状态不正确。你不应该直接改变状态对象。您想使用
this.setState()并将其传递给具有计算状态的新对象,或者传递一个返回具有更新状态的对象的函数。此外,您不想在渲染期间将整数索引用作key- 将其命名为有用的名称,例如`content-${key}` -
@Derek - 我确实在每次对其进行变异时都使用了 setState() 。我也尝试按照您的建议更改密钥,但结果仍然相同,呈现的项目列表不反映状态的顺序。还有其他建议吗?
-
使用数组索引作为键是一种已知的反模式,因为 react 的协调是如何工作的。点击此处了解更多详情:medium.com/@robinpokorny/…
标签: reactjs