2016-07-20 1 views
0

저는 React, Redux 및 Immutable으로 게임을 해왔고 정말 싫어하는 것을 발견했습니다. fromJS 도우미를 사용하여 불변으로 파싱하는 서버에서 반환 된 큰 JSON 데이터 집합이 있습니다.Immutable.js - fromJS가지도 대신 레코드를 생성합니다.

모든 구성 요소의 속성에 액세스 할 때 Immutable 특정 getter 및 setter를 사용해야합니다. 내 이슈는 바뀔 수 없다는 말에 변명했다. 내가 바꾸기로 결정한 것은 각 컴포넌트를 거치고 그에 따라 조정해야한다는 것이다.

내 질문에 현재 나와있는 fromJS는 목록 및지도를 반환하며지도를 레코드로 대체 할 수 있습니까?

그러면 구성 요소가 변경되지 않고 고유 속성을 갖게됩니다 (예 : 이 아닌 user.get('name')).

리바이벌에 대해 조금 읽었지만 비슷한 사용 사례를 찾을 수 없습니다.

내가 가진 플레이를 했어 다음하지만 난 그게 최선의 해결책인지 확실 해요 :

var result = Immutable.fromJS({ 

    id: 2039428947, 
    name: 'James', 
    email: '[email protected]', 
    country: 'United Kingdom' 

}, function(key, value) { 

    var obj = Immutable.Record(value.toJS()); 

    return new obj(value); 

}); 

감사 ImmutableJS을 사용하여에 관심있는 다른 사람들을위한

+0

변경할 필요가 없습니다. 사용하지 않아도됩니다. 여러분에게 더 잘 어울리는 [대체 방법] (https://github.com/rtfeldman/seamless-immutable)이 있거나 감속기에있는 주에서 새로운 원시 개체를 만들 수 있습니다. – robertklep

답변

3

이뿐만 아니라 능력을 가진 구성 요소의 기본 속성을 사용하는 대신 user.get('name')의 예 user.name, 단순히 fromJS 대신 아래 함수를 사용

function convertJs(js) { 

    if(typeof js !== 'object' || js === null) { 

     return js; 

    } 

    if(Array.isArray(js)) { 

     return Seq(js).map(convertJs).toList(); 

    } 

    let obj = Record(js); 

    obj = new obj(Seq(js).map(convertJs)); 

    return obj; 

} 

명심해야 할 사항 중 하나는 속성 충돌입니다. 함수에 입력하는 개체에 ImmutableJs가 사용하는 속성 이름이 포함되어 있지 않은지 확인하십시오. 크기이 좋은 예입니다. 충돌이 있으면 다음 메시지가 표시됩니다.

Uncaught Error: Cannot set on an immutable record

+0

사용자가 "레코드"를 사용하는시기와 이유를 이해하지 못했습니다. 이것에 대해 자세히 설명하는 자료를 알고 있습니까? –

+0

문서에 따라 : https://facebook.github.io/immutable-js/docs/#/Record ** 레코드 **는 일반 js 개체로 작동하므로 동일한 방식으로 속성에 액세스 할 수 있습니다 (예 : user .name 메서드를 사용하는 ** Map **과 반대로 .name (예 : user.get ('name'); 또한 설정 한 수의 속성을 적용 할 수 있으며 내용이 명확하게 표시 될 때 문서화 된 기능을 수행 할 수 있습니다. 대조적으로지도에는 엄격하게 적용되지 않는 속성이 여러 개있을 수 있습니다. – jhdevuk

+0

속성 이름의 그 코멘트는 매우 좋았고, 나를 도와 줬다! 나에게 속성 오류가 이미 사용되었으므로 이름을 바꿔야했다. –