2017-03-24 5 views
0

redux 저장소에 animals이 있다고 가정 해 봅시다. 그것은 정규화 된 객체이고, 키는 id이고 값은 객체 자체입니다. 각 동물의 열쇠는 is_dog입니다. 비용이 많이 드는 계산 속성을 잠재적으로 비싸지 않게 재 계산하는 것을 피하는 방법

animals: { 
    'id1': { location: 'foo', is_dog: true, name: 'Dog1' }, 
    'id2': { location: 'foo', is_dog: false, name: 'Cat1' }, 
    'id3': { location: 'foo', is_dog: false, name: 'Cat2' }, 
    'id4': { location: 'foo', is_dog: true, name: 'Dog2' }, 
} 

내가 접속 DogsList 가게 보이는 상태와 UI 성분 dogIds의 배열 요소에 전달 반응이있다.

dogIds = _.chain(state.animals).filter('is_dog').map('id').value();

['id1', 'id4']을 반환이 위의 예에서 : dogIds의 계산은 같은 것입니다.

그러나,이 전 동물의 수천 가정하자, 그리고 각 동물은 내가 dogIds은 어떤 동물을위한 경우 is_dog 변경을 바꿀 것을 알고 등 lastFed, currentLocation 말을 자주 변경 다른 특성을 가지고,하지만 난 아니에요 모든 동물에 대한 모든 변경에 불필요하게 필터 및 맵 계산을 수행하지 않는 방법을 확실히 알고 있어야합니다. reselect을 사용해 보았지만이 경우에는 도움이되지 않는다고 생각합니다.

dogIds을 적절한 것으로 저장하고 관련성이있는 경우에만 수동으로 업데이트하려고합니다. 새 개가 animals에 추가되거나 고양이가 개로 변경 될 때처럼 (내 유추가 여기에 따라 다릅니다.) 그러나 나는 redux 상점에서 계산 된 속성을 유지함으로써 내가 잘못한 것처럼 느낍니다.

답변

1

아마도 shouldComponentUpdate과 같은 React의 라이프 사이클 메소드를 사용할 수 있습니다. 여기서는 newDogIDs !== oldDogIDs이 맞는지 여부를 평가 한 다음 다른 경우에만 처리합니다.

+0

감사합니다. 좋은 의견입니다. 내가 피하려고했던 것은 실제 '필터'계산이지만, 더 많이 생각하면할수록 수백만 마리의 동물을 가지고 있지 않으면 너무 비싸지 않을 것입니다. –

+0

생각해 보면, 나는 당신의 질문을 오해했을 수도 있다고 생각합니다. 동물의 목록이 업데이트 될 때마다 계산을 수행해야합니다. 그렇지 않으면 개가 고양이가되었는지 등을 알 수 없습니다. – rorymorris89

+0

1) 동물 추가/제거 2) 동물 유형 변경 (개에서 고양이로)을 처리하는 경우 'dogsList'를 다시 계산해야 할 때를 알아야합니다 (그러한 행동이 발생하지 않았다면 , 아무 필요도 없다) – rorymorris89