ReactJs 선택기 일반 함수를 사용할 때 상태가 루프에서 트리거됩니다.

Lumaluis

주요 문제 : 선택기 내부의 함수를 사용하여 데이터를 재 구조화하고 다른 변수를 조인하려고했습니다.이 경우에는 내 그룹과 자식을 항목으로 합 쳤지 만 문제는 함수가 무한 루프에서 매번 호출된다는 것입니다. 상태는 변경되지 않습니다.

이 선택기가 있습니다. const groups = useSelector(state => selectProductGroups(state));

기능은 다음과 같습니다.

  const groups = state.PlatformsReducer.groups;
  const items = state.PlatformsReducer.items;
  return groups.reduce((ac, g) => {
    g.items = items.filter(i => i.groupId == g.productNumber);
    if (ac[g.platformId]) {
      ac[g.platformId].push(g);
    } else {
      ac[g.platformId] = [g];
    }
    return ac;
  }, {});
};

So when I use a useEffect to detect if the groups variable has changed the useEffect is triggered in a loop despite the variable groups still empty.

Do you know why? or How to prevent this.

I now the problem is the function in the selector, but I don't know how to prevent this case.
Jacob Smit

이것은 useSelector후크가 내부적 으로하는 일과 관련이 있습니다 .

useSelector선택기를 실행하고 결과가 이전에받은 결과 (참조 비교)와 동일한 지 확인합니다. 결과가 다른 경우 새 결과가 저장되고 다시 렌더링됩니다. 결과가 동일하면 이전 결과가 대체되지 않고 다시 렌더링이 트리거되지 않습니다.

이것이 의미하는 바는 스토어가 업데이트 될 때마다 상태와 관련이없는 부분이더라도 결과가 변경되었는지 확인하기 위해 복잡한 함수가 실행된다는 것입니다. 귀하의 경우에는 항상 새로운 참조이므로 항상 변경됩니다.

이를 처리하는 가장 좋은 방법은 선택기를 가능한 한 단순하게 유지하거나 reselect에서 제공하는 것과 같은 더 복잡한 메모를 사용하는 것입니다.

다음은 선택기를 간단하게 유지하면서 사용자 지정 후크를 사용하여 제품 그룹 선택을 쉽게 재사용 할 수있는 방법의 예입니다.

const useProductGroups = () => {
    // Get groups from the store. 
    // As the selector does not create a new object it should only 
    // trigger a rerender when groups changes in the store.
    const groups = useSelector(state => state.PlatformsReducer.groups);

    // Get items from the store, 
    // As the selector does not create a new object it should only 
    // trigger a rerender when items changes in the store.
    const items = useSelector(state => state.PlatformsReducer.items);

    // Reduce the group collection as desired inside of a useMemo 
    // so that the reduction only occurs when either items or groups 
    // changes.
    const productGroups = useMemo(() => {
        return groups.reduce((ac, g) => {
            g.items = items.filter(i => i.groupId == g.productNumber);

            if (ac[g.platformId]) {
                ac[g.platformId].push(g);
            } else {
                ac[g.platformId] = [g];
            }

            return ac;
        }, {});
    }, [groups, items] /* dependency array on items / groups */);

    // return the calculated product groups
    return productGroups;
}

그런 다음 함수 구성 요소에서 사용자 지정 후크를 사용할 수 있습니다.

const groups = useProductGroups();

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ReactJs 선택기 일반 함수를 사용할 때 상태가 루프에서 트리거됩니다.

분류에서Dev

react-bootstrap-typeahead 사용자가 힌트를 선택할 때가 아니라`Enter`에서 콜백 (업데이트 상태)을 어떻게 트리거합니까?

분류에서Dev

동일한 <li> 태그 내에서 요소를 선택하려고 할 때 사용할 선택기

분류에서Dev

for 루프를 사용하여 csv 파일을 읽을 때 함수 반환을 추가 할 수 없습니다.

분류에서Dev

