vue watch中调用方法,方法里通过refs取dom节点提示undefined怎么修改?

vue项目中
Error in callback for immediate watcher "data": "TypeError: Cannot read property 'clientWidth' of undefined"

      @Watch('data',{ immediate: true, deep: true })
      onChangeValue(newVal: string, oldVal: string) {
        this.getLineData();
        this.drawSvg();
      }

其中getLineData()方法中操作了dom

     const boxDom: any = this.$refs.chartsLineBox;   
     const boxWidth: number = boxDom.clientWidth;
      this.boxHeight = boxDom.clientHeight;
      const itemHeight: number = Math.floor(boxWidth /  dataCount);

Watch中监听的data是在父组件中通过axios请求到的,在mounted中调用的,不过data有初始值,这种情况应该怎么改?

阅读 11.7k
6 个回答

watch方法执行的时候chartsLineBox还没渲染好吧?不知道你的业务场景是什么,可以考虑把immediate设置为false。总之确保在调用getLineData的时候chartsLineBox这个元素渲染好了。

boxDom?

说明DOM元素还没出现,获取不到属性。不用mounted,换个钩子函数

可以在父组件给子组件加v-if有数据再显示子组件 这样在子组件mounted时数据和节点都能拿到

加个延时就完了

const sleep = t => new Promise(r=>setTimeout(r, t));
 
@Watch('data',{ immediate: true, deep: true })
async onChangeValue(newVal: string, oldVal: string) {
    if(!this.$refs.chartsLineBox){
        await sleep(100)
    }
    this.getLineData();
    this.drawSvg();
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题