【发布时间】:2021-10-07 18:39:31
【问题描述】:
我已经创建了自己的 React Hook,但是当我使用自定义钩子中的函数时,我收到了 React Hook useEffect has a missing dependency: 'setPlayer'. Either include it or remove the dependency array 警告。
我试图从钩子中提取函数以避免 React 在每次渲染时创建一个新的函数实例,也尝试了useCallback,但仍然有同样的问题。
当我使用useReducer 时,我可以在我的useEffect 中使用dispatch 而不会发出任何警告,到底有什么区别?
带有警告的自定义钩子:
export function usePlayer() {
const playerService = useRef<PlayerService>();
const setPlayer = useCallback((youtubePlayer: YouTubePlayer) => {
playerService.current = new YoutubePlayerService(youtubePlayer);
}, []);
// also tried
/**
function setPlayer(youtubePlayer: YouTubePlayer) {
playerService.current = new YoutubePlayerService(youtubePlayer);
}
and putting `setPlayer outside of the hook`
**/
const getPlayerService = useCallback(() => {
return playerService.current;
}, []);
return [getPlayerService, setPlayer]
}
export function Component() {
const [setPlayer] = usePlayer();
const [youtubePlayer, setYoutubePlayer] = useState<YouTubePlayer>(undefined);
useEffect(() => {
setPlayer(youtubePlayer);
}, [youtubePlayer]
//React Hook useEffect has a missing dependency: 'setPlayer'. Either include it or remove the dependency array
}
也试过了:
let currentPlayerService = undefined;
function setPlayer(youtubePlayer: YouTubePlayer) {
currentPlayerService = new YoutubePlayerService(youtubePlayer);
}
export function usePlayer() {
return [currentPlayerService, setPlayer];
}
例如,当我使用 useReducer 中的 dispatch 时,我没有这个警告 (https://fr.reactjs.org/docs/hooks-reference.html#usereducer)
const initialState = {count: 0};
function reducer(state, action) {
switch (action.type) {
case 'increment':
return {count: state.count + 1};
case 'decrement':
return {count: state.count - 1};
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
useEffect(() => {
dispatch({type: 'increment'})
}, [state])
// no warning with dispatch <<
return (
<>
Total : {state.count}
<button onClick={() => dispatch({type: 'decrement'})}>-</button>
<button onClick={() => dispatch({type: 'increment'})}>+</button>
</>
);
}
如何实现同一种 Hook(我的函数没有警告)? (试图深入研究实现,但没有帮助https://github.com/facebook/react/blob/6ecad79ccf2c683cb21ac40dee5678358c7b6208/packages/react/src/ReactHooks.js#L24)
【问题讨论】:
标签: javascript reactjs react-hooks use-reducer