细说Vue作用域插槽,匹配应用场景。

摘要:
最近,我们在官方文档中看到,vue添加了一个槽机制,称为作用域槽。所需版本为2.1.0+。首先,顾名思义,所谓的作用域slot主要在作用域中,需要注意的是(以下几点如果你不理解,应该没关系,你可以通过下面的例子来理解):1.一个组件中只能有一个slot标签,这个slot用于在调用一个组件时替换多个标签。也就是说,插槽替换了一组范围标签,即范围。2.作用域槽的特殊之处在于它可以通过上部作用域中的临时变量访问

最近在官方文档中看到,vue新增了一种插槽机制,叫做作用域插槽。要求的版本是2.1.0+。

首先来说一下:顾名思义,所谓作用域插槽,主要就在作用域,需要注意的是(以下几点看不懂不要紧,配合下面的例子,你会一看就懂):

1. 组件中的slot标签只能有有一个,而这一个slot用于替代组件调用时的多个标签。即一个slot代替一组范围的标签,即为作用域。

2. 作用域插槽的特殊在于:可在上层作用域中通过临时变量拿到组件定义时通过作用域插槽传递的数据。

3. 作用域插槽的技巧在于:可在上层作用域中通过拿到的数据选择性地渲染标签(即修改slot对应的标签范围)。

下面通过实际例子来一步一步地细说:

**拥有作用域插槽的组件定义(实际代码中组件要在根实例创建之前定义):

        Vue.component("list-tpl", {
           props: ["list"],
           template: `
                <ul>
                    <li   v-for="(item, index) in list">
                        <slot :item="item"></slot>   // item为向上层传递的数据,单个slot在调用时转化为作用域内的多个标签
                    </li>
                </ul>
           `
       })

*根实例代码,主要包括测试数据:

var app = new Vue({
           el: "#app",
           data: {
               list: [
                   {
                       name: "tate",
                       age: 26,
                       single: true,  // 是否单身
                       stu: false     // 是否是学生
                   },
                   {
                       name: "kevin",
                       age: 23,
                       single: true,
                       stu: true
                   },
                   {
                       name: "harden",
                       age: 28,
                       single: false,
                       stu: false
                   },
                   {
                       name: "Jimmy",
                       age: 29,
                       single: false,
                       stu: true
                   }
               ]
           }
       })

*最重要的 组件调用

        <list-tpl :list="list">
            <!-- 调用的时候 a 为临时变量,只用于获取数据 -->
                <template slot-scope="a">
                    <!-- 若不加任何判断,整个template中的标签都会替换为定义时的slot -->
                    <h4>{{a.item.name}}</h4>
                    <h5>{{a.item.age}}</h5>
                    <!-- 技巧就在于通过a拿到的数据选择性地渲染标签,即修改单个slot对应的作用域范围 -->
                    <span v-if="a.item.single">我是单身</span>
                    <span v-if="a.item.stu">我是学生</span>
                    <span v-if="!a.item.single">我不是单身</span>
                    <span v-if="!a.item.stu">我不是学生</span>
                </template>
        </list-tpl>

综上:作用于插槽主要应用在:需要在实际调用组件时选择性渲染插槽内容,而不是在定义时用js写。

*下面看一下本例子的实际效果:

细说Vue作用域插槽,匹配应用场景。第1张

