uni-app icon indicating copy to clipboard operation
uni-app copied to clipboard

uni-app 编译到抖音mp-toutiao平台组件开启virtualHost后event不会触发

Open Moonofweisheng opened this issue 1 year ago • 3 comments
trafficstars

hbuilderX版本:4.22.2024062415-alpha 复现demo:toutiao-vue3-virtualhost
问题描述:
当组件开启了virtualHost后,运行到mp-toutiao平台,无法触发定义的test事件。 组件代码:

<template>
	<view class="test" @click="handleClick">点我测试</view>
</template>
<script lang="ts">
export default {
  name: 'virtual-host-cmp',
  options: {
    addGlobalClass: true,
    virtualHost: true,
    styleIsolation: 'shared'
  }
}
</script>
<script lang="ts" setup>
	const emit = defineEmits(['test'])
	function handleClick() {
		emit('test')
	}
</script>

使用:

<template>
	<view class="content">
		<image class="logo" src="/static/logo.png"></image>
		<view class="text-area">
			<text class="title">{{title}}</text>
		</view>
		<virtual-host-cmp @test="handleTest"></virtual-host-cmp>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				title: 'Hello'
			}
		},
		onLoad() {

		},
		methods: {
				
			handleTest(){
				uni.showToast({
					title:'点到了'
				})
			}
		}
	}
</script>

Moonofweisheng avatar Jun 25 '24 08:06 Moonofweisheng

补充:4.15~4.22均可以复现该问题。

Moonofweisheng avatar Jun 25 '24 08:06 Moonofweisheng

相关issue:#4969 #4699

Moonofweisheng avatar Jun 25 '24 09:06 Moonofweisheng

编译到抖音平台真是一步一个坑

YaWeiBoy avatar Jun 27 '24 08:06 YaWeiBoy

在小程序自定义组件中,其options里面存在一个属性virtualHost,可以控制将该组件的节点虚拟化,即设置 virtualHost: true ,这样就能将该自定义组件默认的一层节点去除,使外部设置的flex布局能直接作用于该组件内部的节点。

GRCmade avatar Jul 04 '24 07:07 GRCmade

在小程序自定义组件中,其options里面存在一个属性virtualHost,可以控制将该组件的节点虚拟化,即设置 virtualHost: true ,这样就能将该自定义组件默认的一层节点去除,使外部设置的flex布局能直接作用于该组件内部的节点。

是的,目前就是自定义组件开启了virtualHost,然后自定义组件定义的事件都失效了。

Moonofweisheng avatar Jul 04 '24 07:07 Moonofweisheng

开启了virtualHost,自定义组件默认一层都没有了,怎么会显示事件呢,不仅事件属性也不会显示了

GRCmade avatar Jul 04 '24 08:07 GRCmade

开启了virtualHost,自定义组件默认一层都没有了,怎么会显示事件呢,不仅事件属性也不会显示了

这个原因是开启了virtualHost,emit事件在父组件或者页面中接收不到

YaWeiBoy avatar Jul 04 '24 08:07 YaWeiBoy

开启了virtualHost,自定义组件默认一层都没有了,怎么会显示事件呢,不仅事件属性也不会显示了

微信是可以的,可以参考我附件的例子或者我贴的代码,在自定义组件中定义test事件,点击自定义组件时触发该事件。目前来说编译到toutiao,外部就无法接收到自定义组件的emit了。

Moonofweisheng avatar Jul 04 '24 08:07 Moonofweisheng

可以这么说,因为它的<virtual-host-cmp @test="handleTest"></virtual-host-cmp> 压根就没有,直接是内部的内容

image uni-app应该是使用这个属性Fragment 来实现toutiao小程序平台的virtualHost的吧,其实它和微信的virtualHost实现并不是一致的,这就造成之前写了virtualHost的组件,更新到指定版本uni-app之后在抖音平台得到了截图中所有的副作用

Moonofweisheng avatar Jul 04 '24 08:07 Moonofweisheng

可以这么说,因为它的<virtual-host-cmp @test="handleTest"></virtual-host-cmp> 压根就没有,直接是内部的内容

根据这个说法,去验证了props下发现,传递给组件props,如果页面修改了props导致模拟器直接卡死

YaWeiBoy avatar Jul 04 '24 08:07 YaWeiBoy

抖音小程序自身对Fragment 组件节点有特殊限制,是不是意味着如果开启virtualHost,不能使用emit等事件,props传递也会出现问题,这个uniapp编译到抖音平台能处理吗,不然virtualHost没多大的意义

YaWeiBoy avatar Jul 04 '24 08:07 YaWeiBoy

抖音小程序自身对Fragment 组件节点有特殊限制,是不是意味着如果开启virtualHost,不能使用emit等事件,props传递也会出现问题,这个uniapp编译到抖音平台能处理吗,不然virtualHost没多大的意义

意义就是需要在virtualHost上加个条件编译了,不要再抖音平台使用virtualHost🐶

Moonofweisheng avatar Jul 04 '24 08:07 Moonofweisheng

抖音小程序自身对Fragment 组件节点有特殊限制,是不是意味着如果开启virtualHost,不能使用emit等事件,props传递也会出现问题,这个uniapp编译到抖音平台能处理吗,不然virtualHost没多大的意义

意义就是需要在virtualHost上加个条件编译了,不要再抖音平台使用virtualHost🐶

尴尬,抖音平台强隔离,没有类似微信apply-shared能力,所有样式只能写在组件内部

YaWeiBoy avatar Jul 05 '24 02:07 YaWeiBoy

这个issue关闭了,抖音平台目前千万不要开启virtualHost。

Moonofweisheng avatar Jul 08 '24 03:07 Moonofweisheng