v-slot 具名插槽实际运用环境

vue2.6版本,具体对插槽写法有较大的变化,老的写法将要废弃

1. 默认插槽 ,简单的插槽

2. 具名插槽:相对默认插槽组件slot标签带name命名的,可以指定位置

3.作用域插槽:子组件内数据可以被父页面拿到(解决了数据只能从父页面传递给子组件,其实子页面传给父页面的方法有很多)

共同点:三种插槽都需要在子组件留坑,当父组件有值的时候可以模板写入

简单说一说具名插槽的应用场景:

后台系统中,经常会遇到表格这个元素,每个页面都含有表格,写起来很不方便,这边呢,便于维护的开发,将标题查询表单表格分页等功能封装到一起,如何封装呢,简单可以拆分开功能区域,

例如标题——查询条件——处理按钮(如添加,导入,导出.....)——列表区域——分页等

这时候我们的具名插槽就很重要了,先来一波简单介绍

儿子组件:

/** Son 子组件,下面用儿子来简述*/
<template>
  <div>
      <span>你好,我是子组件</span>
      <slot name="head"></slot> 
  </div>
</template>

父组件: 

/** Parent 父组件,后面就说父亲 */
<Son>
   <template v-slot:head>
       <p>我调用子组件的时候,放一些数据展示</p>
   </template> 
</Son>

<script>
import Son from './son'  // 这边注意地址
export default {
    components:{
        Son,
    },
</script>

结果如下:

相当于parent组件调用son组件,预先在son组件中留个坑(slot) ,还是个有名字的。

多组件具名插槽,

因为我们封装的表格含有多功能,所以拆分开,头部功能 ,中间功能,底部功能等等

来看个例子:

孙子组件:

/** grandson孙子组件 后面就以孙子*/
<template>
  <div>
      <p>我是孙组件</p>
      <slot name="grandson"></slot>
  </div>
</template>

儿子组件:

/** Son子组件  后面就说儿子 */
<Grandson>
   <template v-slot:grandson>
      <p>我是儿子,我调用孙子</p>
   </template>
</Grandson>

到现在为止:跟上面一样,就是儿子组件调用孙子组件,在孙子组件先留一个name=‘grandson的’slot,此时儿子组件也被当做子组件被父亲组件调用会发生什么呢?

父亲组件:

<Son>
   <template v-slot:grandson>
      <p>我是父组件,在调用子组件的时候,放一些数据展示</p>
   </template> 
</Son>

如果这样,很明显,孙子的插槽位置已经被儿子占领了,父亲的这个p标签没地方了,所以展示

 如果需要展示父亲这段话呢,儿子的位置要给留出来,别忘了,父亲想要在儿子组件标签里展示东西,就需要儿子先预留一个坑(slot),所以,在儿子组件中写个<slot></slot>就可以了

我们将儿子组件加一个slot:


<Grandson>
    <template v-slot:grandson>
        <p>我是儿子,我调用孙子</p>
        <slot name="grandson"></slot>
    </template>
</Grandson>

当然,可以儿子组件不需要那个 p标签,这样相当于父亲调用儿子,想跟儿子说个话(这个相当于父亲在儿子标签中写一些内容),儿子调用孙子,孙子有插槽,儿子没有额外的话(儿子没有在孙子标签里写额外的话,但是他要提供坑给他的父亲),所以父亲可以直接把话给孙子。

知道这么个具体,那么我们的封装思路也开始明朗,可以把父组件的一些标题值放在插槽中,然后渲染到后代组件里,问题来了,值可以,那么方法呢?也是可以的。

儿子:

<template>
  <div>
      <Grandson>
            <template v-slot:grandson>
                <slot :onSearch='handleSearch' name="grandson"></slot>
            </template>
      </Grandson>
  </div>
</template>

<script>
import Grandson from './grandson'
export default {
    components:{
        Grandson
    },
    data() {
        return {
            
        }
    },
    methods: {
        handleSearch(){
            console.log('有人点我,我被触发了')
        }
    },
    created() {
    },
}
</script>

父亲:

/**父亲 */
<Son>
  <template v-slot:grandson='A'>
    <p>我是父组件,在调用子组件的时候,放一些数据展示</p>
    <button @click="A.onSearch">父组件按钮,点击一下能不能触发子组件里的方法</button>
  </template> 
</Son>

点击按钮,结果

 这个相当于父亲里面有个点击事件,点击后触发了grandson插槽的onSearch属性,而onSearch属性在儿子中是个方法,随之调用方法,至于想传值的话,那就在父组件带入参数即可。

有了这个demo,那么搜索按钮功能迎刃而解,本人前端小白,有什么问题,可以提出来大家一起解决,一起进步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值