*本例的全部代码如下,可自行运行查看效果:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <slot-test>
            <template slot="top">定制top</template>
        </slot-test>
        <list-tpl :list="list">
            <!-- 调用的时候 a 为临时变量,只用于获取变量 -->
                <template slot-scope="a">
                    <!-- 若不加任何判断,整个template中的标签都会替换为定义时的slot -->
                    <h4>{{a.item.name}}</h4>
                    <h5>{{a.item.age}}</h5>
                    <!-- 技巧就在于通过a拿到的数据选择性地渲染标签,即修改单个slot对应的作用域范围 -->
                    <span v-if="a.item.single">我是单身</span>
                    <span v-if="a.item.stu">我是学生</span>
                    <span v-if="!a.item.single">我不是单身</span>
                    <span v-if="!a.item.stu">我不是学生</span>
                </template>
        </list-tpl>
    </div>
   <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
   <script>
       Vue.component("slot-test", {
           template: "<div>
                <slot name='top'>
                    <p>默认top</p>
                </slot>
                <slot name='mid'>
                    <p>默认mid</p>
                </slot>
                <slot name='bottom'>
                    <p>默认bototm</p>
                </slot>
            </div>"

       })
       Vue.component("list-tpl", {
           props: ["list"],
           template: `
                <ul>
                    <li style="display:block;" v-for="(item, index) in list">
                        <slot :item="item"></slot>   // item为向上层传递的数据,单个slot在调用时转化为作用域内的多个标签
                    </li>
                </ul>
           `
       })
       var app = new Vue({
           el: "#app",
           data: {
               list: [
                   {
                       name: "tate",
                       age: 26,
                       single: true,
                       stu: false
                   },
                   {
                       name: "kevin",
                       age: 23,
                       single: true,
                       stu: true
                   },
                   {
                       name: "harden",
                       age: 28,
                       single: false,
                       stu: false
                   },
                   {
                       name: "Jimmy",
                       age: 29,
                       single: false,
                       stu: true
                   }
               ]
           }
       })
   </script>
</body>
</html>

免责声明:文章转载自《细说Vue作用域插槽,匹配应用场景。》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Cramfs、JFFS2、YAFFS2的全面对比JDK的目录下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

学习vue之windows下安装live-server 超级详细篇

最近项目要求用vue2.0所以开始着手学习。 前期准备: 下载Node.js 地址:http://nodejs.cn/download/ 选择自己对应的版本,我下载的是.msi 64位的 然后就双击下一步吧。完成之后,记得配置环境变量(不知道环境变量在哪里的 先拉到最下面) 因为我把Node.js安装到了D盘nodeJs目录下。 呼出cmd,命令走起 ,...

Vue中如何给字符串前面加空格

  背景:        最近再用element UI写一个页面,输入框是必输的话,如果没有输入点提交,需要有个红色的提示信息。但是提示信息没有个输入框对齐,就想用加空格的方法来实现。后来发现通常的加空格的方法都无效       一、效果和代码如下:        二 、 想要的效果是提示信息和输入框对齐,网上没找到很好的方法,可能我加了label-w...

vue router:解决相同路径不同路由参数跳转同一页面,路由参数不动态刷新的问题

问题描述 当我们使用同一路径跳转不同页面时,路由参数不会刷新,所以组件中接收不到,比如我的路由定义和路由跳转链接如下:当然我们人为不肯直接这样写啦~这里模拟问题写的demo 采用 watch 监听 1. 在点击跳转的组件中使用 watch 进行检测动态改变路由参数: watch: { // 利用watch方法检测路由变化:进行重新赋值 $r...

vue,基于element的tree组件封装

封装组件代码 // 组件:树 /* 参数说明-属性: 1.treeData:展示数据(array) 2.treeEmptyText:内容为空的时候展示的文本(String) 3.treeNodeKey:每个树节点用来作为唯一标识的属性,整棵树应该是唯一的(String) 4.treeRenderAfterExpand:是否在第一次展开某个树节点后才渲染其子...

解决:Vue中给input框手动赋值,视图却不更新

1.使用数组方法splice this.arr =[{item1},{item2},{item3},{item4}] item1.a= 0 this.arr.splice(0, 1, item1) 注意: 由于 JavaScript 的限制,Vue 不能检测以下变动的数组: 1.当你利用索引直接设置一个项时,例如:arr[1] = newValue2.当...

零基础 Vue 开发环境搭建 打开运行Vue项目

【相关推荐】IntellIJ IDEA 配置 Vue 支持 打开Vue项目 所需文件 node.js环境(npm包管理器)(node-v8.11.3-x64.msi)(npmV5.6.0) cnpm npm的淘宝镜像 vue-cli 构建工具(脚手架) 一、安装node 安装完node,就自动在path里增加环境变量,但是为了以后的本地部署项目,我们需要找...