云逻星空
云逻星空
  • 发布:2022-06-02 01:09
  • 更新:2022-06-05 11:59
  • 阅读:1001

【报Bug】微信小程序无法通过$slots获取插槽节点,App和H5无法通过$parent传值给父节点

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

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

HBuilderX类型: Alpha

HBuilderX版本号: 3.4.13

手机系统: 全部

手机系统版本号: Android 12

手机厂商: 小米

手机机型: 红米k40

页面类型: vue

vue版本: vue3

打包方式: 云端

项目创建方式: HBuilderX

测试过的手机:

红米k40,ios模拟器,iphone7p

示例代码:

微信小程序vue2获取插槽节点:
this.$slots.default

微信小程序vue3获取插槽节点
this.$slots.default()

H5、APP通过$parent向父节点传值:
子节点:this.$parenr.a = this
父节点输出为undefined

操作步骤:

微信小程序vue2获取插槽节点:
this.$slots.default

微信小程序vue3获取插槽节点
this.$slots.default()

H5、APP通过$parent向父节点传值:
子节点:this.$parent.a = this
父节点输出为undefined

预期结果:

this.$slots.default正常获取插槽节点列表
this.$parent.a正常获取子节点信息(此写法参照uni-form和uni-form-item)

实际结果:

this.$slots.default 值为ture而不是列表
this.$parent.a值为undefined而不是子节点的this

bug描述:

  1. 微信小程序通过 $slots获取到的default值为true,而不是插槽节点列表
  2. APP和H5插槽节点通过$parent.a对父节点的a进行复制时,父节点取到a的值为undefined
2022-06-02 01:09 负责人:无 分享
已邀请:
a***@80boys.com

a***@80boys.com - 原生土豆泥

不懂帮顶

tmui

tmui

刚好看到,帮下你吧
建议不要用这种方式。vue3同时也取消了$children的。父级是可以取到,但它的父级并不一定是你认为的父级,它是按层级往上冒泡找到父点的。解决方案:
如何找父节点?:
1、父节点定义标识。
2、子节点通过冒泡循环获得父节点,执行找到标识即为离他最近的父节点。
如何获取子节点?
因为vue3取消了$children,当然在h5可以$slot取得,但在跨平台中这种方式,坚决不要使用。
解决方案:
1、父节点定义方法
2、子节点渲染期,找到父节点,然后执行父节点方法向其报告或者推送子节点信息,父节点缓存它的所有子组件。
3、子组件注销也要向父报告,让父组件从缓存中删除该节点,以同步信息。
这样的方案好处是:
1、全平台兼容。
2、父子组件通信方便,方便处理。
你可以下载我的vue3组件库学习这种方案。

  • 云逻星空 (作者)

    你理解错我的意思了,我是通过$parent把子节点push个父节点,懂?不是直接获取子节点

    2022-06-02 21:54

  • 云逻星空 (作者)

    回答之前先看清下问题,但还是感谢你的回答,不过有点不好就是广告,个人有点讨厌哈

    2022-06-02 21:55

  • 云逻星空 (作者)

    另外就是,通过$parent吧子节点推送给父节点小程序中是可行的,我也是用这种方案,但h5和app是不行的,官方的uni-form也是存在这种问题

    2022-06-02 21:58

  • 呆狗的一生

    你们俩真逗,我来看看

    2022-06-05 11:51

呆狗的一生

呆狗的一生 - 呆狗的一生

快上传个demo来,看看你们俩谁说的有理

  • tmui

    回复 呆狗的一生: 那人家在我身上打个个打广告的标签,你说无语,好心当驴踢。

    2022-06-05 12:54

  • 云逻星空 (作者)

    官方的uni-form和uni-form-item就是demo,这个就出现我说的这种情况,子组件把自身实例push进父组件进行缓存,在小程序这种方法是可以行的通的,但在h5里面只能通过获取插槽的方式

    2022-06-07 11:39

  • tmui

    回复 云逻星空: 我本不想与你作任何讨论的,但本着我善良我还是再帮你下:

    使用inject 和provide,前面说的parent推送和销毁,只是告诉父组件你的存在。

    1、子获取父的数据,使用inject,还可以响应式,并且可监听父组件的数据是否修改。

    2、子修改父数据,通过parent方法。

    3、父修改子数据,通过provide向下发送修改指令参数,子监听后进行判断是修改还是其它任意命令。

    3、父读取子数据,使用parent的方法向父推送即可。

    通过以上方法你将:全平台兼容。

    以后对帮你的人客户气点,至少要尊重,不要那么傲娇!!!

    2022-06-08 22:43

该问题目前已经被锁定, 无法添加新回复