reactjs - 如何处理多个输入的状态并从父级更改它们的状态?
问题描述
我有一个具有编辑模式的自定义输入组件,我使用多个输入,我的目标是从输入中提取所有状态并将其放在父级上。
我设法为输入值做到这一点,因为我为每个输入创建了一个 useState,但是我怎样才能为切换行为实现同样的事情。我想在每个输入旁边有一个按钮来切换输入的状态。(显示/隐藏输入)。
现在,当我按下编辑时,所有编辑布尔值都会被触发,因此所有输入都变得可见。
如何从父级一次切换一个输入,基本上我希望我的自定义组件纯粹用于演示,并且状态应该存在于父级上
例子:
const Parent = () => {
const [value1, setValue1] = useState('')
const [value2, setValue2] = useState('')
const [value3, setValue3] = useState('')
const [editMode, setEditMode] = useState(false)
return (
<div>
<ChildCustomInput value={value1} updateValue={setValue1} editMode={editMode} updateEditMode={setEditMode} />
<ChildCustomInput value={value2} updateValue={setValue2} editMode={editMode} updateEditMode={setEditMode}/>
<ChildCustomInput value={value3} updateValue={setValue3} editMode={editMode} updateEditMode={setEditMode}/>
</div>
)
}
const ChildCustomInput = (props)=> {
// ref to update the input's value in the parent
const textInputEl = useRef(null)
// method to update the parent's values
const updateComponentValue = () => {
props.updateValue(textInputEl.current.value)
props.updateEditMode(!props.editMode)
}
// Toggle Edit mode
const changeEditMode = () => {
props.updateEditMode(!props.editMode)
}
const renderEditView = () => {
return (
<div>
<input ref={textInputEl}></input>
<button onClick={updateComponentValue}>
OK
</button>
</div>
)
}
const renderDefaultView = () => {
return (
<div>
<div>
{props.value}
</div>
<button onClick={changeEditMode}>
EDIT
</button>
</div>
)
}
return (
<div>
{
props.editMode
? renderEditView()
: renderDefaultView()
}
</div>
)
}
export default Parent;
解决方案
似乎您的每个输入(即editMode1、editMode2、editMode3)都需要在父状态中使用editMode 布尔值,并且每个ChildCutomInput 应该使用自己的editModeX 和setEditModeX 而不是共享相同的布尔值。
const Parent = () => {
const [value1, setValue1] = useState('');
const [value2, setValue2] = useState('');
const [value3, setValue3] = useState('');
const [editMode1, setEditMode1] = useState(false);
const [editMode2, setEditMode2] = useState(false);
const [editMode3, setEditMode3] = useState(false);
return (
<div>
<ChildCustomInput value={value1} updateValue={setValue1} editMode={editMode1} updateEditMode={setEditMode1} />
<ChildCustomInput value={value2} updateValue={setValue2} editMode={editMode2} updateEditMode={setEditMode2}/>
<ChildCustomInput value={value3} updateValue={setValue3} editMode={editMode3} updateEditMode={setEditMode3}/>
</div>
)
}
推荐阅读
- excel - 在 Excel 中单击切片器中的选项之一时自动运行宏
- python - 在 python 中使用 group by 和排序后如何在数据框中获得前 3 名的销售额?
- python-3.x - 我的 Django 博客中没有加载我在 aws s3 中的静态文件
- linux - 将多行 grep 结果写入 zsh 中的分隔文件并从匹配捕获组中命名文件
- python - 如何将一个数据帧完全划分到另一个数据帧
- sql - 如何在 SQL 中将 cell1 与 cell 2 组 2 进行比较
- python - 将 float64 转换为 1 作为 int,将 naan 转换为 0 作为 int
- splunk - Splunk -> 以毫秒为单位获取时间
- android - 如何选择正确的文字大小
- udp - Busybox 二进制文件的 Nmap 端口无法访问