Vue——07插槽slot

简介: 插槽slot

之前写的代码都是创建一个子组件然后用父组件进行绑定并获取

看段代码:

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title></title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <!-- 如何在cpn标签里面插入标签呢,这里可以用到slot插槽功能 -->
    <cpn><span>显示span</span></cpn>
  </div>
  <template id="cpn">
    <div>
    <p>{{message}}</p>
    </div>
  </template>
  <script type="text/javascript">
    const cpn = {
    template:'#cpn',
    data(){
      return{
      message:'我是一个子组件'
      }
    }
    }
    const vm = new Vue({
    el:'#app',
    components:{
      cpn
    }
    })
  </script>
  </body>
</html>

4ffed4c4ad4d49e8813bce4f7910c066.png 效果如下:

543dd6068594432fb000920bb93e25be.png

这里想要直接获取cpn中的span元素。但是这样并没有达到我们所期望的效果,如果想要实现这种效果就要用到插槽

slot

插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,使模块进行复用

应修改为:

<div id="app">
  <!-- 如何在cpn标签里面插入标签呢,这里可以用到slot插槽功能 -->
  <cpn><span>用slot插槽显示</span></cpn>
</div>
<template id="cpn">
  <div>
  <p>{{message}}</p>
  <slot></slot>
  </div>
</template>

如下图:

401ce2548ac7488d8c98c1a67f0ad973.png

slot——具名插槽        

在子组件内使用特殊的<slot>元素就可以为这个子组件添加一个 slot (插槽),在父组件模板里,插入在子组件标签内的所有内容将替代子组件的<slot>标签及它的内容.

如果用上一种方法来用slot标签获取对应的多个span标签是行不通的

比如:

OCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title></title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <cpn>
    <span>左插槽</span>
    <span>中间插槽</span>
    <span>右插槽</span>
    </cpn>
  </div>
  <template id="cpn">
    <div>
    <slot></slot>
    <slot></slot>
    <slot></slot>
    </div>
  </template>
  <script type="text/javascript">
    const cpn = {
    template:'#cpn',
    }
    const vm = new Vue({
    el:'#app',
    components:{
      cpn
    }
    })
  </script>
  </body>
</html>

42cea199ba7f44eb9e8a3fc0397c00f2.png

这里每一个slot都渲染了三遍span,每个slot对应每个span就要在slot中加入name值来实现绑定

而对应的span中也要去对应的写上slot值

一共有三种写法

第一种:

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

第二种:

<div id="app">
    <cpn>
    <template v-slot:left><span>左插槽</span></template>
    <template v-slot:center><span>中间插槽</span></template>
    <template v-slot:right><span>右插槽</span></template>
    </cpn>
  </div>
  <template id="cpn">
    <div>
    <slot name="left"></slot>
    <slot name="center"></slot>
    <slot name="right"></slot>
    </div>
  </template>

第三种:

<div id="app">
    <cpn>
    <template #left><span>左插槽</span></template>
    <template #center><span>中间插槽</span></template>
    <template #right><span>右插槽</span></template>
    </cpn>
  </div>
  <template id="cpn">
    <div>
    <slot name="left"></slot>
    <slot name="center"></slot>
    <slot name="right"></slot>
    </div>
  </template>

实现效果:

d9fec5e4fb5745aebecdbd7eeca0f0a0.png

推荐使用二三两种方法

编译的作用域

组件与组件之间是存在作用域的

看下面这个例子:

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title></title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <cpn v-show="isShow"></cpn>
  </div>
  <template id="cpn">
    <div>
    <h2>{{message}}</h2>
    <h5>我是一个子组件</h5>
    <button type="button" v-show="isShow">点击</button>
    </div>
  </template>
  <script type="text/javascript">
    const cpn = {
    template:'#cpn',
    data(){
      return{
      isShow:true,
      message:'NanChen'
      }
    }
    }
    const vm = new Vue({
    el:'#app',
    data(){
      return{
      isShow:true,
      }
    },
    components:{
      cpn
    }
    })
  </script>
  </body>
</html>

没在子组件中设置isShow的值时:

55c4c44fb37a4b2ba942ecac74cabed6.png

把isShow值设置为false时效果如下:

73e569ebd91247e6b3e3c223c3c880b7.png

下面是一个作用域插槽案例:

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title></title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <cpn></cpn>
    <!-- 只需重新创建一个cpn,并对其拼接字符串 -->
    <cpn>
                <!-- 四种写法都可 -->
    <!-- <template   v-slot:default="one">
      <span>{{one.arr.join('_____')}}</span>
    </template> -->
    <!-- <template slot-scope="one">
      <span>{{one.arr.join('__*___')}}</span>
    </template> -->
    <!-- <template v-slot="one">
      <span>{{one.arr.join('...')}}</span>
    </template> -->
    <template #default="one">
      <span>{{one.arr.join('+++')}}</span>
    </template>
    </cpn>
  </div>
  <template id="cpn">
    <div>
    <slot :arr="pLanguage">
      <ul>
      <li v-for="item in pLanguage" :key="item.id">{{item}}</li>
      </ul>
    </slot>
    </div>
  </template>
  <script type="text/javascript">
  const cpn = {
    template:'#cpn',
    data(){
    return{
      pLanguage:['JS','C#','C++',"HTML",'CSS']
    }
    }
  }
    const vm = new Vue({
    el:'#app',
    components:{
      cpn
    }
    })
  </script>
  </body>
