dcloudio/uni-app

uni-app 打包 app ,自定义指令中删除节点信息失败

Opened this issue · 3 comments

发行方式

App

具体平台

安卓12

开发环境

Windows

项目创建方式

HBuilderX

依赖版本

hbuildx:4.76
package.json 如下

{
  "name": "app",
  "version": "1.0.0",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@vant/area-data": "^2.0.0",
    "dayjs": "^1.11.13",
    "h5plus-hotfix": "^1.0.2",
    "image-tools": "^1.4.0",
    "jquery": "^3.6.1",
    "mathjs": "^11.8.0",
    "uview-ui": "^1.8.4"
  }
}

问题描述

本地运行 app 在模拟器中打开,控制台没有报错信息,但是自定义指令没有生效,感觉可能是 没有正确的将 dom 节点删除

重现步骤

项目是vue2,打包成 app 后打开项目发现自定义指令没有生效,在 h5 模式下运行也是没有问题的,然后排查了一下是自定义指令拿到的 el 执行removeChild 函数好像没有真的删除掉节点。
自定义指令逻辑:判断是否有权限没有权限则删除 dom

本地运行到模拟器中 hbuilderx 控制台没有报错信息,并且正确的运行完了代码,但是页面上的节点没有被删除

指令代码如下:

inserted(el, binding, vnode) {
    const { value } = binding
    const all_permission = "*:*:*";
    const permissions = store.getters && store.getters.permissions

    if (value && Array.isArray(value) && value.length > 0) {
      const permissionFlag = value

      const hasPermissions = permissions.some(permission => {
        return all_permission === permission || permissionFlag.includes(permission)
      })

      console.log('是否有权限',hasPermissions)

      if (!hasPermissions) {
        // 执行到这里了
        el.parentNode && el.parentNode.removeChild(el)
        console.log('执行成功')
      }
    } else {
      throw new Error(`请设置操作权限标签值`)
    }
  }

期望行为

No response

实际行为

No response

截图或录屏

No response

我发现有一个奇怪的现象,使用自定义指令如果没有权限 执行了 el.parentNode.removeChild(el) 那对应节点的 点击事件是不会执行,控制台也没有报错。即使把 el.parentNode.removeChild(el) 改成 el.destroy() 也不能正确将节点销毁

提供复现工程,说明 vue 版本。

简化你的业务逻辑,说明你的代码执行到哪里了,你的几个 log 是否打印了表达并不清晰。

提供复现工程,说明 vue 版本。

简化你的业务逻辑,说明你的代码执行到哪里了,你的几个 log 是否打印了表达并不清晰。

提供了一个可以复现的 demo,在 h5 环境和 app 环境表现不一致, h5 正常,app 有问题。项目是重新搭建的使用的 vue2

remove-node-bug-demo.zip