我正在通过数组进行映射,并且对于每个项目都显示一个带有文本的按钮。假设我希望单击按钮,下面的文本会将其颜色更改为红色。如何定位按钮的同级?我尝试使用ref,但是由于它是映射的jsx,因此只会声明最后一个ref元素。
这是我的代码:
class Exams extends React.Component {
constructor(props) {
super()
this.accordionContent = null;
}
state = {
examsNames: null, // fetched from a server
}
accordionToggle = () => {
this.accordionContent.style.color = 'red'
}
render() {
return (
<div className="container">
{this.state.examsNames && this.state.examsNames.map((inst, key) => (
<React.Fragment key={key}>
<button onClick={this.accordionToggle} className="inst-link"></button>
<div ref={accordionContent => this.accordionContent = accordionContent} className="accordionContent">
<p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Aperiam, neque.</p>
</div>
</React.Fragment>
))}
</div>
)
}
}
export default Exams;
如所解释的,结果是在每次单击按钮时,将定位到最后一个按钮所附的段落。
预先感谢
答案 0 :(得分:4)
将this.accordionContent
初始化为数组
constructor(props) {
super()
this.accordionContent =[];
}
然后像这样设置ref
<div ref={accordionContent => this.accordionContent[key] = accordionContent} className="accordionContent">
答案 1 :(得分:0)
通过使用地图的key属性,我找到了一种无需使用ref的方法:
accordionToggle = (key) => {
console.log(key)
var a = document.getElementsByClassName('accordionContent')
a[key].style.color = 'red'
}
我不确定访问dom是否像使用refs那样直接定位元素是否一样好。
答案 2 :(得分:0)
这是基于您上面的代码的我可工作的Codepen示例
链接的示例是“实际”手风琴,即显示和隐藏相邻的内容。
(请参见下面的代码段,以使其变为红色)
https://codepen.io/PapaCodio/pen/XwxmvK?editors=0010
代码片段
初始化引用数组:
constructor(props) {
super();
this.accordionContent = [];
}
使用键将引用添加到引用数组:
<div ref={ref => (this.accordionContent[key] = ref)} >
通过onClick将键传递到切换功能
<button onClick={() => this.accordionToggle(key)} >
最终引用切换功能中的键
accordionToggle = key => {
this.accordionContent[key].style.color = 'red'
};