HarmonyOS鸿蒙Next中使用$dispatch接连栽两个跟头!!

HarmonyOS鸿蒙Next中使用$dispatch接连栽两个跟头!! 跟往常一样,没事写几行代码找找感觉,结果连续踩了两个坑,跟大家分享一下:

一号坑:execJSTypeError: Cannot read property ‘$dispatch’ of null

实现代码:

<template>
  <div class="photo-selector-wrapper {{aniOpClass}}">
    <div class="photo-selector-btn" onclick="pickPhoto">
      <text class="photo-selector-text">{{componentData.selectPhoto}}</text>
    </div>
    <div class="second-divider"></div>
    <div class="photo-selector-btn" onclick="hide">
      <text class="photo-selector-text">{{componentData.cancel}}</text>
    </div>
  </div>
</template>

<script>
import media from '@system.media'

export default default {
  hide() {
    this.$emit('hide')
  },
  pickPhoto: function () {
    media.pickImage({
      success: (ret) => {
        console.log("pickImage start :", ret.uri);
        this.$dispatch('getPhotoUri', ret.uri)
      },
      fail: (erromsg, errocode) => {
        console.log('media.pickImage ' + errocode + ': ' + erromsg)
      },
      cancel: () => {
        console.log('media.pickImage cancel')
      },
      complete: () => {
        console.log('media.pickImage complete')
      }
    })
    this.hide()
  }
}
</script>

执行报错如下:

经过简单判断可以得出,是this在程序中发生了改变,导致dispatch在回调中时已经找不到,通过var that = this 深度复制,修改代码后,果然错误不一样了。。。

二号坑:Application error stack : TypeError: Cannot read property ‘getPhotoUri’ of undefined

实现代码如下:

<template>
  <div class="photo-selector-wrapper {{aniOpClass}}">
    <div class="photo-selector-btn" onclick="pickPhoto">
      <text class="photo-selector-text">{{componentData.selectPhoto}}</text>
    </div>
    <div class="second-divider"></div>
    <div class="photo-selector-btn" onclick="hide">
      <text class="photo-selector-text">{{componentData.cancel}}</text>
    </div>
  </div>
</template>

<script>
import media from '@system.media'

export default default {
  hide() {
    this.$emit('hide')
  },
  pickPhoto: function () {
    var that = this;
    media.pickImage({
      success: (ret) => {
        console.log("pickImage start :", ret.uri);
        that.$dispatch('getPhotoUri', ret.uri)
      },
      fail: (erromsg, errocode) => {
        console.log('media.pickImage ' + errocode + ': ' + erromsg)
      },
      cancel: () => {
        console.log('media.pickImage cancel')
      },
      complete: () => {
        console.log('media.pickImage complete')
      }
    })
    this.hide()
  }
}
</script>

父窗口通过:绑定函数接受数据并展示

<template>
  <div class="container">
    <photo-selector if="isPSshow" onhide="hidePhotoSelector"></photo-selector>
  </div>
</template>

<script>
import prompt from '@system.prompt'
import ai from '@system.ai'

export default {
  onInit() {
    this.$on('getPhotoUri', this.getPhotoUri)
  }
}
</script>

后报错如下:

经过几个小时的尝试最终在小伙伴的提醒下发现,尝试注释this.hide(),果然问题迎刃而解。

问题复盘:在回调方法执行$dispatch之前窗口已经被hide,再进一步分析页面hide时触发父窗口 photo-selector 组件的if属性,而if属性定义如下:

看到这里恍然大悟,组件在发送通知前就已经被移除。既然已经知道问题就好改了,把hide触发放到dispatch后即可。


更多关于HarmonyOS鸿蒙Next中使用$dispatch接连栽两个跟头!!的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

开发者您好,写的很好哦,不过图片麻烦您看下呢,加载不出来,感谢。

更多关于HarmonyOS鸿蒙Next中使用$dispatch接连栽两个跟头!!的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


个人信息

  • 姓名:张三
  • 年龄:28
  • 职业:软件工程师

在HarmonyOS鸿蒙Next中,$dispatch用于事件分发,但使用时需注意以下几点:

  1. 事件注册与触发:确保事件已正确注册,且触发时事件名称与注册时一致。
  2. 上下文绑定:$dispatch需要在正确的上下文中调用,否则可能导致事件无法正确分发。
  3. 事件处理函数:确保事件处理函数已正确定义,且能正确处理分发的事件。

若仍遇到问题,建议检查事件分发流程,确保各环节无误。

回到顶部