reactjs - React 输入失去了对变化的关注

标签 reactjs input state focus

react 输入失去了对每个变化的关注。 我知道如果我直接将输入函数移到 map 内,它就会正常工作。但我想让它成为一个可重用的组件。 这是链接:https://codesandbox.io/s/weathered-violet-j6gv14?file=/src/inputs.js

import React, { useState } from "react";

export default function Inputs({ inputs, setInputs }) {
  function handleAdd() {
    setInputs([...inputs, { input1: "", input2: "" }]);
  }
  function handleChange({ value, index, name }) {
    const tempInputs = [...inputs];
    tempInputs[index][name] = value;
    setInputs(tempInputs);
  }
  function Input({ index, input, ...props }) {
    return (
      <div {...props}>
        <input
          type="text"
          value={input["input1"]}
          onChange={(e) =>
            handleChange({
              value: e.target.value,
              index: index,
              name: "input1",
            })
          }
        />
        <input
          value={input["input2"]}
          onChange={(e) =>
            handleChange({
              value: e.target.value,
              index: index,
              name: "input2",
            })
          }
        />
      </div>
    );
  }
  return (
    <div>
      <button onClick={handleAdd}>Add</button>
      <ul>
        {inputs.map((input, index) => {
          return <Input key={index} index={index} input={input} />;
        })}
      </ul>
    </div>
  );
}

最佳答案

您需要将 Input 函数移到 Inputs 之外,将其作为一个单独的组件,然后在其中传递 handleChange 回调。

它会发生,因为当您更改输入时,React 会重新渲染组件,并且由于您的函数位于组件内部,因此组件也会重新渲染,但您实际上并不需要它。

import React from "react";

function Input({ index, input, handleChange, ...props }) {
  return (
    <div {...props}>
      <input
        type="text"
        value={input["input1"]}
        onChange={(e) =>
          handleChange({
            value: e.target.value,
            index: index,
            name: "input1"
          })
        }
      />
      <input
        type="text"
        value={input["input2"]}
        onChange={(e) =>
          handleChange({
            value: e.target.value,
            index: index,
            name: "input2"
          })
        }
      />
    </div>
  );
}

export default function Inputs({ inputs, setInputs }) {
  function handleAdd() {
    const tempInputs = [...inputs];
    tempInputs.push({ input1: "", input2: "" });
    setInputs(tempInputs);
  }
  function handleChange({ value, index, name }) {
    const tempInputs = [...inputs];
    tempInputs[index][name] = value;
    setInputs(tempInputs);
  }

  return (
    <div>
      <button onClick={handleAdd}>Add</button>
      <ul>
        {inputs.map((input, index) => {
          return (
            <Input
              key={index}
              handleChange={handleChange}
              index={index}
              input={input}
            />
          );
        })}
      </ul>
    </div>
  );
}

https://codesandbox.io/s/little-brook-7iiiqw?file=/src/inputs.js

关于reactjs - React 输入失去了对变化的关注,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71496581/

相关文章:

javascript - 我应该在调度时捕获 Redux promise 错误还是只在 reducer 中处理它?

reactjs - 使用 React 测试库/Jest 模拟 axios 帖子

Java lwjgl 键盘处理程序

angularjs - 将 UI-Router 状态参数从父级一致传递到子级

javascript - VueJS - 在渲染子组件之前等待父组件中的 update()

html - 如何在 react native 中对齐屏幕底部的按钮?

javascript - IE11 中的点表示法属性访问器

C 编程 ncurses 输入验证

recursion - Common-Lisp 中的递归阶乘函数

windows - powershell 中进程的状态