I’m having problem abstracting my toggle function out to a hook. I can make the toggle right but something is wrong in this hook code:
JavaScript
x
16
16
1
import { useState, useCallback } from "react";
2
3
const useToggle = (initialValue = false) => {
4
const [value, setValue] = useState(initialValue);
5
6
const toggle = useCallback((defaultValue) => {
7
defaultValue !== undefined
8
? setValue(defaultValue) //set true or false
9
: setValue((value) => !value); //if param is not supplied, toggle the value
10
}, []);
11
12
return [value, toggle];
13
};
14
15
export default useToggle;
16
https://codesandbox.io/s/goofy-swartz-ztdfb?file=/src/App.js
what’s wrong?
Advertisement
Answer
On writing this code:
JavaScript
1
2
1
<button onClick={toggle}>toggle</button>
2
You actually are passing the event object to toggle
function.
JavaScript
1
4
1
onClick={(event) => toggle(event)}
2
// Same
3
onClick={toggle}
4
And in your custom hook, you have the condition defaultValue !== undefined
which will result in a truthy value.
Therefore you should do:
JavaScript
1
2
1
<button onClick={() => toggle()}>toggle</button>
2
And for your notice you can just use useReducer
instead of custom hook:
JavaScript
1
2
1
const [value,toggle] = useReducer(p=>!p, false);
2
Example of useToggle
JavaScript
1
6
1
const useToggle = (initialValue = false) => {
2
const [value, setValue] = useState(initialValue);
3
const toggle = useCallback(() => setValue((value) => !value), []);
4
return [value, toggle];
5
};
6