javascript - 在 React 中选择多个子元素之一的正确方法是什么?
问题描述
我的新 React 应用程序有一小部分,其中包含一个文本块AllLines
,被分割成称为Line
. 我想让它工作,以便当单击一行时,它将被选中并可编辑,而所有其他行将显示为<p>
元素。我怎样才能最好地管理这里的状态,以便在任何给定时间只选择一条线?我正在努力的部分是确定哪个Line
元素已被单击以使父级可以更改其状态。
我知道我可以完成这项工作的方法,但我对 React 还比较陌生,并试图通过正确地做事来让我的头脑进入“在 React 中思考”,所以我很想知道在这种情况下什么是最佳实践.
class AllLines extends Component {
state = {
selectedLine: 0,
lines: []
};
handleClick = (e) => {
console.log("click");
};
render() {
return (
<Container>
{
this.state.lines.map((subtitle, index) => {
if (index === this.state.selectedLine) {
return (
<div id={"text-line-" + index}>
<TranscriptionLine
lineContent={subtitle.text}
selected={true}
/>
</div>
)
}
return (
<div id={"text-line-" + index}>
<Line
lineContent={subtitle.text}
handleClick={this.handleClick}
/>
</div>
)
})
}
</Container>
);
}
}
class Line extends Component {
render() {
if (this.props.selected === true) {
return (
<input type="text" value={this.props.lineContent} />
)
}
return (
<p id={} onClick={this.props.handleClick}>{this.props.lineContent}</p>
);
}
}
解决方案
就您而言,没有更简单的方法。当前状态selected
Line
是“高于”行集合(父),这是正确的(对于兄弟姐妹需要知道的情况)。
但是,您可以大大简化代码:
<Container>
{this.state.lines.map((subtitle, index) => (
<div id={"text-line-" + index}>
<Line
handleClick={this.handleClick}
lineContent={subtitle.text}
selected={index === this.state.selectedLine}
/>
</div>
))}
</Container>
对于Line
组件,使用函数式组件是一种很好的做法,因为它是无状态的,甚至不使用任何生命周期方法。
编辑:添加了缺少的右括号
推荐阅读
- html - 是否可以在 Angular(不是 AngularJS)中包含一个 HTML 文件?
- python-3.x - 有没有一种方法可以智能地从网站收集数据?
- javascript - 设置 JS 幻灯片的高度和宽度
- autodesk-forge - 在 Forge BIM 360 API 中搜索项目
- php - Elementor Pro:从存档标题中更改或删除类别/标签/作者前缀
- node.js - 根据注册中的用户角色切换配置文件路由(Express.js)
- javascript - react中的购物车按钮有问题
- javascript - 为什么 Three.js 中的 DirectionalLight 不起作用?
- javascript - 在收到所有数据后如何开始循环遍历 json 以不破坏 swiper 大小?
- audio - 拆分 WebRTC 音频流并将它们输出到我的输出音频设备的不同通道中