首页 > 解决方案 > ReferenceError:未使用 useMedia() hook + next.js 定义窗口

问题描述

因为我使用的是 next.js,所以我认为由于代码在服务器端而不是客户端上执行而出现“未定义窗口”错误。我尝试使用 useLayoutEffect() 来等待页面呈现,但它仍然不起作用。我可以做些什么来更改下面的自定义 useMedia() 挂钩来解决此问题?

export default (queries, values, defaultValue) => {
  const mediaQueryLists = queries.map(q => window.matchMedia(q));

  const getValue = () => {
    const index = mediaQueryLists.findIndex(mql => mql.matches);

    return typeof values[index] !== "undefined" ? values[index] : defaultValue;
  };

  const [value, setValue] = useState(getValue);
  useEffect(() => {
    const handler = () => setValue(getValue);

    mediaQueryLists.forEach(mql => mql.addListener(handler));

    return () => mediaQueryLists.forEach(mql => mql.removeListener(handler));
  }, []);

  return value;
};

标签: javascriptreactjsreact-hooksnext.jsserver-side-rendering

解决方案


因为窗口没有按时安装,请尝试使用以下命令等待它:

let mediaQueryLists
if (typeof window !== 'undefined') {
  mediaQueryLists = queries.map(q => window.matchMedia(q));
} else {
  mediaQueryLists = []
}

推荐阅读