【发布时间】:2019-12-16 09:33:17
【问题描述】:
我有一组用户名["frank", "john", "stevie"]。循环遍历每个元素,我创建了一个 ChatBox 组件:
{
popups.map((x, i)=>(
<ChatBox
addMessage={this.addMessage}
delMessage={this.delMessage}
setMessages={this.setMessages}
getMessages={this.getMessages}
name={x}
users={this.state.users}
id={x}
key={i}
user={this.fetchUser(x)}
/>
))
}
它看起来很简单。渲染组件后,我需要进行 ajax 调用,所以我称之为:
componentDidMount() {
console.log(this.props.name)
//make ajax call using `this.props.name`
}
问题: 我注意到渲染的组件在["frank", "john", "stevie"] 中将name props 的初始值设置为“frank”。即如果我在数组中有五个元素,最后四个组件的初始值是数组中的第一个元素!。并且非常重要的是,一旦组件被渲染,就会进行 ajax 调用,但是如果使用数组中第一个元素的值进行调用,则生成的组件都将具有与第一个组件相同的数据。这是有缺陷的。
我尝试了getDerivedStateFromProps() 和componentDidUpdate(),但这看起来很棘手,因为渲染的第一个组件具有正确的值并且很少更改,因此不会进行 ajax 调用。
有没有一种方法可以让所有渲染的组件都拥有正确的道具,这样我就可以在componentDidMount 上进行 ajax 调用。
【问题讨论】:
-
您的代码看起来不错。您确定
popups数组包含预期值并且之后不会更改。所有组件也都记录franky? -
是的,我有一个设置 popups..setStates({popus:[new array]}) 的逻辑。单击用户时,会附加一个新名称,反之亦然。是的,所有组件都会记录,但它们的初始状态显示数组中第一个元素的值。
-
我认为您发布的代码不足以找出问题所在。根据您发布的代码,每个 ChatBox 都应该有正确的名称。
-
它是一个相当长的组件,ChatBox 组件的道具比我在这里发布的要多得多。但任何关于为什么会发生这种情况的见解都会有所帮助。
标签: javascript reactjs