输入字符 React 后输入失去焦点

Input loses focus after typing character React

我已经尝试调试了好几个小时,并查看了所有其他具有相同问题风格的 Stack Overflow 问题,但他们都只是说要使用密钥,但对我来说仍然不起作用。我做了一个更简单的代码示例来复制错误。

    import React from 'react'
import { useState } from 'react'
const FormTest = () => {

    const [name, setName] = useState('')
    const TestExperience = (props) => {
        return (<div>
           <h1>Test Experience {props.num}</h1>
          <input 
           type="text" 
           name="name" 
           placeholder="Name"
            />
        </div>)
    }
    const processFormData = (event) => {
        event.preventDefault();
        console.log(event.target);
    }
    const [nums, setNums] = useState([1, 2, 3]);
    const arr = nums.map((num, index) => <TestExperience num={num} key={index}/>);

    return (
        <div>
            <form onSubmit={(event) => {
                processFormData(event);
            }}>
            {arr}
            
            <button onClick={() => {
                setNums([...nums, nums.length + 1]);
            }}>Add one!</button>
            </form>        
        </div>
    )
}

export default FormTest

我试过将 TestExperience 移到它自己的独立函数中。我试图基本上拥有可以创建更多的输入,而这个失去焦点的问题来自这样一个事实,即每次添加输入时,所有现有的 formData 由于重新渲染而消失。目标是只使用 onSubmit 函数来解析数据,但由于它在添加输入后消失,我认为我需要存储它。我一直在一个又一个地探索兔子洞,试图解决一个看起来如此简单的问题,并且 运行 在我尝试的每个实现中都遇到问题。

总体目标是我有一个提交按钮和一个添加输入按钮,我试图放弃整个 value={stateVariable} 和 onChange={setStateVariable} 的东西,只是让输入按钮成为“提交”按钮,这样我就可以 运行 processFormData 并根据它是哪个提交按钮做不同的事情,但是当有两个不同的按钮时,我不知道如何检查提交来自哪个按钮,所以对此的答案可能也非常有帮助,因为这样我就可以避免整个状态混乱。

您需要将 TestExperience 移出 FormTest

import React from "react";
import { useState } from "react";

const TestExperience = (props) => {
  const [name, setName] = useState("");

  return (
    <div>
      <h1>Test Experience {props.num}</h1>
      <input
        type="text"
        name="name"
        placeholder="Name"
        onChange={(event) => {
          event.preventDefault();
          setName(event.target.value);
        }}
        value={name}
      />
    </div>
  );
};

const FormTest = () => {
  const processFormData = (event) => {
    event.preventDefault();
    console.log(event.target);
  };
  const [nums, setNums] = useState([1, 2, 3]);
  const arr = nums.map((num, index) => (
    <TestExperience num={num} key={index} />
  ));

  return (
    <div>
      <form
        onSubmit={(event) => {
          processFormData(event);
        }}
      >
        {arr}
        //another way I tried to do it below //
        {nums.map((num, index) => (
          <TestExperience num={num} key={index} />
        ))}
        <button
          onClick={() => {
            setNums([...nums, nums.length + 1]);
          }}
        >
          Add one!
        </button>
      </form>
    </div>
  );
};

export default FormTest;

代码沙箱 => https://codesandbox.io/s/trusting-elbakyan-mxrez?file=/src/App.js