繁体   English   中英

如何在 React JS 中使用 forEach

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM