reactjs - 提升状态并访问动态创建的输入文本字段的值
问题描述
在我的组件中,我正在打开一个模态并传递这样的表单:-
<Modal
show={showGroupModal}
onCancel={closeGroupModalHandler}
header="Please add Group Name"
contentClass="player-admin__modal-content"
>
<div>
<form onSubmit={addGroupSubmitHandler}>
<NonFormikInput
type="text"
placeholder={formatValue ? "Enter Group Name" : "Enter Team Name"}
nogat={nogat}
getTextValue={getTextValueHandler}
/>
<Button type="submit" text="Submit"></Button>
<Button type="button" text="Cancel" onClick={closeGroupModalHandler}>
{" "}
</Button>
</form>
</div>
</Modal>
值 {nogat} 是从 MONGODB 集合中获取的变量值。这个值被传递给一个子组件,我使用 .map() 根据通过 nogat 传递的数字创建输入框的数量,如下所示:-
const NonFormikInput = (props) => {
const [title, setTitle] = useState('')
const changeHandler = (event) => {
setTitle(event.target.value)
props.getTextValue(title)
}
const newValues = [...Array(props.nogat)].map((_,i) => i + 1)
const newValues1 = newValues.map(number => {
return (
<input
key={number}
id={number}
className="non-formikinput__text"
type={props.type}
placeholder={props.placeholder}
onChange={changeHandler}
value={title}
/>
)
})
return (
newValues1
)
}
此组件中的 onChange 函数理想情况下应通过此语句提升状态 props.getTextValue(title) 它正确执行此操作,我也可以正确看到父组件中的值。
我的问题:- 在子组件中,输入文本字段的连接方式是,我在任何一个输入字段上键入的任何内容都会反映在所有后续文本框中。
我认为这可能是因为我将 value 属性连接为状态字段标题,而现在它已传播到来自 .map 函数的所有输入字段中。
有没有办法隔离输入值,以便我能够唯一地从每个字段中捕获值
解决方案
而不是在状态变量中存储一个字符串,而是存储一个对象,该对象可以将每个输入的标题作为其编号。将数字与事件一起传递给 changeHandler 以设置标题。现在在父元素中,您可以通过其编号访问任何输入的文本。
const NonFormikInput = (props) => {
const [titles, setTitles] = useState({})
const changeHandler = (event, number) => {
setTitles({...titles, [number]: event.target.value});
props.getTextValue(titles)
}
const newValues = [...Array(props.nogat)].map((_,i) => i + 1)
const newValues1 = newValues.map(number => {
return (
<input
key={number}
id={number}
className="non-formikinput__text"
type={props.type}
placeholder={props.placeholder}
onChange={(event) => changeHandler(event, number)}
value={number in titles ? titles[number] : ""}
/>
)
})
return (
newValues1
)
}
推荐阅读
- javascript - 如何在 React 中创建跨应用程序库?
- azure - 在 Azure 应用程序网关上托管多个(比如说 5 个)子域的最佳方法是什么?
- java - Java 与 Python 正则表达式
- vba - 如何在 MS Access 中通过 VBA CTRL+S
- javascript - 尝试从 JSON 文件返回 URL
- oracle - 如何对PL/SQL中的数字表进行排序?
- testing - 如何测试容器的宽度/高度大小
- c - c语言结果在Windows 10中有所不同
- reactjs - 如何在 reactjs 中直接访问特定产品?
- macos - 在 MacOS 上构建 SwiftUI “Hello World”