Arp*_*con 2 html javascript css reactjs
我想创建一个函数,它迭代具有相同类的所有元素并删除特定类。
使用 JavaScript 可以轻松完成。
const boxes = document.querySelectorAll(".box1");
function remove_all_active_list() {
boxes.forEach((element) => element.classList.remove('active'));
}
Run Code Online (Sandbox Code Playgroud)
但是我怎么能做这个类似的事情是 ReactJs。我面临的问题是我不能document.querySelectorAll(".box1")在 React 中使用,但是,我可以使用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;
Run Code Online (Sandbox Code Playgroud)
列表.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;
Run Code Online (Sandbox Code Playgroud)
请告诉我如何克服这个问题。
简短的回答
你不会。
相反,您可以有条件地向元素、组件或collection.map()React 组件内部添加和删除类。
例子
这是一个说明两者的示例:
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;
Run Code Online (Sandbox Code Playgroud)
所以在你的情况下:
您可以将activeprop传递给<ListItem />组件并props.active用作条件。
或者,您可以发送activeIndex到<List />组件并index === activeIndex用作地图中的条件。
解释
React 不是向 HTMLElement 添加或删除类,而是负责渲染和更新整个元素及其所有属性(包括class- 在 React 中你会写为className)。
不进入 shadow dom 以及为什么 react 可能更可取,我将尝试解释思维方式的转变:
组件不仅描述 html 元素,还可能包含逻辑和行为。每次任何属性更改时,至少会再次调用 render 方法,并将元素替换为新元素(即之前没有任何类但现在有类)。
现在更容易改变班级。您需要做的就是更改属性或修改条件的结果(if 语句)。
因此,与其在 dom中选择一些元素并应用一些逻辑,您根本不会选择任何元素;逻辑写在 react 组件内部,靠近进行实际渲染的部分。
进一步阅读
https://reactjs.org/docs/state-and-lifecycle.html
如果需要改写或添加某些内容,请不要犹豫添加评论。
| 归档时间: |
|
| 查看次数: |
594 次 |
| 最近记录: |