2017-10-23 8 views
1

Reux와 Immutable.js를 사용하고 있습니다. - 내 상태는 변경 불가능한 개체로 구성되어 있으며 정상적으로 작동합니다.React/Redux/Immutable.js - 변경 불가능한 작업 (오류 : 작업은 일반 개체 여야 함)

이제 동작을 일반 Javascript 객체 대신 변경 불가능한 객체로 만들려고합니다.

내 reducers 및 작업 작성자가 작동하고 모든 유닛 테스트가 통과하지만 React 구성 요소에서 불변 액션 개체를 사용하려고하면 내 Action 개체가 일반 자바 스크립트 개체가 아닌 불변의 맵이므로 오류가 발생합니다.).

export const cancel =() => { 
    return Immutable.Map({ 
     type: ACTION_TYPES.get('CANCEL') 
    }) 
} 

내 감속기이 같다 (단위 테스트 때 작동하지만 때문에 오류를 호출하지 반응) : 여기

export const site = (state = initialState, action) => { 
    const actionType = null 
    try { 
     action.get('type') 
    } catch (e) { 
     return state 
    } 
    switch (actionType) { 
     ... so on and so forth ... 

이 경우 검사 오류입니다 여기

내 작업입니다 구성 요소 :

FAIL src/App.test.js 
    ● Test suite failed to run 

    Actions must be plain objects. Use custom middleware for async actions. 

Immutable.js 개체가 작업으로 작동하도록 추가해야하는 미들웨어는 무엇입니까? ? 문서에서 찾을 수 없습니다 ...

+0

자신 만의 미들웨어를 작성해야 할 수도 있습니다. 나는 불변의 맵으로 행동하는 데 충분한 이점이 있다고 생각하지 않을 것이다. dev 툴링과 다른 라이브러리의 대부분은 액션을 평범한 객체로 기대한다. – wgcrouch

답변

1

What middleware do I need to add so that my Immutable.js objects work as actions? I cannot find it in the docs...

사용자 지정 동작을 작성하려면 직접 미들웨어를 만들어야합니다. 이런 식으로 뭔가 : 난 정말 당신이 불변의 객체 등의 작업을 수행에서 얻을 어떤 이점이 표시되지 않습니다 말했다

import { isImmutable } from 'immutable'; 

// Allows immutable objects to be passed in as actions. Unwraps them, then 
// forwards them on to the reducer (or the next middleware). 
const immutableMiddleware = store => next => action => { 
    if (isImmutable(action)) { 
     next(action.toJS()) 
    } else { 
     next(action); 
    } 
}; 

. 액션은 대개 필요할 때 바로 생성되며 다시 액세스하지 않으므로 돌연변이로부터 보호하는 것이 거의 중요하지 않습니다. 그리고 당신은 전형적으로 그것들을 복제하지 않을 것이기 때문에, 불변 객체가 새로운 불변 ​​객체를 생성 할 때 제공하는 성능상의 이점은 실현되지 않을 것입니다.