问题
is it possible to use a function
as my React Component's state ?
example code here:
// 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>
)
}
but it doesn't works ... the defaultOoops
will be invoked at very beginning, and when clicking change oops
, the otrher ooops
will be logged to console immediately not logging after clicking Show Ooops
again.
why ?
is it possible for me to use a function as my component's state ?
or else React has its special ways to process such the function state
?
回答1:
It is possible to set a function in state using hooks, but because state can be initialized and updated with a function that returns the initial state or the updated state, you need to supply a function that in turn returns the function you want to put in state.
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>
回答2:
The implementation of useState
in React is
export function useState<S>(initialState: (() => S) | S) {
const dispatcher = resolveDispatcher();
return dispatcher.useState(initialState);
}
It shows, that you can indeed use a function as parameter and this function has to return a type S
. In your case S
would be undefined
, because () => console.log(...)
returns nothing, although you explicitly specified it as OoopsFunction
.
So if you want to store a function as state via useState
you have to implement Tholle's approach, where the function actually returns a function and not undefined
.
来源:https://stackoverflow.com/questions/55621212/is-it-possible-to-react-usestate-in-react