Day23——slot插槽的使用

一. 回顾

前面学习了Day22——子组件访问父组件——parent&root,今天学习slot插槽的使用

二. slot插槽

2.1 什么是插槽

总结一句话,在定义组件时,留下一个位置,不作定义,当使用组件时,可以对这个位置做任意的扩展。比如添加按钮、输入框、复选框等等

2.2 为什么使用插槽

组件开发的目的就是为了能重复利用组件,然而有时候虽然组件能重复利用,但是真正共同的地方只有局部,很多地方需要根据实际情况做改变,这时候可以使用插槽。

如下:
在这里插入图片描述

2.3 slot插槽的基本使用

注意代码中的注释,如下:

<body>
<div id="app">
  <!--往组件中添加内容,就会替换插槽的内容-->
  <cpn><button>按钮</button></cpn>
  <cpn><span>哈哈哈</span></cpn>
  <!--如果有多个扩展内容,将会全部替换到slot中-->
  <cpn>
    <i>呵呵呵</i>
    <div>哈哈哈</div>
    <h2>耶耶耶</h2>
  </cpn>
  <!--如果相同的扩展内容比较多,那么可以在插槽设置默认值-->
  <cpn></cpn>
  <cpn></cpn>
  <cpn></cpn>
  <cpn></cpn>

</div>

<template id="cpn">
  <div>
    <h2>我是组件</h2>
    <p>我是组件,哈哈哈</p>
    <!--组件没有扩展内容,插槽则使用默认值,下面插槽slot的默认值是<button>按钮</button>-->
    <slot><button>按钮</button></slot>
  </div>
</template>

<script src="../js/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好',
    },
    components: {
      cpn: {
        template: '#cpn',

      }
    }
  })
</script>
</body>

效果:
在这里插入图片描述

2.4 具名插槽

2.4.1 问题背景

一个组件内部有多个slot插槽,使用组件时,有时候需要指定扩展哪个插槽,这就需要用到具名插槽。其实就是给slot插槽指定名字。

2.4.2 实现

注意代码中的注释,很重要,如下:

<body>
<div id="app">
<!--  没名字(slot的name属性)插槽都会改成标题-->
<!--  <cpn><span>标题</span></cpn>-->
<!--  若slot有名字,扩展组件的内容只会替换到没有名字(name属性)的slot-->
<!--  给指定的slot替换内容,只需在元素使用slot属性并指定名字-->
  <cpn><span slot="center">标题</span></cpn>
  <cpn><button slot="left">返回按钮</button></cpn>
</div>

<template id="cpn">
  <div>
    <slot name="left"><span>左边</span></slot>
    <slot name="center"><span>中间</span></slot>
    <slot name="right"><span>右边</span></slot>

    <slot>哈哈哈</slot>
  </div>
</template>

<script src="../js/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好',
    },
    components: {
      cpn: {
        template: '#cpn',

      }
    }
  })
</script>
</body>

2.5 编译的作用域

2.5.1 什么是编译的作用域

总结一句话,与Java中的局部变量相似,假如有a,b两个方法,各自都有一个名为num的变量,那么a方法不能使用b的num变量,同理,b方法也不能使用a方法的num变量。这就是编译作用域

2.5.2 例子

注意代码中的注释,很重要,如下:

<body>
<div id="app">
<!--  使用的是vue实例里面的isShow-->
<!--  isShow所在的元素是在app这个模板里面,所以会去vue实例查找isShow变量-->
  <cpn v-show="isShow"></cpn>
</div>

<template id="cpn">
  <div>
    <h2>我是标题</h2>
    <p2>我是内容,哈哈哈</p2>
<!--    isShow所在的元素是在cpn这个模板里面,所以会去cpn组件查找isShow变量-->
    <button v-show="isShow">按钮</button>
  </div>
</template>

<script src="../js/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好',
      isShow: true,
    },
    components:{
      cpn: {
        template: '#cpn',
        data(){
          return {
            isShow: false,
          }
        }

      }
    }
  })
</script>
</body>

2.6 作用域插槽案例

2.6.1 需求情况

在这里插入图片描述

2.6.2 实现

注意代码中的注释,很重要,如下:

<body>
<div id="app">
  <cpn></cpn>
  <cpn>
    <!--  目的是为了获取子组件的pLanguages-->
<!--    vue2.5.x以下必须使用template标签-->
    <template slot-scope="slot2">
<!--      <span v-for="item in slot1.data">{{item}}-</span>-->
<!--      join(' - ')函数是将数组每个元素转成字符串并以‘ - ’拼接起来-->
      <span>{{slot2.data.join(' - ')}}</span>
    </template>
  </cpn>
</div>

<template id="cpn">
  <div>
<!--    ‘data’是随意取的(可以是abc,aaa等等),pLanguages是子组件中的数据-->
    <slot :data="pLanguages">
      <ul>
        <li v-for="item in pLanguages">{{item}}</li>
      </ul>
    </slot>
  </div>
</template>
<script src="../js/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好',
    },
    components: {
      cpn: {
        template: '#cpn',
        data(){
          return {
            pLanguages: ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg']
          }
        }

      }
    }
  })
</script>
</body>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值