_import { useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
_
上記の例では、setCount(count + 1)
が呼び出されるたびに再レンダリングが発生します。流れを知りたいです。
ソースコードを調べてみました。 github.com/facebook/react でuseState
または他のフックの参照を見つけることができませんでした。
_react@next
_を介して_npm i react@next
_をインストールし、_node_modules/react/cjs/react.development.js
_で以下を見つけました
_function useState(initialState) {
var dispatcher = resolveDispatcher();
return dispatcher.useState(initialState);
}
_
dispatcher.useState()
を逆にたどると、次のものしか見つかりませんでした...
_function resolveDispatcher() {
var dispatcher = ReactCurrentOwner.currentDispatcher;
!(dispatcher !== null) ? invariant(false, 'Hooks can only be called inside the body of a function component.') : void 0;
return dispatcher;
}
_
_var ReactCurrentOwner = {
/**
* @internal
* @type {ReactComponent}
*/
current: null,
currentDispatcher: null
};
_
dispatcher.useState()
実装はどこにありますか? setState
setCount
が呼び出されます。
どんなポインタも役に立ちます。
ありがとう!
setState
はComponent/PureComponent
クラスのメソッドであるため、Component
クラスで実装されているすべてのことを実行します(render
メソッドの呼び出しを含む)。
setState
は、状態の更新をenqueueSetState
にオフロードするため、これにバインドされているという事実は、クラスを使用し、Component
から拡張した結果にすぎません。一度、状態の更新は実際にはコンポーネント自体によって処理されておらず、this
は状態の更新機能にアクセスするための便利な方法であり、useState
は明示的にバインドされていないことがわかりますあなたのコンポーネントはもっと理にかなっています。
FunctionComponentが異なります。以前は、それらは純粋で単純です。しかし今、彼らは彼ら自身の状態を持っています。 createElementがすべてのJSXノードをラップし、FunctionComponentも含まれていることを忘れるのは簡単です。
function FunctionComponent(){
return <div>123</div>;
}
const a=<FunctionComponent/>
//after babel transform
function FunctionComponent() {
return React.createElement("div", null, "123");
}
var a = React.createElement(FunctionComponent, null);
FunctionComponentが反応のために渡されました。 setStateが呼び出されると、簡単に再レンダリングできます。