3 回答

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
具有可定制輸入數(shù)量的解決方案:
const NUM_INPUTS = 3;
const range: string[] = (Array.from(Array(NUM_INPUTS).keys()).map(i => ''));
const [value, setValue] = useState<string | undefined>(undefined);
const [values, setValues] = useState(range);
// Handle unified value
const handleValue = (e: any) => {
setValue(e.target.value);
setValues(range.fill(e.target.value));
}
// Handle individual inputs
const handleOtherValue = (e: any) => {
values[+e.target.name] = e.target.value;
setValues(values);
}
// Create array of input elements
const inputs = range.map((_, i) =>
(<input key={i} name={i.toString()}
defaultValue={values[i]} onChange={handleOtherValue}/>));
// Important to use defaultValue so inputs are mutable
return (
<div>
<input onChange={handleValue}/>
<Fragment key={value}> {/* important for React to auto update these inputs */}
{inputs}
</Fragment>
</div>
);

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超3個(gè)贊
您需要將統(tǒng)一值和剩余值存儲在 2 個(gè)單獨(dú)的狀態(tài)中
const [valueAll, setValueAll] = useState(0)
const [value, setValue] = useState({
input1: 0,
input2: 0,
input3: 0
})
const handleValue = (e: any) => {
setValueAll(e.target.value)
let newValue = value;
Object.keys(newValue).forEach(key => {
newValue[key] = e.target.value
});
setValue(newValue)
}
<input value={valueAll} onChange={handleValue} />
<input value={value.input1} name="input1" onChange={handleEachValue} />
<input value={value.input2} name="input2" onChange={handleEachValue} />
<input value={value.input3} name="input3" onChange={handleEachValue} />
你可以在這里查看代碼和框

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊
問題似乎來自所有具有相同value(value狀態(tài))的輸入。這為您提供了一種簡單的方法來一次更新所有值,但如您所見,不允許單獨(dú)更新它們。他們可以改變的唯一方法是在統(tǒng)一值setValue()中的事件中調(diào)用if 。onChange
要更正此問題,您希望每個(gè)值都具有單獨(dú)的狀態(tài)。這可以通過在狀態(tài)中存儲一組值來完成,但為簡單起見,我只是實(shí)現(xiàn)了額外的useState鉤子。
export const Form = () => {
const [unifyValue, setUnifyValue] = useState(0);
const [firstValue, setFirstValue] = useState(0);
const [secondValue, setSecondValue] = useState(0);
const [thirdValue, setThirdValue] = useState(0);
const handleUnifyValue = (e: any) => {
setUnifyValue(e.target.value);
setFirstValue(e.target.value);
setSecondValue(e.target.value);
setThirdValue(e.target.value);
}
const handleFirstValue = (e: any) => {
setFirstValue(e.target.value);
}
const handleSecondValue = (e: any) => {
setSecondValue(e.target.value);
}
const handleThirdValue = (e: any) => {
setThirdValue(e.target.value);
}
return (
<form>
{/* Unify input to set the same value in inputs below */}
<input value={unifyValue} onChange={handleUnifyValue} />
{/* Without onChange, input will be set readOnly automatically, so I tried adding something */}
<input value={firstValue} onChange={handleFirstValue} />
<input value={secondValue} onChange={handleSecondValue} />
<input value={thirdValue} onChange={handleThirdValue} />
</form>
)
}
如果我能讓狀態(tài)數(shù)組正常工作,我會用那個(gè)例子來更新它。這將允許超過 3 個(gè)輸入,并減少對這么多useState和handleXValue行的需求。
添加回答
舉報(bào)