如何使用 ReactJS 钩子设置输入值?
How to set the value of inputs with ReactJS hooks?
我想在模式打开后用默认值填充表单的输入值
我用纯 javascript 使用 document.getElementById(textId).value='some value
做到了,如下所示:
for(var i=0; i<details_data.length;i++){
let textId='text'+i;
let amountId='amount'+i;
document.getElementById(textId).value=details_data[i].text
}
这很好用。但我想知道如何用 React 做到这一点,因为我不认为这是最佳实践。
我尝试的是像这样设置输入值:
<input name='text' id={textId} value={el.text} onChange={details_handler.bind(index)}/>
但这不会让我更改输入的值。它只是设置了默认值,当我输入输入时,该值不会改变我想要的。
这是我的代码
const [details_data,set_details_data]=useState([
{'text':'','amount':''}
])
// called this function on `onChange` and store the data in `details_data`
function details_handler(e){
let name=e.target.name;
let value=e.target.value;
details_data[this][name]=value;
set_details_data(details_data);
}
JSX:
(在我的例子中,用户可以根据需要添加任意数量的输入,这就是为什么我将输入放在映射循环中的原因)
{
details_data.map((el,index) => {
let textId='text'+index;
let amountId='amount'+index;
return (
<div key={index}>
<input name='text' id={textId} value={el.text} onChange={details_handler.bind(index)}/>
<input name='amount' id={amountId} onChange={details_handler.bind(index)}/>
</div>
);
})
}
useEffect(() => {
if(detailsProps) {
set_details_data(detailsProps);
}
}, [detailsProps])
您的 detailsProps(来自 api 的数据)看起来像这样
detailsProps = [
{'text':'text1','amount':'100'},
{'text':'text2','amount':'200'}
]
onChange 函数
const details_handler = (event, index) => {
const items = [...details_data];
items[index][event.target.name] = event.target.value;
set_details_data(items);
}
你的看法
{
details_data.map((el,index) => {
return (
<div key={index}>
<input name='text' value={el.text} onChange={(e) => details_handler(e, index)}/>
<input name='amount' value={el.amount} onChange={(e) => details_handler(e, index)}/>
</div>
);
})
}
我想在模式打开后用默认值填充表单的输入值
我用纯 javascript 使用 document.getElementById(textId).value='some value
做到了,如下所示:
for(var i=0; i<details_data.length;i++){
let textId='text'+i;
let amountId='amount'+i;
document.getElementById(textId).value=details_data[i].text
}
这很好用。但我想知道如何用 React 做到这一点,因为我不认为这是最佳实践。
我尝试的是像这样设置输入值:
<input name='text' id={textId} value={el.text} onChange={details_handler.bind(index)}/>
但这不会让我更改输入的值。它只是设置了默认值,当我输入输入时,该值不会改变我想要的。
这是我的代码
const [details_data,set_details_data]=useState([
{'text':'','amount':''}
])
// called this function on `onChange` and store the data in `details_data`
function details_handler(e){
let name=e.target.name;
let value=e.target.value;
details_data[this][name]=value;
set_details_data(details_data);
}
JSX:
(在我的例子中,用户可以根据需要添加任意数量的输入,这就是为什么我将输入放在映射循环中的原因)
{
details_data.map((el,index) => {
let textId='text'+index;
let amountId='amount'+index;
return (
<div key={index}>
<input name='text' id={textId} value={el.text} onChange={details_handler.bind(index)}/>
<input name='amount' id={amountId} onChange={details_handler.bind(index)}/>
</div>
);
})
}
useEffect(() => {
if(detailsProps) {
set_details_data(detailsProps);
}
}, [detailsProps])
您的 detailsProps(来自 api 的数据)看起来像这样
detailsProps = [
{'text':'text1','amount':'100'},
{'text':'text2','amount':'200'}
]
onChange 函数
const details_handler = (event, index) => {
const items = [...details_data];
items[index][event.target.name] = event.target.value;
set_details_data(items);
}
你的看法
{
details_data.map((el,index) => {
return (
<div key={index}>
<input name='text' value={el.text} onChange={(e) => details_handler(e, index)}/>
<input name='amount' value={el.amount} onChange={(e) => details_handler(e, index)}/>
</div>
);
})
}