동적 키 이름을 가진 Reactjs setState ()?


248

편집 : 이것은 중복입니다, 여기를 참조 하십시오

상태를 설정할 때 동적 키 이름을 사용하는 예를 찾을 수 없습니다. 이것이 내가하고 싶은 일입니다.

inputChangeHandler : function (event) {
    this.setState( { event.target.id  : event.target.value } );
},

여기서 event.target.id는 업데이트 할 상태 키로 사용됩니다. 이것이 React에서 가능하지 않습니까?


4
이것은 동적 객체 키와 관련된 질문의 복제본입니다. 반응이 구체적이지 않습니다
Cory Danielson

9
var newstate = {}; newstate [event.target.id] = event.target.id; this.setState (newstate);
Cory Danielson

감사합니다. 일반적으로 객체를 사용하는 데 익숙하지 않았습니다.
trad


@trad이 문제를 겪고 있지만 초기 상태에 무엇을 넣었습니까? 상관 없어요?
Raphael Onofre

답변:


280

@Cory의 힌트 덕분에 이것을 사용했습니다.

inputChangeHandler : function (event) {
    var stateObject = function() {
      returnObj = {};
      returnObj[this.target.id] = this.target.value;
         return returnObj;
    }.bind(event)();

    this.setState( stateObject );    
},

ES6 또는 Babel 변환기를 사용하여 JSX 코드를 변환하는 경우 계산 된 특성 이름으로 이를 수행 할 수 있습니다.

inputChangeHandler : function (event) {
    this.setState({ [event.target.id]: event.target.value });
    // alternatively using template strings for strings
    // this.setState({ [`key${event.target.id}`]: event.target.value });
}

27
bablejs를 사용하여 코드를 작성하는 경우 이에 대한 새로운 구문도 있습니다. 다음을 사용할 수 있습니다computed property names
Cory Danielson

두 번째 방법은 Windows (IE, Chrome)의 브라우저에서 구문 오류를 발생시킵니다. 아무도 눈치 채지 못했습니까?
benjaminz

진술하는 방법?
Muneem Habib

감사합니다 trad. 이것은 <Radio />구현 을 위해 코드 복제를 피하기 위해 찾고 있던 것입니다.
Adesh M

6
this.setState({ [event.target.id]: event.target.value });다음 과 같이 계산 된 속성 이름을 사용하여 상태를 설정하면 다음을 사용하여 해당 상태에 어떻게 액세스 this.state......합니까?
user3574492

142

여러 개의 제어 된 입력 요소를 처리해야하는 경우 각 요소에 이름 속성을 추가하고 핸들러 함수가 event.target.name 값에 따라 수행 할 작업을 선택하도록 할 수 있습니다.

예를 들면 다음과 같습니다.

inputChangeHandler(event) {
  this.setState({ [event.target.name]: event.target.value });
}


7
[event.target.name] 주위의 괄호는 무엇을 나타 냅니까? 왜 필요한가요?
user798719

1
다음과 같이 각 요소의 이름을 따로 지정하는 일반적인 접근 방식과 비교합니다. setState ({userName : e.target.value}); 이것은 여러 형태의 요소를 배열로 처리하며 각각의 개별 요소를 설정할 필요가 없습니다
vikram jeet singh

1
그러나 여전히 같은 방식으로 해당 상태에 액세스하는 방법은 무엇입니까? 좋아 this.state([event.target.name])?
Kirankumar Dafda

1
생각 MDN 웹 문서를 하고 이 게시물은 우리가 괄호가 필요한 이유를 설명합니다.
Kelli

46

내가 이것을 어떻게 달성했는지 ...

inputChangeHandler: function(event) {
  var key = event.target.id
  var val = event.target.value
  var obj  = {}
  obj[key] = val
  this.setState(obj)
},

나는 비슷한 방법을 사용했지만 문제는 여전히 구성 요소를 렌더링하지 않았으며 기둥을 게시하여 게시했습니다 (이를 포함하여 : D 포함). 어딘가 이것을 발견했습니다 this.forceUpdate();. 나중에 문제가 무엇인지 보자 !!
xploreraj

24

디스트 럭쳐링을 사용하여 코드를 리팩터링하고 깔끔하게 보이도록 추가하고 싶었습니다.

inputChangeHandler: function ({ target: { id, value }) {
    this.setState({ [id]: value });
},

10

다음과 .map같은 작업으로 루프에서 :

{
    dataForm.map(({ id, placeholder, type }) => {
        return <Input
            value={this.state.type}
            onChangeText={(text) => this.setState({ [type]: text })}
            placeholder={placeholder}
            key={id} />
    })
}

[]in type매개 변수에 유의하십시오 . 도움이 되었기를 바랍니다 :)


10

나는 비슷한 문제가 있었다.

두 번째 수준 키가 변수에 저장된 상태를 설정하고 싶었습니다.

예 : this.setState({permissions[perm.code]: e.target.checked})

그러나 이것은 유효한 구문이 아닙니다.

이것을 달성하기 위해 다음 코드를 사용했습니다.

this.setState({
  permissions: {
    ...this.state.permissions,
    [perm.code]: e.target.checked
  }
});


2

나는 예쁘고 간단한 해결책을 찾고 있었고 이것을 발견했습니다.

this.setState({ [`image${i}`]: image })

도움이 되었기를 바랍니다


1
this.setState({ [`${event.target.id}`]: event.target.value}, () => {
      console.log("State updated: ", JSON.stringify(this.state[event.target.id]));
    });

따옴표 문자를 명심하십시오.


0

사전이있는 상태는 다른 값을 잃지 않고 일부 키를 업데이트합니다.

state = 
{   
    name:"mjpatel"  
    parsedFilter:
    {
      page:2,
      perPage:4,
      totalPages: 50,
    }
}

해결책은 다음과 같습니다

 let { parsedFilter } = this.state
 this.setState({
      parsedFilter: {
        ...this.state.parsedFilter,
        page: 5
      }
  });

여기에서 "페이지"키의 값을 값 5로 업데이트하십시오.


-4

다음과 같은 스프레드 구문을 사용할 수 있습니다.

inputChangeHandler : function (event) {
    this.setState( { 
        ...this.state,
        [event.target.id]: event.target.value
    } );
},

7
React는 객체 병합을 수행 할 것입니다. 이것은 나쁜 습관입니다.
Rohmer

1
기본적으로 내부 객체가 있고 내부 객체에서 하나의 속성을 변경하려면 다음과 같이하십시오. this.setState ({selectedItems : {... selectedItems, [item.id] : true}})
Eran Or
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.