输入字符 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
我已经尝试调试了好几个小时,并查看了所有其他具有相同问题风格的 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