我有一个包含用户数组和消息数组的道具。每个用户和消息都通过相应的 ID 相关联。
我想匹配这些 ID,以便我可以与发布它的用户呈现消息。
问题是屏幕上没有渲染任何东西,但在console.log()
中,我可以看到结果。拜托,有人可以对此有所了解吗?
我也不确定我是否以正确的方式做到这一点,所以如果你能告诉我一个更好的方法,我会很高兴的。
谢谢
反应:
import React, { Component } from 'react';
class Messages extends Component {
constructor(props) {
super(props);
}
render() {
let self = this;
return (
<ul>
{
this.props.messages.map((message, msg_key) => {
self.props.members.forEach((member) => {
if (member.id === message.userId) {
console.log('inside foreach message.userId', message.userId); // this shows in console.
console.log('inside foreach member.id', member.id); // this shows in console.
return <p>member.id</p> // nothing shows on screen.
}
})
})
}
</ul>
);
}
}
export default Messages;
forEach
没有副作用。使用map
return (
<ul>
{
this.props.messages.map((message, msg_key) => {
return self.props.members.map((member) => { // <-- this line
if (member.id === message.userId) {
console.log('inside foreach message.userId', message.userId); // this shows in console.
console.log('inside foreach member.id', member.id); // this shows in console.
return <p>member.id</p> // nothing shows on screen.
}
})
})
}
</ul>
)
我所说的"副作用"是指它既不返回任何内容,也不修改原始数组 - map
返回修改后的数组。
请记住在返回数组时提供key
道具。
编辑
啊,实际上^并没有做你想做的事。
Array
有一个很好的方法来完成你正在尝试的事情,find
return (
<ul>
{
this.props.messages.map((message, msg_key) => {
const member = self.props.members.find((member) => member.id === message.userId)
return <p>{member.id}</p>
})
}
</ul>
)
编辑 #2
井。。。它确实有效,但它并不漂亮。React 不会在数组中渲染null
,所以它会跳过条件不真实的那些......
你应该重新定义你的数据结构。您当前拥有的不会是高性能的。
而不是成员数组.. 你应该有一个由成员 ID 键的对象。这样您就可以通过成员的 ID 查找成员。每当有将用于其他数据字段的信息时,都应该有一个键值存储设置,该设置由映射到其他信息的唯一标识符进行键值存储设置。这是一个例子
members: {
1: { id: 1, name: 'foo'},
2: { id: 2, name: 'bar'}
}
定义这样的数据结构时,可以轻松查找消息的成员。
render (){
const elems = [];
this.props.messages.forEach((message, msg_key) => {
const member = this.props.members[message.userId];
if (member) {
elems.push(
<li key={msg_key}>
<p>{message.title}</p> /* or whatever you want from the message */
<p>{member.id}</p>
</li>
);
}
})
return (
<ul>
{elems}
</ul>
)
}
我认为您可能会通过 1 次使用 2 个循环(map 和 forEach(来弄乱数组中的一些属性。
尝试使用帮助程序函数来映射(而不是 forEach(member.id 属性。所以只需在 render(( 中调用 {this.renderMemberList}
。你有一个JSFiddle设置吗?它会更容易