[英]React Hook "useState" cannot be called inside a callback. Using useMediaQuery responsive JS media query
我正在尝试使用useMediaQuery
使用响应式 javascript 媒体查询,但是我无法让它工作,我得到:-
错误消息: "useState" cannot be called inside a callback. React Hooks must be called in a React function component or a custom React Hook function
"useState" cannot be called inside a callback. React Hooks must be called in a React function component or a custom React Hook function
游乐场https://stackblitz.com/edit/react-ts-5vseqr?file=media-query.ts
我认为它在media-query.ts
第 4 行media-query.ts
import { useState, useEffect } from 'react'
const useMediaQuery = (query: string) => {
const [match, setMatch] = useState(false)
useEffect(() => {
const updateMatch = () => setMatch(window.matchMedia(query).matches)
updateMatch()
window.matchMedia(query).addEventListener('change', updateMatch)
return () => {
window.matchMedia(query).removeEventListener('change', updateMatch)
}
}, [query])
return match
}
export default useMediaQuery
你在这里所做的是编写一个自定义钩子(useMediaQuery)。 你做得很好,所以没有问题。 上面的代码剪下来很好。
当您尝试使用您编写的上述自定义挂钩时,问题出在 index.tsx 文件中。 由于错误表明您的自定义钩子在 index.tsx 的第 7 行中的 react 组件之外被调用。
您必须在 App 组件内移动 useMediaQuery 调用。 此外,目前您的 App 组件是一个类组件,您必须将其转换为功能组件才能在其中使用钩子。
这是调整后的代码: https : //stackblitz.com/edit/react-ts-m6rwpd?file=index.tsx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.