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

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

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

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

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

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

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

        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
}
]
}
})

*最重要的 组件调用

        <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写。

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

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

<!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作用域插槽,匹配应用场景。的更多相关文章

  1. vue作用域插槽的应用

    问题场景: 存在一个列表,然后当鼠标放入列表中的名称上的时候,自动弹出简介,类似这种效果, 我们当然可以使用positon relative和absolute搭配达到这样的效果,但是现在有一个奇葩的问 ...

  2. vue 开发系列(十) VUE 作用域插槽

    使用场景 官方解释,有时让插槽内容能够访问子组件中才有的数据是很有用的.比如我们在使用ant-design-vue 的表格控件时. <a-table-column title="注释& ...

  3. Vue作用域插槽:用作循环结构的模版

    一 项目结构 二 App组件 <template> <div id="app"> <!-- 子组件 --> <todos :list=&q ...

  4. Vue作用域插槽:基本用法

    一 项目结构 二 App组件 <template> <div id="app"> <!-- 子组件 --> <user v-slot:de ...

  5. vue作用域插槽

    简而言之,作用域插槽就是让插槽内容能够访问子组件中的数据. 案例如下:有CurUser组件 <template> <span> <!-- 在slot 元素上绑定user, ...

  6. 新版vue作用域插槽的使用

    2.6开始,作用域插槽的使用有了不同的地方: 作用域插槽的个人理解就是让子组件的数据可以在父组件中使用:  也是一个数据传递的方式了: 不多说,上代码 子组件定义一个插槽,并且定义一个需要传递到父组件 ...

  7. Vue 作用域插槽

    使用场景:复用子组件的slot,又可以使slot的内容不一样. <!DOCTYPE html> <html lang="zh"> <head> ...

  8. vue中插槽的使用场景

    效果图:

  9. vue作用域插槽实践

    引言 我在练手的时候发现后端返回的数据可以通过两种方式渲染 (自己遇到的 可能你都会 哈哈哈) 后端传过来的数据函数 from django.http import JsonResponse def ...

随机推荐

  1. JavaScript客户端签名直传OSS

    参考链接: https://help.aliyun.com/document_detail/31925.html?spm=5176.11065259.1996646101.searchclickres ...

  2. ubuntu14.04 VIM for python 一键配置

    # 超强vim配置文件 [![Build Status](https://travis-ci.org/ma6174/vim.png?branch=master)](https://travis-ci. ...

  3. LibreOJ 题解汇总

    目录 #1. A + B Problem #2. Hello, World! #3. Copycat #4. Quine #7. Input Test #100. 矩阵乘法 #101. 最大流 #10 ...

  4. C++学习4-面向对象编程基础(面向对象概念,定义类,定义对象)

    什么是面向对象? 在软件的设计过程中的两种方式: 把程序按照算法的执行步骤来拆解,一步步实现,这是面向过程编程: 把程序按照现实世界的理解,分成不同对象,通过多个对象之间的相互作用,来完成程序的最终功 ...

  5. Spring的Aspect切面类不能拦截Controller中的方法

    根本原因在于<aop:aspectj-autoproxy />这句话是在spring的配置文件内,还是在springmvc的配置文件内.如果是在spring的配置文件内,则@Control ...

  6. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  7. Windows2008 r2 x64下安装FTP工具File Zilla server报错:could not load tls libraries filezilla

    安装file zilla server的时候报错: could not load tls libraries filezilla 搜索了下发现是新版本有这个问题,降低到0.9.43就没这个问题了

  8. Android手机刘海屏(附工具类)

    工具类 根据VIVO.OPPO.华为官方文档,这里整理了一个刘海屏工具类,判断设备是否为刘海屏,其他厂商公布相关方法后也会在此更新. OPPO: /** * OPPO * * @param conte ...

  9. Ex 5_22 在此我们基于以下性质给出一个新的最小生成树算法..._第九次作业

    (a)设环的顶点集为V, e(u,v)为权最重的边,若把V分成两部分V1,V2.其中V1包含u,V2包含v,因为V是一个环,因此,至少存在两条把u和v连接起来的边.因此,除了e之外,至少还存在另一条边 ...

  10. Android 项目中文件夹作用(res文件夹详细介绍)

    1. src:存放所有的*.Java源程序. 2. gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID. 3. assets:可以存放项目一些较大的资源文件,例如: ...