【问题标题】:在反应中删除地图内数组中的元素
【发布时间】:2022-01-23 13:38:22
【问题描述】:

单击跨度时,我想从数组中删除该元素并再次运行地图,以便跨度也被删除。我不知道是语法错误还是什么。这是我编写代码的沙盒的链接。 https://codesandbox.io/s/angry-wu-4dd11?file=/src/App.js

import "./styles.css";

export default function App() {
  const data = [{
      name: "Alex",
    },
    {
      name: "John",
    },
    {
      name: "Leo",
    },
    {
      name: "Murphy",
    },
    {
      name: "Alex",
    },
    {
      name: "John",
    },
    {
      name: "Leo",
    },
    {
      name: "Murphy",
    },
  ];

  return ( <
    div className = "App" > {
      data.map(function(val, id) {
        return ( <
          span key = {
            id
          }
          className = "select__item"
          onClick = {
            (e) => {
              data.splice(data.indexOf(val), id + 1);
              console.log(data);
            }
          } >
          {
            val.name
          } < br / > < br / >
          <
          /span>
        );
      })
    } <
    /div>
  );
}

【问题讨论】:

  • 你应该使用useState钩子来存储和更新数据。当某些变量发生变化时,React 不能神奇地触发重新渲染。
  • 您应该使用useState 来实现这一点。您现在执行的方式既不会触发重新渲染,也不会修改原始数组。
  • 你能给我看看这个例子吗?我是新手,有时我会被语法卡住。

标签: javascript arrays reactjs mapping


【解决方案1】:

在这种情况下你应该使用 useState 钩子,因为 React 不会自动重新渲染。你必须在外部告诉 react,一种方法是改变状态,react 会自动重新渲染组件:

现场演示

import { useState } from "react";
import "./styles.css";

export default function App() {
    const [data, setData] = useState([
        {
            name: "Alex",
        },
        {
            name: "John",
        },
        {
            name: "Leo",
        },
        {
            name: "Murphy",
        },
        {
            name: "Alex",
        },
        {
            name: "John",
        },
        {
            name: "Leo",
        },
        {
            name: "Murphy",
        },
    ]);

    const removeItem = (index) => {
        setData(data.filter((o, i) => index !== i));
    };

    return (
        <div className="App">
            {data.map(function (val, id) {
                return (
                    <span
                        key={id}
                        className="select__item"
                        onClick={() => removeItem(id)}>
                        {val.name} <br />
                        <br />
                    </span>
                );
            })}
        </div>
    );
}

【讨论】:

  • 如果你不介意,最好使用const removeItem = (index) =&gt; () =&gt; setData(d.filter((_, i) =&gt; index !== i));onClick={removeItem(id)}这样的语法,以避免每次渲染时创建不同的回调
  • 立即调用函数,这不是你想要的@MichaelArbib。
  • @MichaelArbib 你的sn-p和我建议的代码有什么区别?
  • 我是通过prop向组件发送数据的。我该怎么办?
  • @GhayasUdDin 将函数从父级传递给子级,即removeItem,然后在用户单击span时立即调用它
猜你喜欢
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多