今天扒一扒vue插槽slot的一些事,主治插槽不起作用,等问题

前言:

​ 前两天查了插槽的相关资料,发现大部分csdn或者百度的文章都是把官网的一些例子直接复制粘贴过来,来蹭流量。而对我们真正需要解决问题的起不到任何一些作用。当前 其中还是有一些不错的文章的。也不能说全部都是那种照搬。此文章仅用作自己与那些和我朋友一样问题的人做个记录。

插槽的定义

  • 官方定义:< slot > 元素作为承载分发内容的出口。
  • 个人理解:就是在组件中预留了一块地方(使用<slot name="插槽名></slot>包裹起来),这块地方你可以放一些你的自定义内容,并可以设定默认内容。这块地方可以拥有自己的名字,也可以不带名字。也有自己的地盘范围。页面的组件引用就可以在<template #插槽名>模板 中放入你想放的内容。

基本使用

默认使用匿名插槽

  • 页面的组件引用

    <component>要插入的内容</component>
    
  • 组件

    //这里是组件的详情页面
    <template>
    	<slot></slot>//内容就放到这里
    </template>
    

具名插槽

  • 页面的组件引用

    <component>
    	<template #slotName> //这里的#号是v-slot:slotName的缩写
    		<div>
                插槽内容
            </div>
        </template>
    <component>
    
  • 组件

    //这里是组件的详情页面
    <template>
    	<slot name="slotName"></slot>//内容就放到这里
    </template>
    

作用域插槽:在插槽中如何访问子组件的数据?

当你使用具名插槽,而你的子组件又是使用v-for循环出来的列表,你想取到列表的行数据,你会怎么取呢?因为在父组件是不能直接访问子组件的列表行数据的?所以就引出了一个解决方案,叫做作用域插槽,下面是如何使用作用域插槽

  • 页面的组件引用

    <component >
    	<template #slotName="{ propName }">  //propName:组件传过来的变量名,{}花括号是用来解构参数的。
    		{{propName.msg}} //访问组件插槽传递过来的msg
        </template>
    </component>
    
  • 组件

    //这里是组件的详情页面
    <template>
    	//这里的slotName要和页面的组件引用的#slotName一致。
    	//:prodName要和页面的组件引用的prodName。
    	//bindAtr 是传递到组件引用界面的数据
    	<slot name="slotName" :propName="bindAtr"></slot> 
    </template>
    

还有一个重要的问题

比如我的这个业务场景:
我一个列表item组件,里面的一个price插槽需要根据上层的菜单索引来指定访问哪个price字段,如索引为1的时候,要使用price价格字段,索引为2的时候要使用price2字段。也要根据不同的索引值来显示不同的按钮组。根据这个,引出 slot 中的 template内容 动态显示的问题。解决思路是template中的内容根据 v-if来控制显示和隐藏。切记不要用v-if去控制template,是去控制里面的内容。如下伪代码:

<template #slotName v-if="***">
	<div>内容</div>
</template>  //这样是不对的。
//正确的做法是
<template #slotName >
	<div v-if="***">内容</div>
	<div v-else>内容</div>
</template>  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值