2017-01-26 1 views
0

에 도달하기 전에 발견 된이다 보기에서 감속기에 수정 된 appClasses를 보내 appClasses 상태를 업데이트하려고합니다. 하지만 감속기에 도달하기 전에 오류가 발생합니다. 당신이 볼 수 있듯이 나는에 새로 수정 appClasses를 사용하기 때문에돌아 오는 상태 변이 나는 액션 this.props.appClasses 이에보기에서 보내고있다 감속기

export function handleToggleAppClass(appClasses, parentAppClassId, appClassId) { 
    // console.log('handleToggleAppClass', appClassId, this.appClasses[appClassId]); 

    if (appClass.parentAppClassId == 0) { 
    // Flip the appClass Show Property 
    appClasses[appClass.appClassId].show = appClasses[appClass.appClassId].show ? false : true; 

    if (Object.keys(appClasses[appClass.appClassId].children).length !== 0) { 
     // Regardless if we enable or disabled the parent, all children should be disabled 
     for (var childKey in appClasses[appClass.appClassId].children) { 
     appClasses[appClass.appClassId].children[childKey].show = false; 
     } 
    } 
    } else { 
    // If we are enabling a child, make sure parent is disabled 
    if (!appClasses[appClass.parentAppClassId].children[appClass.appClassId].show) { 
     appClasses[appClass.parentAppClassId].show = false; 
    } 
    appClasses[appClass.parentAppClassId].children[appClass.appClassId].show = appClasses[appClass.parentAppClassId].children[appClass.appClassId].show ? false : true; 
    } 

    dispatch(handleUpdateInitialSourceFetch(appClasses)); 

    return { type: types.TOGGLE_APP_CLASS, appClasses }; 
} 

, 나는 작업에 appClasses을 수정할 않습니다

하는 상태 돌연변이는이 작업입니다 감지되었습니다 다른 감속기에서 다른 상태를 업데이트하십시오. 여기에 appClasses 상태 (한 감속기에 있음)를 수정하고 수정 된 appClasses를 함수 호출 onother action dispatch (handleUpdateInitialSourceFetch (appClasses))에 전달하여 수정하려고합니다. 내가 (사용자의 선택을 취급하는 다른 감속기에) 다른 상태 selection.appClassesIds을 수정할 :

const selection = { 
    timespan: "-3660", 
    direction: 0, 
    appClassIds: [] 
}; 


export function updateAppClassesIds(appClasses) { 
    var appClassIds = []; 
    for (var key in appClasses) { 
    if (appClasses[key].show) appClassIds.push(key); 
    if (Object.keys(appClasses[key].children).length !== 0) { 
     // Regardless if we enable or disabled the parent, all children should be disabled 
     for (var childKey in appClasses[key].children) { 
     if (appClasses[key].children[childKey].show) appClassIds.push(childKey); 
     } 
    } 
    } 

    return { type: types.UPDATE_APP_CLASSES_IDS, appClassIds }; 
} 

어떻게 그 오류를받지 않고 작업에보기에서 appClasses 변수를 보낼 수 있습니다. 또는 선택 항목과 appClasses 상태를 하나의 큰 상태로 두어 서로에 의존하기 때문에 두 상태 모두에 액세스 할 수 있어야합니까?

{ 
    type: types.TOGGLE_APP_CLASS, 
    payload: appClass.appClassId 
} 

주 수정 수행해야합니다 :

+0

'appClasses'가 이미 상태입니까? 나는 네가 직접 국가에 돌연변이를 일으키고 있니? –

+0

예. this.props.appClasses에서 얻은 상태입니다. –

+0

상태를 직접 변경해서는 안됩니다. 그것은 Redux의 주요 철학 중 하나입니다. 일반적으로이 전환은 여기에 전체 배열을 설정하는 것이 아니라 ID와 새 상태를 전달하여 나타냅니다. 감속기에서는 이전 상태를 복사하고 새 앱 클래스 상태로 접합합니다. –

답변

0

무슨 말인지 "앱 클래스를 전환"뭔가에 해당하는 페이로드 앱 클래스의 전체 목록은 아니지만, 가까운 무언가가 있다는 것입니다 감속기 –에서 명시 적으로 what reducers are for입니다.

감속기는 이전 상태와 동작을 취해 다음 상태를 반환하는 순수한 함수입니다.

(a) 작업 작성자에서 상태를 직접 수정하고 (b) 잘못된 위치에서 상태를 수정하려고합니다. 일단 올바른 장소에서 물건을 만들기 시작하면이 문제를 해결하는 것이 훨씬 쉽습니다.

감속기에서 slice (배열 인 경우)이거나 개체 복제를 수행하여 단일 토글을 업데이트하고 상태를이 새로운 상태 복사본으로 설정하십시오. 하지만 당신은 이 아니고은 변이 상태를 직접적으로 나타냅니다. 그렇게하면 Redux가 테이블에 가져 오는 많은 것을 망칠 것입니다 (예 : 시간 이동).

+0

appClasses가 dispatch (handleUpdateInitialSourceFetch (appClasses))를 수정하도록 수정해야하는 다른 상태 "selection.appClassIds "을 업데이트하는 데 사용하기 때문에 appClasses를 수정하려고합니다. 어쩌면 하나의 감속기에서 하나의 큰 상태에서 selection.appClassIds 및 appClassesId가 있어야한다고 생각합니다. 또한 수정 사항이 복잡하다는 것을 알기 바란다. 변수 만 수정하면 코드 만 변경되어이 수정 된 변수를 감속기로 보내고 상태를 업데이트해야한다고 생각했다. 내 질문을 전체 코드로 업데이트합니다. –

+0

altjs에서 redux로 앱을 변환 중이므로 잃어 버렸으므로 감속기에서 모든 상태를 변경할 수 있습니까? –

1

수정할 appClass의 ID와 새 값 (true/false)을받는 작업을 생성하면이 작업을 수행 할 수 있습니다.

귀하의 감속 기는 가입 한 구성 요소를 통해 전파 할 수있는 상태에 대한 업데이트를 처리 할 수 ​​있어야합니다.

+0

(이것은 다소 논평에서 말한 것이지만, OP가 어려움을 겪고있는/etc 슬라이싱에 대해 논평하는 부분을 생략합니다.) –

+0

작업에서 appClasses를 사용하여 다른 상태를 업데이트하려고합니다. dispatch (handleUpdateInitialSourceFetch (appClasses))를 사용하여 appClasses에 의존하는 또 다른 액션. 하나의 감속기에서 appClasses와 selection.appClassIds를 결합해야합니까? 그들은 서로에 의존하기 때문에. appClass의 ID를 보낼 수는 있지만 함수에서 볼 수있는 것처럼 많은 논리가 있습니다. 모든 논리를 감속기에 넣을 수 있습니까? –

관련 문제