[javascript] React Hooks 오류 : 후크는 함수 구성 요소의 본문 내에서만 호출 할 수 있습니다.

useState후크를 사용할 때이 오류가 발생합니다 . 참조를 위해 반응 문서 를 살펴보면서 기본 형식으로되어 있지만 여전히이 오류가 발생합니다. 얼굴 손바닥 순간을 맞이할 준비가되었습니다 …

export function Header() {
  const [count, setCount] = useState(0)
  return <span>header</span>
}



답변

업데이트 : 2018 년 12 월

의 새 버전이 출시 react-hot-loader되었습니다 . 링크 . Hooks는 이제 즉시 작동합니다. 저자 theKashey에게 감사드립니다.

이 상용구 https://github.com/ReeganExE/react-hooks-boilerplate를 확인 하십시오.

  • React Hooks
  • 반응 핫 로더
  • Webpack, Babel, ESLint Airbnb

이전 답변 :

먼저 react@nextreact-dom@next.

그런 다음 사용 중인지 확인하십시오 react-hot-loader.

제 경우에는 핫 로더를 비활성화하면 HMR이 작동 할 수 있습니다.

https://github.com/gaearon/react-hot-loader/issues/1088을 참조 하세요 .

인용 :

예. RHL은 후크와 100 % 호환되지 않습니다. 그 뒤에는 몇 가지 이유가 있습니다.

SFC는 클래스 구성 요소로 변환됩니다. SFC에 “update”메서드가없는 한 HMR에서 강제 업데이트 할 수있는 이유가 있습니다. 업데이트를 강제하는 다른 방법을 찾고 있습니다 (예 : RHL이 SFC를 죽이고 있습니다.

“hotReplacementRender”. RHL은 React의 작업을 수행하고 이전 앱과 새 앱을 렌더링하여 병합하려고합니다. 그래서 분명히 지금은 깨졌습니다.

두 문제를 모두 완화하기 위해 PR 초안을 작성하겠습니다. 작동하지만 오늘은 아닙니다.

작동하는 더 적절한 수정이 있습니다- 콜드 API

모든 사용자 지정 유형에 대해 RHL을 비활성화 할 수 있습니다.

import { cold } from 'react-hot-loader';

cold(MyComponent);

"useState/useEffect"내부 구성 요소 소스 코드를 검색 하고 “콜드”합니다.

업데이트 :

react-hot-loader 관리자의 업데이트에 따라 다음 react-hot-loader@next과 같이 구성을 시도 하고 설정할 수 있습니다 .

import { setConfig } from 'react-hot-loader';

setConfig({
  // set this flag to support SFC if patch is not landed
  pureSFC: true
});

업데이트에 대해 @loganfromlogan에게 감사드립니다.


답변

내 문제는 react-dom모듈 업데이트를 잊었습니다 . 문제를 참조하십시오 .


답변

같은 문제가있었습니다. 내 문제는 React Router와 관련이 있습니다. 나는 실수로 사용했다

<Route render={ComponentUsingHooks} />

대신에

<Route component={ComponentUsingHooks} />


답변

컴포넌트 파일에서 React의 기본 후크를 가져온 다음 사용자 지정 후크에 전달하여이 문제를 해결할 수있었습니다. 어떤 이유로 사용자 지정 후크 파일에서 React 후크 (예 : useState)를 가져올 때만 오류가 발생합니다.

내 구성 요소 파일에서 useState를 가져옵니다.

import React, {useState} from 'react'; // import useState

import {useCustomHook} from '../hooks/custom-hook'; // import custom hook

const initialState = {items: []};
export default function MyComponent(props) {
    const [state, actions] = useCustomHook(initialState, {useState});
    ...
}

그런 다음 내 후크 파일에서 :

// do not import useState here

export function useCustomHook(initialValue, {useState}) {
    const [state, setState] = useState(initialValue || {items: []});

    const actions = {
        add: (item) => setState(currentState => {
            const newItems = currentState.items.concat([item]);
            return {
                ...currentState,
                items: newItems,
            };
        }),
    };

    return [state, actions];
}

이 방법은 기본 후크를 제공하기 위해 React의 라이브러리를 모의 할 필요가 없기 때문에 후크의 테스트 가능성을 향상 시켰습니다. 대신 모의 useState후크를 사용자 지정 후크의 함수에 바로 전달할 수 있습니다 . 사용자 지정 후크가 이제 React 라이브러리와 결합되지 않아보다 자연스러운 기능 프로그래밍 및 테스트를 허용하므로 코드 품질이 향상된다고 생각합니다.


답변

Parcel의 Hot Module Replacement 를 사용하는 동안이 오류가 발생했으며 react-dom알파 버전 으로 업데이트 하여 해결했습니다.

yarn add react-dom@16.7.0-alpha.0

이 문제를 참조하십시오.


답변

패키지 docz가 사용 react@16.6.3되었고 최종 출력 번들에 두 개의 반응 버전이 있는 monorepo에서 문제가 발생했습니다 .

Github의 문제

패키지를 제거하여 수정했습니다 ?


답변

나에게 문제는 실제로 react-hot-loader 입니다.

다음 과 같은 방법을 사용하여 전체 앱 대신 단일 구성 요소에 대해 react-hot-loader를 비활성화 할 수 있습니다 cold.

import { cold } from 'react-hot-loader'

export const YourComponent = cold(() => {

  // ... hook code

  return (
    // ...
  )
})

또는

export default cold(YourComponent)