l***@126.com
l***@126.com
  • 发布:2022-06-24 16:45
  • 更新:2022-12-07 00:41
  • 阅读:597

【报Bug】checkbox组件 点击方块会报错

分类:uni-app

产品分类: uniapp/H5

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: Windows10

HBuilderX类型: 正式

HBuilderX版本号: 3.4.15

浏览器平台: Chrome

浏览器版本: 103.0.5060.53(正式版本) (64 位)

项目创建方式: HBuilderX

操作步骤:
  1. checkbox组件,鼠标放到方框里面,等到方框border变成蓝色 (注意:一定要在方框里面点,点方框旁边是正常的)
    第一次点击,正常选中
  2. 第二次点击,正常取消选中,同时控制台有报错
  3. 第三次点击,页面没用反应 ----> 正常应该是变成选中
  4. 第4次点击, 页面正常选中

预期结果:

每次点击都应该把checkbox变成另外一个状态,但第三次点击时,页面没反应

实际结果:

每次点击都应该把checkbox变成另外一个状态,但第三次点击时,页面没反应

bug描述:

checkbox组件,鼠标放到方框里面,等到方框border变成蓝色,第一次点击会选中,这时候再点一下,会取消选中,同时控制台有报错
(注意:一定要在方框里面点,点方框旁边是正常的)
Uncaught TypeError: Cannot destructure property 'id' of 'el' as it is null.
at normalizeTarget (uni-shared.es.js:487:13)
at createNativeEvent (uni-h5.es.js:1269:13)
at $nne (uni-h5.es.js:1243:15)
at HTMLElement.invoker (vue.runtime.esm.js:9534:19)

2022-06-24 16:45 负责人:无 分享
已邀请:
BoredApe

BoredApe - 有问题就会有答案。

请上传能重现问题的测试工程

  • l***@126.com (作者)

    抱歉,应该不是checkbox有bug,是我自己用法有问题

    <view class="uni-panel" v-for="x in [1, 2, 3]" :key="x">

    <view class="uni-panel-h" @click="checkedNodesMap.set(x, x)">

    <view class="flex-space-between">

    <checkbox :checked="checkedNodesMap.has(x)" />

    </view>

    </view>

    </view>

    这是一小段能触发报错的代码,还是想请假下大佬,为什么这么写会报错?

    2022-06-24 17:32

  • BoredApe

    回复 l***@126.com: 请上传能重现问题的测试工程。没有上下文不好确定问题

    2022-06-24 17:36

l***@126.com

l***@126.com (作者)

我给checkbox加了click.stop就好了

  1. 点击方框触发了checkbox本身的click事件,修改了checkbox内部的状态
  2. 事件继续向上传播,父元素的click处理器又触发了checkedNodesMap.set(x, x)
  3. 由于checkedNodesMap是一个响应式对象,又会触发设置checkbox的checked
  4. checkbox内部应该是有watch checked这个props,就又触发了一些动作
  5. 但这时候checkbox已经是选中状态了,内部数据状态的不一致,导致报错

作为一个半路出家的前端,坑了坑了

  • RexLee

    加了click.stop又有其它问题

    2022-12-07 00:44

l***@126.com

l***@126.com (作者)

因为项目代码有点多,还涉及到请求后端接口,我就以hello-uniapp项目为基础,改了pages/component/view.vue
用来复现报错信息

要回复问题请先登录注册