[英]Updating object with useState Hook after rendering text input
我正在為我們的公司構建調試清單應用程序的早期階段。 由於清單很大(其中許多清單),因此我想創建一個映射到對象的函數,並且在渲染所編寫的值之后,將使用useState Hook更新相應的狀態。
該頁面正在呈現,沒有任何問題。 僅在更改輸入后才出現問題。 而不是更新對象中的正確狀態。 邏輯似乎是在對象中添加了一個附加部分並創建了另一個輸入元素。
import React, { useState } from 'react'
const ProjectInfo = () => {
const _renderObject= () => {
return Object.keys(answers).map((obj, i) => {
return(
<div key={obj}>
<label>{answers[obj].question}</label>
<input type="text" onChange={(e, obj) => setAnswer(
{
...answers,
obj:{
value: e.target.value
}})} />
</div>
)
})
}
const [answers, setAnswer] = useState({
11:{
question:"Project Name",
value:""
},
12:{
question:"Project Number",
value:""
}
})
return(
<div>
<section>
{_renderObject()}
</section>
<p>{`Project Number is: ${answers[11].value}`}</p>
<p>{`Project Name is: ${answers[12].value}`}</p>
</div>
)
}
export default ProjectInfo
我期望狀態可以正常更新。 但是我懷疑是在我的renderObject方法中,我的.map函數的obj變量未在setAnswer函數中使用,並導致另一個字段的鍵名是“ obj”。
如果這是問題所在,是否可以在我的renderObject方法中使用setAnswer函數來使用map函數的“ obj”值,而不是將obj這個詞的實際值用作鍵?
如果不是,最好的方法是什么? 我正在考慮在屏幕底部添加一個提交按鈕,並使用onClick事件偵聽器更新所有狀態。 但是現在我想我會遇到同樣的問題,因為obj變量的范圍沒有解決。
任何幫助將不勝感激。 我只做了幾個月,任何建議和反饋也將不勝感激!
您似乎在更新狀態時未正確使用動態鍵。 另外,您需要更新鍵中的值,而不要覆蓋它。 另外, obj
不應是onChange
的第二個參數,而必須從封閉范圍接收
const _renderObject= () => {
return Object.keys(answers).map((obj, i) => {
return(
<div key={obj}>
<label>{answers[obj].question}</label>
<input type="text" onChange={(e) => setAnswer(
{
...answers,
[obj]:{
...answers[obj],
value: e.target.value
}})} />
</div>
)
})
onChange={(e, obj) => setAnswer(
{
...answers,
obj:{
value: e.target.value
}})}
在這里,您可以分散答案並添加具有目標值的另一個對象。 這就是問題。 希望你理解這一點。
嘗試這個
onChange={ (e, obj) => { const updatedAnswer = answer.map(ans => ans.question === obj.question ? {...ans,value: e.target.value }:ans) setAnswer( { ...updatedAnswer } ) } }
BW您的對象應包含密鑰的屬性ID。
這是因為您沒有正確更新鍵,並且需要在輸入onchange回調中傳遞obj,因為它會提供另一個引用,而不是映射的array(obj)。 因此,在您的情況下obj是未定義的。 這是工作代碼:
const _renderObject = () => {
return Object.keys(answers).map((obj, i) => {
return (
<div key={obj}>
<label>{answers[obj].question}</label>
<input
type="text"
onChange={e =>
setAnswer({
...answers,
[obj]: { //take obj
...answers[obj],//keep specific object question
value: e.target.value//change only specfic object value
}
})
}
/>
</div>
);
});
};
這是工作網址: https : //codesandbox.io/s/hardcore-pike-s2hfx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.