useState
フックを使用すると、このエラーが発生します。私は基本的な形でこれを持っています、参照のために react docs を見て、まだこのエラーが発生しています。私は顔のPalmの瞬間の準備ができています...
export function Header() {
const [count, setCount] = useState(0)
return <span>header</span>
}
react-hot-loader
の新しいバージョンがリリースされました link 。フックは、すぐに使用できるようになりました。著者のtheKasheyに感謝します。
このボイラープレートを確認してください https://github.com/ReeganExE/react-hooks-boilerplate
まず、react@next
とreact-dom@next
をインストールしたことを確認してください。
次に、react-hot-loader
を使用しているかどうかを確認します。
私の場合、ホットローダーを無効にすると、HMRが機能します。
https://github.com/gaearon/react-hot-loader/issues/1088 を参照してください。
引用:
はい。 RHLはフックと完全に互換性がありません。その背景にはいくつかの理由があります。
SFCはクラスコンポーネントに変換されています。理由があります-SFCに「更新」メソッドがない限り、HMRでforceUpdateを実行できます。更新を強制する別の方法を探しています(このように。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のプリミティブフックをインポートし、カスタムフックに渡すことで、これを解決できました。何らかの理由で、カスタムフックファイルに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 [email protected]
パッケージ docz が[email protected]
を使用し、最終出力バンドルに2つの反応バージョンがあったmonorepoで問題が発生しました。
パッケージを削除して修正しました????
MobXを使用してコンポーネントをobserver
でラップするときにこの問題に遭遇した場合は、mobx-react-lite
の代わりにmobx-react
を使用してください。
同じ問題がありました。私の問題はReactルーターに関連していました。誤って使用していた
<Route render={ComponentUsingHooks} />
の代わりに
<Route component={ComponentUsingHooks} />
私にとっての問題は確かに react-hot-loader でした。
次のようなcold
メソッドを使用して、アプリ全体ではなく、単一のコンポーネントのreact-hot-loaderを無効にすることができます:
import { cold } from 'react-hot-loader'
export const YourComponent = cold(() => {
// ... hook code
return (
// ...
)
})
OR
export default cold(YourComponent)
react-hot-loader
のこの回避策が見つかりましたが、修正するためのPRはインバウンドです。
フックを呼び出す関数をReact.memo
でラップし、変更されていない場合はホットリロードを防ぎます。
const MyFunc = React.memo(({props}) => {...
ソリューションの功績: https://github.com/gatsbyjs/gatsby/issues/9489
Create React Appを使用している場合は、reactおよびreact-domバージョンでも"react-scripts"
バージョンを更新する必要があります。
"react-scripts": "2.1.5",
"react": "^16.8.1",
"react-dom": "^16.8.1",
この組み合わせは正常に機能します。
私の問題は次のとおりです。
私がやっていた:ReactDOM.render(Example(), app);
私がやるべきだったのに対し、ReactDOM.render(<Example />, app);
私にとって、これは、react(16.8.6)の新しいバージョンとreact-dom(16.6.1)の古いバージョンがあったために発生していました。
両方を@latest(16.8.6)にアップグレードすると、エラーが修正されました。
重複バージョン of react
(およびおそらくreact-dom
)を含む@ rista404の答えを詳しく説明すると、フックを使用している場所に応じて同じエラーが発生します。以下に2つの例を示します...
react
に別のバージョンのdependencies
が含まれます。これは、おそらくreact
が通常はピア依存関係であるため、誤っている可能性があります。 npm
がこのバージョンをローカルバージョンと自動的に重複排除しない場合、このエラーが表示されることがあります。これが@ rista404が言及していたことです。npm link
react
をdevDependencies
またはdependencies
に含むパッケージ。現在、このパッケージのモジュールでは、親プロジェクトではなくローカルnode_modules
ディレクトリからreact
の異なるバージョンをプルすると、エラーが表示される場合があります。後者は、resolve.alias
を使用してwebpack
とバンドルすると修正できます。
resolve: {
alias: {
'react': path.resolve(__dirname, 'node_modules/react'),
'react-dom': path.resolve(__dirname, 'node_modules/react-dom')
}
}
これにより、react
が常に親プロジェクトのnode_modules
ディレクトリから取得されます。