You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 13(App目录):TypeError读取prototype属性未定义问题求助

解决Next.js用downshift的useSelect钩子时出现的"window未定义"错误

为啥会报错?

你用的Next.js 13.2.4是服务端渲染模式,downshift的useSelect钩子在服务端执行时,会尝试访问浏览器环境才有的window对象,服务端不存在这个对象,所以直接触发报错。

怎么修复?

方法1:动态导入组件(最推荐)

把用到useSelect的组件改成动态导入,强制它只在浏览器端渲染:

import dynamic from 'next/dynamic'

// 替换成你自己的组件路径
const MySelect = dynamic(() => import('./MySelect'), {
  ssr: false,
})

这样组件不会在服务端执行,自然不会碰到window的问题。

方法2:先判断环境再调用钩子

在组件里先检查当前是否处于浏览器环境,确认后再调用useSelect:

import { useSelect } from 'downshift'

export default function MySelect() {
  // 服务端返回占位内容,避免报错
  if (typeof window === 'undefined') {
    return <div>加载中...</div>
  }

  const {
    isOpen,
    selectedItem,
    getToggleButtonProps,
    getMenuProps,
    highlightedIndex,
    getItemProps,
  } = useSelect({
    items: ['苹果', '香蕉', '橙子'], // 替换成你的选项数据
  })

  // 以下是官方示例的渲染逻辑,直接复用即可
  return (
    <div>
      <button {...getToggleButtonProps()}>
        {selectedItem ? selectedItem : '选择水果'}
      </button>
      <ul {...getMenuProps()}>
        {isOpen &&
          items.map((item, index) => (
            <li
              {...getItemProps({ item, index })}
              style={{
                backgroundColor:
                  highlightedIndex === index ? '#bde4ff' : 'white',
                fontWeight: selectedItem === item ? 'bold' : 'normal',
              }}
            >
              {item}
            </li>
          ))}
      </ul>
    </div>
  )
}

方法3:配置Next.js转译downshift(不推荐)

如果确认是Babel编译导致的问题,可以在next.config.js中配置让Next.js转译downshift包,但可能引发其他兼容问题,谨慎使用:

/** @type {import('next').NextConfig} */
const nextConfig = {
  transpilePackages: ['downshift'],
}

module.exports = nextConfig

内容的提问来源于stack exchange,提问作者MoDrazzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:17:47