uniapp或小程序多级插槽slot会失效

这篇具有很好参考价值的文章主要介绍了uniapp或小程序多级插槽slot会失效。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目场景:

uniapp 中使用 slot 插槽让用户自定义图标,插槽嵌套有三层(多层)会发现插槽失效的行为, 小程序端总是显示默认内容, H5端正常。

<slot name="customIcon">
	<img src="home.png" />  <!-- 默认内容 --->
</slot>

问题描述

举例什么是多级嵌套使用插槽?

例如:有一个Box组件,有两种Box类型:left 和 right,Box组件里面含有图标。多层级情况下,这时候Vue怎么去定义一个自定义图标的插槽 customIcon 呢?

<!-- Box.vue -->
<template>
	<div v-if="type == 'left'">
		<left-box>
			<template v-slot="customLeftIcon">
				<slot name="customIcon"></slot>
			</template>
		</left-box>
	</div>
	<div v-else-if="type == 'right'">...</div>
</template>
<!-- LeftBox.vue -->
<template>
	<div class="leftBox">
		<slot name="customLeftIcon">
			<img src="home.png" />
		</slot>
		<span>i am left box</span>
	</div>
</template>

使用这个Box组件并使用 customIcon 自定义图标用法如下:

<!-- 使用方法 -->
<template>
	<Box type="left">
		<img src="myHome.png" slot="customIcon" />
	</Box>
</template>

以上例子是H5环境的写法,如果没有自定义图标就会使用默认的图标,但是在微信小程序端,这个方式出来的效果就是无论有没有自定义图标都会使用默认的,这符合最终的效果。

坑1

小程序端,我尝试用这样的方法解决问题:手动判断用户有没有使用自定义插槽 $slots[‘customIcon’], 只有自定义了才会在子组件设置插槽。这里我不会再写使用方法,主要写实现:

<!-- Box.vue -->
<template>
	<div v-if="type == 'left'">
		<left-box>
			<template v-slot="customLeftIcon" v-if="$slots['customIcon']">
				<slot name="customIcon"></slot>
			</template>
		</left-box>
	</div>
	<div v-else-if="type == 'right'">...</div>
</template>

LeftBox.vue 与原来一致,最终效果不达标

坑2

搜了很多资料,说是 v-if 判断只能放置在里面,我把它改成这样:

<!-- Box.vue -->
<template>
	<div v-if="type == 'left'">
		<left-box>
			<template v-slot="customLeftIcon">
				<slot name="customIcon" v-if="$slots['customIcon']"></slot>
			</template>
		</left-box>
	</div>
	<div v-else-if="type == 'right'">...</div>
</template>

还是不行!


原因分析:

这个原因我不知道,也不想知道,更加不愿意知道,奇奇怪怪的问题,只能归结为小程序插槽的坑。

解决方案:

有效的解决办法:

父组件Box传一个 isCustomIcon 进去:

<!-- Box.vue -->
<template>
	<div v-if="type == 'left'">
		<left-box :isCustomIcon="!!$slots['customIcon']">
			<template v-slot="customLeftIcon">
				<slot name="customIcon"></slot>
			</template>
		</left-box>
	</div>
	<div v-else-if="type == 'right'">...</div>
</template>
<!-- LeftBox.vue -->
<template>
	<div class="leftBox">
		<!-- 父组件传来的 isCustomIcon -->
		<template v-if="isCustomIcon">
			<slot name="customLeftIcon" />
		</template>
		<img v-else src="home.png" />
		<span>i am left box</span>
	</div>
</template>

这样就没有问题了!文章来源地址https://www.toymoban.com/news/detail-523415.html