클래스 어딘가에 상태를 설정할 때마다 componentDidMount가 트리거됩니까?

분류에서Dev

내 보낸 비동기 함수에서 사용할 때 pouchDB 쿼리가 빈 개체를 반환합니다.

분류에서Dev

네트워크를 사용할 수없는 상태에서 앱을 처음 실행할 때 Google 태그 관리자가 기본 컨테이너 파일에서 모든 값을 가져올 수 없습니다.

분류에서Dev

공통 함수를 사용하여 REACT에서 사용자가 클릭 할 때 여러 어레이 기반 유사한 상태의 변경을 처리합니다.

분류에서Dev

클라이언트가 요청할 때 함수의 상태를 얻기 위해 함수 내에서 zmq를 사용하는 방법 (비 차단 방식으로)?

분류에서Dev

cheerio를 사용할 때이 선택기에 오류가 있습니다.

분류에서Dev

일반 상태를 구성 요소에 매핑 할 때 다시 선택해야합니까?

분류에서Dev

선택적 {parameter}를 사용할 때 ui-router 상태 확인 항목이 두 번 평가됩니다.

분류에서Dev

반응 선택에서 isClearable을 사용할 때 이벤트가 null입니다.

분류에서Dev

프로세스가 실행 중일 때 파이썬 기반 GUI에서 버튼을 선택할 수 있습니다.

분류에서Dev

PermissionDeniedException : '[UserImpl :'admin ']'사용자가 '현재 상태'일치가 없기 때문에 작업 ID 1에서 '시작'작업을 실행할 수 없습니다.

분류에서Dev

<귀하의 앱>에서 Google Play 서비스에 문제가 있습니다.-GoogleApiClient를 사용할 때 항상 onConnectionFailed가 트리거됩니다.

분류에서Dev

ReactJS-상태 변수가 숫자 일 때 SetState가 상태를 업데이트하지 않습니다.

분류에서Dev

클릭 후 선택 상자에서 부트 스트랩 선택이 사라집니다. 마우스를 가리킬 때만 표시됩니다.

분류에서Dev

ReactJS가 서버 측 렌더링 된 DOM을 기반으로 상태를 초기화 할 수 있습니까?

분류에서Dev

함수가 if 문을 사용할 때 Jest로 ReactJs에서 테스트를 올바르게 만드는 방법

분류에서Dev

Angular 배열에서 splice ()를 사용할 때 jQuery 선택기가 다음 항목으로 이동합니다.

분류에서Dev

경고 제거 : "변수 '결과'는 C ++에서 'if'조건이 거짓 일 때마다 초기화되지 않은 상태로 사용됩니다."

분류에서Dev

CSS 선택기에 일반 요소를 포함 할 수 있습니까?

분류에서Dev

목표 C에서 이미지 선택기 컨트롤러를 사용하는 동안 iPad 이미지가 잘 리거나 크기가 조정됩니다.

분류에서Dev

C # "현재 선택 항목이 일반 텍스트 콘텐츠 컨트롤을 부분적으로 다루기 때문에이 메서드 또는 속성을 사용할 수 없습니다."

분류에서Dev

.Net MVC에서 EnumDropDownListFor를 사용할 때 어떤 옵션 태그가 선택되었는지에 관계없이 첫 번째 선택 가능한 옵션 만 반환됩니다.

분류에서Dev

스캔 반복기를 사용할 때 반환 된 결과와 다음 반복간에 상태를 어떻게 공유 할 수 있습니까?

분류에서Dev

Java에서 ImageIcon을 사용할 때 Java에서 기본 경로를 선택할 수 없습니다.

분류에서Dev

Ngrx 저장소 선택기가 상태에 액세스 할 수 없습니다.

