javascript - 如何在 react Hook 中正确更新状态

标签 javascript reactjs typescript react-native

所以,问题是每当我按下删除按钮时,它只会删除删除最后一个输入和按钮,而不考虑索引。我试图将 key 更改为 key={${index}${name}}`,这不会很好地工作,因为输入是可变的(在主代码中)并且把事情搞砸了。 如何根据索引正确删除?

function App() {
  const [names, setNames] = React.useState(["First", "Second",'third','fourth']);
  const onNameDelete = useCallback((index: number) => {
    setNames((prev) => {
      const name = names[index];
      return prev.filter(x => x != name);
    });
  }, [names]);

  return (
    <div>
      {names.map((name, index) => (
        <Child
          key={index}
          name={name}
          index={index}
          onDelete={onNameDelete}
        />
      ))}
    </div>
  );
}
interface ChildProps {
  name: string;
  index: number;
  onDelete: (index: number) => void;
}

export const Child: React.FC<ChildProps> = React.memo(
  ({ name, index, onDelete }) => {
    return (
      <div>
        <input
          defaultValue={name}
        />
        <button onClick={() => onDelete(index)}>delete</button>
      </div>
    );
  }

最佳答案

这里是:

function App() {
  const [names, setNames] = React.useState(
    ["First", "Second",'third','fourth'].map((name, index) => ({ id: index, name }))
  );
  const onNameDelete = useCallback((index: number) => {
    setNames((prev) => prev.filter({ id } => id !== index));
  }, [names]);

  return (
    <div>
      {names.map(({ id, name }) => (
        <Child
          key={id}
          name={name}
          index={id}
          onDelete={onNameDelete}
        />
      ))}
    </div>
  );
}
interface ChildProps {
  name: string;
  index: number;
  onDelete: (index: number) => void;
}

export const Child: React.FC<ChildProps> = React.memo(
  ({ name, index, onDelete }) => {
    return (
      <div>
        <input
          defaultValue={name}
        />
        <button onClick={() => onDelete(index)}>delete</button>
      </div>
    );
  }

请使用对象数组代替存储名称的数组:

const [names, setNames] = React.useState(
    ["First", "Second",'third','fourth'].map((name, index) => ({ id: index, name }))
  );

关于javascript - 如何在 react Hook 中正确更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64395726/

相关文章:

javascript - 可以在 AngularJs 中设置 base 标签的 href 属性吗?

javascript - 为什么大多数 Typescript npm 模块都以 @ 开头?

javascript - D3 条形图未捕获类型错误

javascript - ExtJS 将多个 vType 应用于一个字段

reactjs - componentDidMount 中未定义的 Prop

javascript - 更好地调试控制台输出以解决 React StatelessComponent 中的错误

Angular 7 @input 属性 'selected' 在类型 '{}' 上不存在

debugging - 如何在 WebStorm 中调试服务器端 TypeScript 代码

javascript - 在 Ember 的操作中处理事件绑定(bind)和回调

javascript - Redux.js : catching malformed actions?