[英]How to use forEach in react js
我想创建一个 function,它遍历具有相同 class 的所有元素并删除特定的 class。
使用 JavaScript 可以轻松完成。
const boxes = document.querySelectorAll(".box1");
function remove_all_active_list() {
boxes.forEach((element) => element.classList.remove('active'));
}
但是我怎么能做这个类似的事情是 ReactJs。我面临的问题是我不能在 React 中使用document.querySelectorAll(".box1")
但是,我可以使用React.createRef()
但它没有给出我所有的元素,它只给我最后一个元素。
这是我的反应代码
应用程序.js
import React, { Component } from 'react';
import List from './List';
export class App extends Component {
componentDidMount() {
window.addEventListener('keydown', this.keypressed);
}
keypressed = (e) => {
if (e.keyCode == '38' || e.keyCode == '40') this.remove_all_active_list();
};
remove_all_active_list = () => {
// boxes.forEach((element) => element.classList.remove('active'));
};
divElement = (el) => {
console.log(el);
el.forEach((element) => element.classList.add('active'))
};
render() {
return (
<div className="container0">
<List divElement={this.divElement} />
</div>
);
}
}
export default App;
清单.js
import React, { Component } from 'react';
import data from './content/data';
export class List extends Component {
divRef = React.createRef();
componentDidMount() {
this.props.divElement(this.divRef)
}
render() {
let listItem = data.map(({ title, src }, i) => {
return (
<div className="box1" id={i} ref={this.divRef} key={src}>
<img src={src} title={title} align="center" alt={title} />
<span>{title}</span>
</div>
);
});
return <div className="container1">{listItem}</div>;
}
}
export default List;
请告诉我如何解决这个问题。
简短的回答
你不会。
相反,您可以有条件地向元素、组件或 React 组件内的collection.map()
添加和删除 class。
例子
这是一个说明两者的示例:
import styles from './Example.module.css';
const Example = () => {
const myCondition = true;
const myCollection = [1, 2, 3];
return (
<div>
<div className={myCondition ? 'someGlobalClassName' : undefined}>Single element</div>
{myCollection.map((member) => (
<div key={member} className={myCondition ? styles.variant1 : styles.variant2}>
{member}
</div>
))}
</div>
);
};
export default Example;
所以在你的情况下:
您可以将active
prop 传递给<ListItem />
组件并使用props.active
作为条件。
或者,您可以将activeIndex
发送到<List />
组件并使用index === activeIndex
作为 map 中的条件。
解释
React 不会向 HTMLElement 添加或删除类,而是负责呈现和更新整个元素及其所有属性(包括class
- 在 React 中,您将编写为className
)。
在不讨论 shadow dom 以及为什么 react 可能更可取的情况下,我将尝试解释思维方式的转变:
组件不仅描述了 html 个元素,还可能包含逻辑和行为。 每次任何属性更改时,至少再次调用 render 方法,并且元素被新元素替换(即之前没有任何 class 但现在有一个类)。
现在改变类更容易了。 您需要做的就是更改属性或修改条件(if 语句)的结果。
因此,不是选择 dom 中的某些元素并对其应用一些逻辑,而是根本不会 select 任何元素; 逻辑就写在 React 组件内部,靠近执行实际渲染的部分。
延伸阅读
https://reactjs.org/docs/state-and-lifecycle.html
如果应该改写或添加某些内容,请不要犹豫添加评论。
将ref
传递给List
组件中的父 div。
...
componentDidMount() {
this.props.divElement(this.divRef.current)
}
...
<div ref={this.divRef} className="container1">{listItem}</div>
然后在应用程序
divElement = (el) => {
console.log(el);
el.childNodes.forEach((element) => element.classList.add('active'))
}
希望这会奏效。 这是一个简单的例子https://codesandbox.io/s/staging-microservice-0574t?file=/src/App.js
应用程序.js
import React, { Component } from "react";
import List from "./List";
import "./styles.css";
export class App extends Component {
state = { element: [] };
ref = React.createRef();
componentDidMount() {
const {
current: { divRef = [] }
} = this.ref;
divRef.forEach((ele) => ele?.classList?.add("active"));
console.log(divRef);
window.addEventListener("keydown", this.keypressed);
}
keypressed = (e) => {
if (e.keyCode == "38" || e.keyCode == "40") this.remove_all_active_list();
};
remove_all_active_list = () => {
const {
current: { divRef = [] }
} = this.ref;
divRef.forEach((ele) => ele?.classList?.remove("active"));
// boxes.forEach((element) => element.classList.remove('active'));
console.log(divRef);
};
render() {
return (
<div className="container0">
<List divElement={this.divElement} ref={this.ref} />
</div>
);
}
}
export default App;
清单.js
import React, { Component } from "react";
import data from "./data";
export class List extends Component {
// divRef = React.createRef();
divRef = [];
render() {
let listItem = data.map(({ title, src }, i) => {
return (
<div
className="box1"
key={i}
id={i}
ref={(element) => (this.divRef[i] = element)}
>
<img src={src} title={title} align="center" alt={title} width={100} />
<span>{title}</span>
</div>
);
});
return <div className="container1">{listItem}</div>;
}
}
export default List;
为 List 组件创建 ref 并访问它们的子元素。 当按下键(向上/向下箭头)时,类名为“活动”的元素将被删除。 参考
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.