est-il possible d'utiliser un function
comme mon React état du composant?
exemple de code ici:
// TypeScript
type OoopsFunction = () => void;
export function App() {
const [ooops, setOoops] = React.useState<OoopsFunction>(
() => console.log('default ooops')
);
return (
<div>
<div onClick={ ooops }>
Show Ooops
</div>
<div onClick={() => {
setOoops(() => console.log('other ooops'))
}}>
change oops
</div>
</div>
)
}
mais cela ne fonctionne pas ... le defaultOoops
sera invoqué au tout début, et lorsque vous cliquez sur change oops
, les otrher ooops
sera connecté à la console sans se connecter immédiatement après avoir cliqué sur Show Ooops
encore.
pourquoi ?
est-il possible pour moi d'utiliser une fonction comme état de mon composant?
ou bien React a ses façons spéciales de traiter ces the function state
?
Il est possible de définir une fonction dans l'état à l'aide de crochets, mais comme l'état peut être initialisé et mis à jour avec une fonction qui renvoie l'état initial ou l'état mis à jour, vous devez fournir une fonction qui, à son tour, renvoie la fonction que vous souhaitez insérer. Etat.
const { useState } = React;
function App() {
const [ooops, setOoops] = useState(() => () => console.log("default ooops"));
return (
<div>
<button onClick={ooops}>Show Ooops</button>
<button
onClick={() => {
setOoops(() => () => console.log("other ooops"));
}}
>
change oops
</button>
</div>
);
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>
L'implémentation de useState
dans React est
export function useState<S>(initialState: (() => S) | S) {
const dispatcher = resolveDispatcher();
return dispatcher.useState(initialState);
}
Cela montre que vous pouvez en effet utiliser une fonction comme paramètre et cette fonction doit retourner un type S
. Dans votre cas, S
serait undefined
, car () => console.log(...)
ne renvoie rien, bien que vous l'ayez explicitement spécifié comme OoopsFunction
.
Donc, si vous voulez stocker une fonction en tant qu'état via useState
, vous devez implémenter l'approche de Tholle, où la fonction retourne en fait une fonction et non undefined
.