이것이 React 상태가 업데이트되지 않는 이유입니다!
8009 단어 javascriptreacttutorial
목표
수많은 항목의 목록이 있고 각 항목에는 버튼이 있고 클릭할 때 값이 증가한다고 가정해 보겠습니다.
내 시도
내 상태는 다음과 같습니다.
const [Test, setTest] = useState([
{
name: 'Eric',
value: 0
},
{
name: 'Frank',
value: 20
},
// and more....
])
렌더링 부분은 다음과 같습니다.
<div className="App">
{
Test.map((item, idx) => (
<button
key={idx}
onClick={(e) => {
e.preventDefault()
setTest((value) => {
value.find(element => element.name === item.name).value += 1
return value
})
}}
>
{
item.name + ': ' + item.value
}
</button>
))
}
</div>
보자...
두 번째 시도 (내가 이 실수를 하는 경우가 90% 😷)
setState의 업데이터를 사용해야 한다는 것을 배웠지만 잘못된 방법으로 사용한 것 같습니다🤒 상태를 직접 변경했습니다. 이전 상태의 새 복사본을 만들어 문제를 해결해 보겠습니다.
//...
<button
key={idx}
onClick={(e) => {
e.preventDefault()
setTest((value) => {
let temp = value
temp.find(element => element.name === item.name).value += 1
return temp
})
}}
>
{
item.name + ': ' + item.value
}
</button>
//...
내 솔루션
작업을 수행하는 코드:
//...
setTest((value) => {
let temp = [...value]
temp.find(element => element.name === item.name).value += 1
return temp
})
//...
스프레드 연산자
...
원래 상태를 변경하지 않도록 원래 상태의 복사본을 만드는 데 도움이 되지만 이것은 단지 한 수준의 얕은 복사본이므로 중첩된 개체를 처리할 때는 여전히 권장되지 않습니다.우리의 경우 상태 배열의 요소는 객체입니다. 즉, 요소가 참조임을 의미하며 요소를 변경하는 것은 여전히 원래 상태를 변경하는 것입니다.
게다가 중첩된 상태는 React 상태의 의도된 용도가 아닙니다. 심하게 중첩된 상태를 만들고 있다면 올바르게 사용하고 있지 않은 것입니다!🦥
당신이 그것에 대해 어떻게 생각하십니까? 더 나은 솔루션을 알고 있습니까? 이 문제를 생각해 냈고 어떻게 해결합니까? 댓글로 알려주세요!🙈 건배!
Reference
이 문제에 관하여(이것이 React 상태가 업데이트되지 않는 이유입니다!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/k4l4p/this-is-why-your-react-state-might-not-be-updating-5fe3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)