ReferenceError: wx is not defined

这段代码报错的核心原因出在以下这行:

ini 复制代码
var windWidth = wx.getSystemInfoSync().windowWidth;

这行代码在组件外部顶层直接调用了 wx.getSystemInfoSync(),而 在组件被初始化之前、或者不是在微信小程序环境中执行这段代码时,wx 是未定义的,所以就抛出了 ReferenceError: wx is not defined。


✅ 正确的解决方式

✅ 方法一:将 wx.getSystemInfoSync() 放入组件的生命周期或 attached() 生命周期中执行

微信组件初始化时才能确保 wx 是定义好的,避免在顶层作用域使用:

✅ 修改方式如下:

php 复制代码
Component({
  properties: {
    canvasWidth: {
      type: Number,
      value: 0  // 先设置为 0,稍后在 attached 中设置
    },
    ...
  },
  data: {
    show_tip: true
  },
  lifetimes: {
    attached() {
      const windWidth = wx.getSystemInfoSync().windowWidth;
      this.setData({
        canvasWidth: windWidth * 0.4
      });
    }
  },
  methods: {
    ...
  }
});

✅ 方法二:在调用之前判断 typeof wx !== 'undefined'

如果一定要保留顶层代码(不推荐),可以做个安全判断:

ini 复制代码
var windWidth = (typeof wx !== 'undefined') ? wx.getSystemInfoSync().windowWidth : 375;

但是更推荐的方法还是:不要在组件外部或组件定义顶层作用域中直接使用 wx。


🔧 补充:canvas 使用小程序 2D 环境注意事项

在你这段 canvas-ring.js 中,如果你使用的是 canvas 标签(不是 canvas-id) + type="2d" 的方式来绘图,确保使用了 自定义组件 + canvas 2d 环境 并启用了 2D 接口。

你在使用:

kotlin 复制代码
query.select('#myCanvas')
  .fields({ node: true , size: true})
  .exec(this.init.bind(this));

说明你是使用了 canvas 的 node 接口,这就必须保证:

  • 你的小程序基础库版本 ≥ 2.9.0
  • <canvas type="2d" /> 用在 wxml 中
  • component: true 设置在页面或组件配置中(如果使用自定义组件)

✅ 总结

错误来源:

在组件外直接调用 wx.getSystemInfoSync(),而此时微信小程序环境尚未准备好。

解决办法:

✅ 把 wx.getSystemInfoSync() 放到 attached() 生命周期中再执行


相关推荐
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
拖孩3 天前
代码我能全交给 AI,流量主这 500 个访客它一个都替不了我
前端·后端·微信小程序
甜到心里的蛋糕3 天前
如何用企业微信实现让微信收到通知实时通知
服务器·python·微信小程序·fastapi
2601_963870203 天前
基于springboot的综合网上购物商场系统
微信小程序·小程序·课程设计
2601_963869953 天前
力序健身房管理系统
微信小程序·小程序
拖孩4 天前
给小程序加「一键发公众号贴图」,我把 wx.shareToOfficialAccount 的三个坑趟了一遍
前端·后端·微信小程序
StevenLdh5 天前
第四期 · 云端同步与冲突仲裁:离线可写、多端一致的工程解法
java·微信小程序
m0_462803885 天前
会议签到如何设置手写签名?从创建签到到导出签名 PDF 的完整流程
微信小程序
AI工具人PM产品经理6 天前
零基础微信小程序入门:一个真实项目的里程碑路线图
微信小程序·云开发·学习路线·零基础入门·ai 编程
拖孩6 天前
这个小程序是 AI 帮我写的,可它里面一个 AI 功能都没有
前端·后端·微信小程序