【发布时间】:2018-01-10 03:44:34
【问题描述】:
我正在尝试构建一个简单的动态更新的交互式列表,当您单击它们时,根据 .clicked 类的 css 规则设置每个 <li></li> 的样式。
该应用由两个组件组成,父组件和子组件,相关代码如下(取自子组件):
handleClick(e) {
document.getElementById(e.currentTarget.id).setAttribute("class","clicked");
}
render() {
let ar = this.props.sentences;
let pro = ar.map((x,i)=>{ return (<li id={i} key={i} className={i%2==0 ? "white" : "grey"}
onClick={this.handleClick}>{x}</li>); })
return (
<div>
<ul id="ul">{ pro }</ul>
</div>
这里发生的事情基本上是父母向孩子传递了一个句子道具(一组句子,构成动态列表的基础)。
有争议的部分是我以document.getElementById(e.currentTarget.id).setAttribute("class","two");
的形式使用DOM 操作来更改从jsx 动态创建的html 的类。
上面的代码可以工作,但感觉不是最佳实践。使用 react 的全部优势在于使用虚拟 dom 并优化 DOM 的更新方式。
我的问题如下:
1) 我有这种感觉对吗? (我的解决方案不是最佳实践?)
2)(如果是这样,)我如何构建我的代码以使用虚拟 dom 机器 react 提供的功能?
如果你知道这个问题是重复的,请留下评论,我会删除它。
【问题讨论】:
-
被点击的
<li>是唯一获得clicked类的人吗 -
是的,这就是全部挑战。
-
正确,但即使点击更多,它是否保留点击的类?
-
是的。我理解你答案的第一部分(你能详细说明为什么不使用 map 的索引作为键吗?)但是我觉得第二部分有点抽象:假设我使用 state 来收集所有已经被到目前为止在数组等数据结构中单击。我不是必须在某些时候使用 vanilla js 才能真正改变他们的课程吗?
-
我不认为你不应该,你能从地图上发布一个样本
x对象吗...我很好奇它的样子。我正在编写一些要添加的代码,我可以使用更多关于this.props.sentences的详细信息来进一步实现这一点