我真的很惊讶这不符合我的预期。
我希望在访问该网站的人悬停在用户的消息上时显示用户名。下面是我到目前为止的代码。问题是,当我将鼠标悬停在消息上时,我映射的数组中的每个用户名都会出现。如何更改此选项以便它只有一个用户名?
我想我需要在单独的组件中将状态更改为每个用户的消息,但是,我不认为这应该是必要的。
class App extends Component {
state = {
showUsername: false
};
showUsername = () => {
this.setState({
showUsername: true
});
}
hideUsername = () => {
this.setState({
showUsername: false
});
}
render() {
let messageArr = this.props.messages.map(msg => {
let name = `${msg.firstName} ${msg.lastName}`;
return(
<div key={msg.id}>
{this.state.showUsername && (
<span>{name}</span>
)}
<li><span onMouseEnter={this.showUsername} onMouseLeave{this.hideUsername}>{msg.message}</span></li>
</div>
);
});
return (
<ul>
{messageArr}
</ul>
);
}
}
答案 0 :(得分:0)
是的。有必要。我想我需要在单独的组件中将状态更改为每个用户的消息,但是,我不认为这是必要的。
截至目前,有一个常见状态showUsername
用于显示用户名,这就是您获得此效果的原因。
showUsername = (oneUserMessage) => {
oneUserMessage.showUsername = true; // updating via reference
}
hideUsername = (oneUserMessage) => {
oneUserMessage.showUsername = false;// updating via reference
}
//在渲染中返回
return (
<div key={msg.id}>
{msg.showUsername && (
<span>{name}</span>
)}
<li><span
onMouseEnter={()=>{this.showUsername(msg)}}
onMouseLeave={()=>{this.hideUsername(msg)}}>
{msg.message}</span></li>
</div>
);
答案 1 :(得分:0)
您的组件的行为与此类似,因为this.state.showUsername
是组件内的状态。
因此,无论哪个div悬停,它都会将state
设置为true
,而其他所有人也会this.state.showUsername
收到true
。
这使得所有这些都可见。
您应该做的是,编写一个具有div
及其内部逻辑的新组件。因此,当您将其映射下来时,这些divs
中的每一个都将拥有自己的状态。
另一件事,你可以像这样做地图:
const messageArr = this.props.messages.map((msg) => <div key={msg.id}>
<li>
<span onMouseEnter={this.showUsername} onMouseLeave{this.hideUsername}>{msg.message}</span>
</li>
</div>);
所以不需要return语句:)