到了这里,关于uniapp或小程序多级插槽slot会失效的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue知识点————插槽 slot

    slot 插槽 在父组件中引用的子组件 在父组件中写入百度 可在子组件slot插槽中展示出 父组件 子组件 父组件 子组件 这里父组件可以访问父组件的数据并且可在slot中展示到,不可以在父组件中访问子组件的数据,就相当于父组件百度—{{ user.name }}{{ url }} 这里的url是访问不到的

    2024年02月09日
    浏览(34)
  • Vue 3 中的插槽(Slots)用法

    插槽(Slots)是 Vue 组件中一种非常有用的功能,用于在父组件中向子组件传递内容。Vue 3 引入了 script setup 语法,使得组件的写法更加简洁和易读。在本篇博客中,我们将探讨在 Vue 3 中使用插槽的不同方式,包括默认插槽、具名插槽以及作用域插槽。 默认插槽是 Vue 组件中最

    2024年02月15日
    浏览(28)
  • Vue中的ajax和slot插槽

    在前后端分离项目中,解决跨域问题是一个常见的需求。下面列举了几种常用的跨域解决方法: CORS(跨域资源共享):这是最常用且推荐的跨域解决方案。通过在服务器端设置响应头,允许特定的源(域名、协议、端口)访问资源。在后端服务器上进行配置即可实现跨域请

    2024年02月10日
    浏览(36)
  • Vue3 slot插槽多层传递

    如果你想传递一个slot,从爷到孙的传递, 看了网上的一些方案,依赖注入都来了,其实没那么麻烦 最顶层组件,插入一个按钮到 slot name为 btn的 插槽里面,Button接收一个row的参数,参数可能有多个,这里 用了 { row } 只取 row 在中间组件,这里把插入一个 插槽 插入到 slot n

    2024年02月15日
    浏览(33)
  • 如何使用Vue的插槽(slot)语法?

    Vue.js 是一个流行的 JavaScript 框架,用于构建动态和交互式的用户界面。它的模板语法提供了许多功能,其中之一就是插槽(slot)语法。 插槽(slot)是 Vue.js 模板中一种非常有用的机制,它允许你在一个组件中插入内容,然后在另一个组件中使用这些内容。这个机制非常灵活

    2024年02月08日
    浏览(44)
  • 【Vue3 第十九章】插槽 slot

    数字化管理平台 Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus 权限系统-商城 个人博客地址 在某些场景中,我们可能想要为子组件传递一些模板片段,让子组件在它们的组件中渲染这些片段。这就用到了插槽。 插槽是子组件中的提供给父组件使用的一个占位符,用 slot 表示,父组件可以

    2024年02月09日
    浏览(32)
  • Vue中的Ajax 配置代理 slot插槽

    本案例需要下载 axios 库 npm install axios 配置参考文档 Vue-Cli devServer.proxy vue.config.js 是一个可选的配置文件,如果项目的 (和 package.json 同级的) 根目录中存在这个文件,那么它会被 @vue/cli-service 自动加载。你也可以使用 package.json 中的 vue 字段,但是注意这种写法需要你严格遵照

    2024年02月09日
    浏览(39)
  • Vue3——第十三章(插槽 Slots)

    这里有一个 FancyButton 组件,可以像这样使用: 而 FancyButton 的模板是这样的: slot 元素是一个插槽出口 (slot outlet),标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。 最终渲染出的 DOM 是这样: 通过使用插槽, FancyButton 仅负责渲染外层的 button (以及相应的样式),而

    2024年02月07日
    浏览(45)
  • FE_Vue学习笔记 插槽 slot

    插槽分为匿名插槽、具名插槽、作用域插槽。子组件中: 匿名插槽只能有一个; 可以有多个具名插槽; 作用域插槽中可以有匿名插槽和具名插槽。 当项目中一个组件可以多次复用时,我们可以把这个组件封装成单独的 .vue 文件,从而可以在不同的页面中引入该组件,从而实

    2024年02月04日
    浏览(27)
  • 微信小程序slot插槽的使用

    微信小程序中的插槽是一种组件化技术,可以帮助开发者创建复用性更高的组件。本文将详细介绍微信小程序中插槽的定义、用法、作用以及注意事项。 插槽是指在组件中预留的一块区域,可以动态地替换成其他组件或内容。组件开发者在编写组件时可以使用 标签来定义一

    2024年02月15日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包