首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React:如何从子组件更新数组中的对象

React:如何从子组件更新数组中的对象
EN

Stack Overflow用户
提问于 2020-05-12 03:30:21
回答 4查看 51关注 0票数 0

当一个新的鼓被添加到setDrums中的鼓数组中时,显示每个鼓组件时,用户可以给鼓一个名称,我如何将name添加到数组drums中的鼓中。

我可以注销鼓id,但是如何在数组中找到鼓,并且只更新用户输入的名称?

https://codesandbox.io/s/amazing-dan-dsudq?file=/src/index.js:0-1371

代码语言:javascript
复制
import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";

const rootElement = document.getElementById("root");

const Drum = ({ id, count, remove, editName, name }) => {
  const [sounds, setSounds] = useState(count);

  useEffect(() => {
    if (sounds > 0)
      setTimeout(() => {
        console.log("Playing sound");
        setSounds(sounds - 1);
      }, 1000);
  }, [sounds]);

  return (
    <div>
      <p>Drum #{id}</p>
      <p>Drum Name {name}</p>
      <p>Remaining sounds: {sounds}</p>
      <label>
        Drum Name <input type="text" onChange={editName} />
      </label>
      <br />
      <button onClick={remove}>Delete drum #{id}</button>
    </div>
  );
};

const App = () => {
  const [drums, setDrums] = useState([]);
  const [nextId, setNextId] = useState(0);

  return (
    <div>
      {drums.map(drum => (
        <Drum
          key={drum.id}
          id={drum.id}
          count={drum.count}
          remove={() => setDrums(drums.filter(other => drum.id !== other.id))}
          editName={() => console.log(drum.id)} // <== how to save the entered name to setDrums?
          name={drum.name}
        />
      ))}
      <button
        onClick={() => {
          setDrums([
            ...drums,
            { id: nextId, count: Math.floor(Math.random() * 100) }
          ]);
          setNextId(nextId + 1);
        }}
      >
        Add drum
      </button>
    </div>
  );
};

ReactDOM.render(<App />, rootElement);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-05-12 03:57:33

已更新

我还更新了代码框.链接

理论-为了更新值,我们需要数组的标识符,这是每个鼓的索引。

我创建了一个editDrumName函数,它接受两个参数,一个是事件,另一个是id。然后,我将鼓克隆到一个tempDrums变量中,并使用id更新了该值。

由于道具中传递的值,所以不能对子组件执行此操作。

代码语言:javascript
复制
import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";

const rootElement = document.getElementById("root");

const Drum = ({ id, count, remove, editName, name, index }) => {
  const [sounds, setSounds] = useState(count);

  useEffect(() => {
    if (sounds > 0)
      setTimeout(() => {
        console.log("Playing sound");
        setSounds(sounds - 1);
      }, 1000);
  }, [sounds]);

  return (
    <div>
      <p>Drum #{id}</p>
      <p>Drum Name: {name}</p>
      <p>Remaining sounds: {sounds}</p>
      <label>
        Drum Name <input type="text" onChange={e => editName(e, index)} />
      </label>
      <br />
      <button onClick={remove}>Delete drum #{id}</button>
    </div>
  );
};

const App = () => {
  const [drums, setDrums] = useState([]);
  const [nextId, setNextId] = useState(0);

  const editDrumName = (event, id) => {
    let tempDrums = drums;
    tempDrums[id].name = event.target.value;
    setDrums([...tempDrums]);
  };

  return (
    <div>
      {drums.map((drum, index) => (
        <Drum
          key={drum.id}
          id={drum.id}
          index-{index}
          count={drum.count}
          remove={() => setDrums(drums.filter(other => drum.id !== other.id))}
          editName={editDrumName} // <== how to save the entered name to setDrums?
          name={drum.name}
        />
      ))}
      <button
        onClick={() => {
          setDrums([
            ...drums,
            { id: nextId, count: Math.floor(Math.random() * 100) }
          ]);
          setNextId(nextId + 1);
        }}
      >
        Add drum
      </button>
    </div>
  );
};

ReactDOM.render(<App />, rootElement);
票数 1
EN

Stack Overflow用户

发布于 2020-05-12 03:55:38

如果将数组更改为对象,然后按如下方式调用setDrums如何:

代码语言:javascript
复制
editName={(e) => setDrums({...drums, drums[drum.id].name: e.target.value )}
票数 0
EN

Stack Overflow用户

发布于 2020-05-12 03:57:56

由于不能直接编辑原始数组,因为应将react状态视为不可变,因此在每次更改时都应该对数组进行新的引用。

代码语言:javascript
复制
editName={event => {
  // set the new value to drum
  drum.name = event.target.value;
  // update drums state by creating shallow copy of the old one
  setDrums(drums.slice(0));
}}

参考文献:http://facebook.github.io/react/docs/component-api.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61743319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档