</html>

效果如下:

3378d26b84354a8d8bf47a6f9b343486.png

案例二:

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title>Vue作用域插槽案例2</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <cpn v-slot="ww">
    {{ww.user2}}
    </cpn>
  </div>
  <template id="cpn">
    <div>
    <span>
      <slot :user2="user">
      {{user.lastName}}
      </slot>
    </span>
    </div>
  </template>
  <script type="text/javascript">
    const cpn = {
    template:'#cpn',
    data(){
      return{
      user:{
        firstName:'Nan',
        lastName:'Chen'
      }
      }
    }
    }
    const vm = new Vue({
    el:'#app',
    components:{
      cpn
    }
    })
  </script>
  </body>
</html>

287d661ec21d452ead93162173a9bc41.png

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
1天前
|
JavaScript
Vue学习之--------深入理解Vuex之多组件共享数据(2022/9/4)
这篇文章通过一个实际的Vue项目案例,演示了如何在Vuex中实现多组件间共享数据。文章内容包括在Vuex的state中新增用户数组,创建Person.vue组件用于展示和添加用户信息,以及在Count组件中使用Person组件操作的数据。通过测试效果展示了组件间数据共享和状态更新的流程。
Vue学习之--------深入理解Vuex之多组件共享数据(2022/9/4)
|
1天前
|
JavaScript
Vue学习之--------深入理解Vuex之模块化编码(2022/9/4)
这篇文章详细介绍了Vuex的模块化编码和命名空间的使用,旨在让代码更易于维护并提高数据分类的明确性。内容包括模块化和命名空间的概念、如何在store中配置模块、以及如何在组件中使用模块化的数据。文章通过实战项目案例,展示了如何拆分`store/index.js`文件,创建`count.js`和`person.js`模块,并在`Count.vue`和`Person.vue`组件中使用这些模块。最后,文章还提供了测试效果和一些使用注意点。
Vue学习之--------深入理解Vuex之模块化编码(2022/9/4)
|
1天前
|
JavaScript 前端开发 开发者
Vue学习之--------深入理解Vuex、原理详解、实战应用(2022/9/1)
这篇文章详细介绍了Vuex的基本概念、使用场景、安装配置、基本用法、实际应用案例以及注意事项,通过一个数字累加器的实战示例,帮助开发者深入理解Vuex的原理和应用。
|
1天前
|
存储 JavaScript API
vue后台管理权限码处理
【8月更文挑战第19天】vue后台管理权限码处理
8 0
|
1天前
|
JavaScript
Vue学习之--------深入理解Vuex之getters、mapState、mapGetters(2022/9/3)
这篇文章深入探讨了Vuex中的getters概念和用法,以及如何通过mapState、mapGetters、mapActions和mapMutations四个辅助函数简化组件中的Vuex状态访问和操作,通过实际项目案例展示了这些概念的应用和效果。
|
4天前
|
JavaScript
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
这篇文章介绍了在Vue项目中如何实现执行删除等危险操作时的二次确认机制,使用Element UI的`el-popconfirm`组件来弹出确认框,确保用户在二次确认后才会执行删除操作。
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
|
JavaScript
初识 Vue(19)---(Vue 中使用插槽(slot))
Vue 中使用插槽(slot) 案例:子组件中的一部分内容是根据父组件传递来的 DOM 来进行显示 Vue 中使用插槽(slot) Vue.
1247 0
|
4天前
|
JavaScript
如何创建一个Vue项目(手把手教你)
这篇文章是一篇手把手教读者如何创建Vue项目的教程,包括使用管理员身份打开命令行窗口、找到存放项目的位置、通过vue-cli初始化项目、填写项目信息、进入项目目录、启动项目等步骤,并提供了一些常见第三方库的引入方法。
如何创建一个Vue项目(手把手教你)
|
4天前
|
前端开发
StringBoot+Vue实现游客或用户未登录系统前、可以浏览商品等信息、但是不能购买商品或者加入购物车等操作。登录系统显示用户的登录名(源码+讲解)
这篇文章介绍了使用StringBoot+Vue实现用户登录状态判断的方法,包括前端加载用户信息和后端设置session的源码示例。
|
1天前
|
JavaScript
Vue学习之--------路由的query、params参数、路由命名(3)(2022/9/5)
这篇文章详细介绍了Vue路由中的query参数、命名路由、params参数以及props配置的使用方式,并通过实际项目案例展示了它们在开发中的应用和测试结果,同时解释了`<router-link>`的`replace`属性如何影响浏览器历史记录。
Vue学习之--------路由的query、params参数、路由命名(3)(2022/9/5)