Related 관련 기사

  1. 1

    ReactJs 선택기 일반 함수를 사용할 때 상태가 루프에서 트리거됩니다.

  2. 2

    react-bootstrap-typeahead 사용자가 힌트를 선택할 때가 아니라`Enter`에서 콜백 (업데이트 상태)을 어떻게 트리거합니까?

  3. 3

    동일한 <li> 태그 내에서 요소를 선택하려고 할 때 사용할 선택기

  4. 4

    for 루프를 사용하여 csv 파일을 읽을 때 함수 반환을 추가 할 수 없습니다.

  5. 5

    클래스 어딘가에 상태를 설정할 때마다 componentDidMount가 트리거됩니까?

  6. 6

    내 보낸 비동기 함수에서 사용할 때 pouchDB 쿼리가 빈 개체를 반환합니다.

  7. 7

    네트워크를 사용할 수없는 상태에서 앱을 처음 실행할 때 Google 태그 관리자가 기본 컨테이너 파일에서 모든 값을 가져올 수 없습니다.

  8. 8

    공통 함수를 사용하여 REACT에서 사용자가 클릭 할 때 여러 어레이 기반 유사한 상태의 변경을 처리합니다.

  9. 9

    클라이언트가 요청할 때 함수의 상태를 얻기 위해 함수 내에서 zmq를 사용하는 방법 (비 차단 방식으로)?

  10. 10

    cheerio를 사용할 때이 선택기에 오류가 있습니다.

  11. 11

    일반 상태를 구성 요소에 매핑 할 때 다시 선택해야합니까?

  12. 12

    선택적 {parameter}를 사용할 때 ui-router 상태 확인 항목이 두 번 평가됩니다.

  13. 13

    반응 선택에서 isClearable을 사용할 때 이벤트가 null입니다.

  14. 14

    프로세스가 실행 중일 때 파이썬 기반 GUI에서 버튼을 선택할 수 있습니다.

  15. 15

    PermissionDeniedException : '[UserImpl :'admin ']'사용자가 '현재 상태'일치가 없기 때문에 작업 ID 1에서 '시작'작업을 실행할 수 없습니다.

  16. 16

    <귀하의 앱>에서 Google Play 서비스에 문제가 있습니다.-GoogleApiClient를 사용할 때 항상 onConnectionFailed가 트리거됩니다.

  17. 17

    ReactJS-상태 변수가 숫자 일 때 SetState가 상태를 업데이트하지 않습니다.

  18. 18

    클릭 후 선택 상자에서 부트 스트랩 선택이 사라집니다. 마우스를 가리킬 때만 표시됩니다.

  19. 19

    ReactJS가 서버 측 렌더링 된 DOM을 기반으로 상태를 초기화 할 수 있습니까?

  20. 20

    함수가 if 문을 사용할 때 Jest로 ReactJs에서 테스트를 올바르게 만드는 방법

  21. 21

    Angular 배열에서 splice ()를 사용할 때 jQuery 선택기가 다음 항목으로 이동합니다.

  22. 22

    경고 제거 : "변수 '결과'는 C ++에서 'if'조건이 거짓 일 때마다 초기화되지 않은 상태로 사용됩니다."

  23. 23

    CSS 선택기에 일반 요소를 포함 할 수 있습니까?

  24. 24

    목표 C에서 이미지 선택기 컨트롤러를 사용하는 동안 iPad 이미지가 잘 리거나 크기가 조정됩니다.

  25. 25

    C # "현재 선택 항목이 일반 텍스트 콘텐츠 컨트롤을 부분적으로 다루기 때문에이 메서드 또는 속성을 사용할 수 없습니다."

  26. 26

    .Net MVC에서 EnumDropDownListFor를 사용할 때 어떤 옵션 태그가 선택되었는지에 관계없이 첫 번째 선택 가능한 옵션 만 반환됩니다.

  27. 27

    스캔 반복기를 사용할 때 반환 된 결과와 다음 반복간에 상태를 어떻게 공유 할 수 있습니까?

  28. 28

    Java에서 ImageIcon을 사용할 때 Java에서 기본 경로를 선택할 수 없습니다.

  29. 29

    Ngrx 저장소 선택기가 상태에 액세스 할 수 없습니다.

뜨겁다태그

보관