2017-04-09 1 views
6

는 내가 직접 반작용의 상태를 변이 안 알아,하지만 어떻게 상황에 대해 내가 기능을 사용할 때 :이 통과 객체를 수정하는 실수setState 함수에 전달 된 상태를 mutate 할 수 있습니까?

onSocialClick = e => { 
    const id = e.target.value; 
    this.setState((prevState, props) => { 
     prevState[id] = !(prevState[id]); 
     return prevState; 
    }); 
}; 

인가를?

편집 :

그것은 우리의 대부분은 잘못 여기있는 것으로 나타났다. 반응 : docs state it clearly now :

prevState는 이전 상태를 나타냅니다. 그것은 직접 변이해서는 안됩니다. 대신 prevState 및 props의 입력을 기반으로 새 객체를 작성하여 변경 사항을 표현해야합니다.

@ Tomáš Hübelbauer에게 감사의 말씀을 전합니다.

+3

을 것 prevState 인수와 함께 그러나 setState를 당신이 prevState의 값에 따라 상태를 수정할 때 사용되며 그것은 prefectly 시나리오 및 처리 할 수있는 더 깨끗한 방법을 맞는 상태를 직접 수정한다는 것은'this.state = ...'가 아니라'setState'를 사용해야한다는 것을 의미합니다. 만약 당신이 - 당신이 들어오는 매개 변수로 사용하는 모든 것은 괜찮습니다. – elmeister

+0

@ Tomasz 코드 스 니펫에 대한 의문이 생겼기 때문에 후속 질문을했습니다. 이 흥미로운 것을 발견 할 수 있습니다 : https://stackoverflow.com/q/47339643/2715716 –

+1

@ TomášHübelbauer 감사합니다! 나는 편집을했다. – Tomasz

답변

-1

상태를 직접 변경하는 것이 좋습니다. 또한, 이전 상태를 돌연변이시킨 다음 돌려주는 것은별로 의미가 없습니다. 당신이 원하는 모든 state[id]의 상태를 전환하는 경우로 코드를 수정처럼 더 :

onSocialClick = e => { 
    const id = e.target.value; 
    this.setState({this.state[id]: !this.state[id}); 
}; 
+0

이것은 권장하지 않습니다. OP가 사용하는 기능적인 방법을 사용해야합니다. (어쩌면 관심있는 소품을 직접 사용할 수도 있습니다.) –

3

클리너 방법은 당신이 원하는 속성을 직접 참조하는 것입니다 편집 :

doIt =() => this.setState(({ [id]: prevValue }) => ({ 
    [id]: !prevValue, 
})); 
+0

'[id]'가'state'의 직접적인 자식이 아니라 한 레벨 내 경우에 나는'[id]'배열을 가지고 있으며, 다른 모든 Q/A와 기사들은 복사본을 만들 것을 제안하고 있지만 당신의 해결책이 더 명확하다는 것을 알게된다. –

+0

@ Al.G. 아마도'find'를 사용해야 할 것입니다. 올바른 배열 요소에 액세스하기위한 올바른 색인을 얻으려면 –

1

당신이하는 방식은 잘못이 아닙니다. 그 인수를 수정하고 그것을 반환하는 완벽하게 okk. 그것은 실수 : 아니하지 않다가

onSocialClick = e => { 
    const id = e.target.value; 
    this.setState((prevState, props) => { 
     return {[id] : !(prevState[id])}; 
    }); 
}; 
관련 문제