reactjs - ReactJS:输入 onChange 不更新状态
问题描述
我遇到了一个问题,即onChange={}
on<input />
不会通过状态改变值。
我有两个组件,组件 1 将输入值的状态作为道具传递给组件 2:
组件 1:
function MainContent() {
const [inputValue, setInputValue] = React.useState("");
const onChangeHandler = (event) => {
setInputValue(event.target.value);
};
return (
<>
<input
id="shtitle"
value={inputValue}
onChange={onChangeHandler}
className="input sh-input"
type="text"
placeholder="Incident Title"
/>
<DuplicateHubDisplay
data={[
inputValue,
momentDate.format("DD/MM/YYYY HH:mm A"),
textareaValue,
]}
/>
</>
);
}
export default MainContent;
组件 2:从组件 1 获取道具数据
const [commsTitle, setCommsTitle] = useState("");
// const [commsTitle, setCommsTitle] = useState(duplicateHubData.data[0]); //Does not work
<input
id="duplicatehub-title"
value={duplicateHubData.data[0]}
className="input"
placeholder="Incident Title"
/>
我不知道如何存储duplicateHubData.data[0]
为状态,然后使用 onChange 更改状态值。
这样做不允许我更改输入值:
const DuplicateHubDisplay = (duplicateHubData) => {
const [commsTitle, setCommsTitle] = useState(duplicateHubData.data[0]);
return (
<input
id="duplicatehub-title"
onChange={(e) => {
setCommsTitle(e.target.value);
}}
value={commsTitle}
className="input"
placeholder="Incident Title"
/>
);
}
export default DuplicateHubDisplay;
提前致谢
解决方案
如果我理解正确,您希望在(1)父组件更新或(2)更新中的输入值时DuplicateHubDisplay
更新状态。commsTitle
inputValue
DuplicateHubDisplay
问题
DuplicateHubDisplay
传递了一个初始状态值为的data
道具,因此初始状态也是. 不会“监听”道具更新然后更新状态。inputValue
""
commsTitle
""
DuplicateHubDisplay
commsTitle
解决方案
<DuplicateHubDisplay
data={[
inputValue,
momentDate.format("DD/MM/YYYY HH:mm A"),
textareaValue,
]}
/>
是的,使用useEffect
钩子来响应道具值的变化并更新本地commsTitle
状态。
const DuplicateHubDisplay = ({ data }) => {
const [inputValue] = data; // array destructuring assignment
const [commsTitle, setCommsTitle] = useState(inputValue);
useEffect(() => {
setCommsTitle(inputValue);
}, [inputValue]);
return (
<input
id="duplicatehub-title"
onChange={(e) => setCommsTitle(e.target.value)}
value={commsTitle}
className="input"
placeholder="Incident Title"
/>
);
}
解决方案 2
如果您实际上不需要对状态做任何事情,commsTitle
您可以在输入上分配data[0]
为 adefaultValue
并将data[0]
值用作 React 键,因此当来自父 React 的值更新时,将使用新的默认值重新安装/重置输入。
const DuplicateHubDisplay = ({ data }) => {
const [inputValue] = data; // array destructuring assignment
return (
<input
key={inputValue}
id="duplicatehub-title"
defaultvalue={inputValue}
className="input"
placeholder="Incident Title"
/>
);
}
推荐阅读
- deep-learning - 使用 VOCstyle-dataset 通过 mmdetection 训练 yolov3
- tar - tar.gz 存档中的文件组织
- python - 满足完成条件后,Gym Retro/Stable-Baselines 不会停止迭代
- java - 如何将递归变为迭代?
- stm32 - STM32F103 PLL 将复位值与标志值“CODE WISE”进行比较
- jsp - 为什么 $ {budget} 在提交请求后不会刷新以减少它
- linux - Chromium ARM 交叉编译生成 rpm 安装程序
- python - 'or' 和 'and' 在同一个 if 语句中
- r - R Currency() 仅更改一列
- javascript - 提交表单前显示图片 JavaScript