Vuejs:组件 slot 内容分发

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

本文是在官方文档的基础上,更加细致的说明,代码更多更全。

简单来说,更适合新手阅读

(二十八)Slot分发内容

①概述:

简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示、不显示、在哪个地方显示、如何显示,就是slot分发负责的活。

②默认情况下

父组件在子组件内套的内容,是不显示的。

例如代码:

<div id="app">  <children>  <span>12345</span>  <!--上面这行不会显示-->  </children>  
</div>  
<script>  var vm = new Vue({  el: '#app',  components: {  children: {    //这个无返回值,不会继续派发  template: "<button>为了明确作用范围,所以使用button标签</button>"  }  }  });  
</script>  

显示内容是一个button按钮,不包含span标签里面的内容;

③单个slot

简单来说,只使用这个标签的话,可以将父组件放在子组件的内容,放到想让他显示的地方。

<div id="app">  <children>  <span>12345</span>  <!--上面这行不会显示-->  </children>  
</div>  
<script>  var vm = new Vue({  el: '#app',  components: {  children: {    //这个无返回值,不会继续派发  template: "<button><slot></slot>为了明确作用范围,所以使用button标签</button>"  }  }  });  
</script>  

例如这样写的话,结果是:

<button><span>12345</span>为了明确作用范围,所以使用button标签</button>

即父组件放在子组件里的内容,插到了子组件的<slot></slot>位置;

注意,即使有多个标签,会一起被插入,相当于用父组件放在子组件里的标签,替换了<slot></slot>这个标签。

④具名slot

将放在子组件里的不同html标签放在不同的位置

父组件在要分发的标签里添加 slot=”name名” 属性

子组件在对应分发的位置的slot标签里,添加name=”name名” 属性,

然后就会将对应的标签放在对应的位置了。

示例代码:

<div id="app">  <children>  <span slot="first">12345</span>  <span slot="second">56789</span>  <!--上面这行不会显示-->  </children>  
</div>  
<script>  var vm = new Vue({  el: '#app',  components: {  children: {    //这个无返回值,不会继续派发  template: "<button><slot name='first'></slot>为了明确作用范围,<slot name='second'></slot>所以使用button标签</button>"  }  }  });  
</script>  

显示结果为:(为了方便查看,已手动调整换行)

<button>

<span slot="first">12345</span>

为了明确作用范围,

<span slot="second">56789</span>

所以使用button标签

</button>

⑤分发内容的作用域:

被分发的内容的作用域,根据其所在模板决定,例如,以上标签,其在父组件的模板中(虽然其被子组件的children标签所包括,但由于他不在子组件的template属性中,因此不属于子组件),则受父组件所控制。

示例代码:

<div id="app">  <children>  <span slot="first" @click="tobeknow">12345</span>  <span slot="second">56789</span>  <!--上面这行不会显示-->  </children>  
</div>  
<script>  var vm = new Vue({  el: '#app',  methods: {  tobeknow: function () {  console.log("It is the parent's method");  }  },  components: {  children: {    //这个无返回值,不会继续派发  template: "<button><slot name='first'></slot>为了明确作用范围,<slot name='second'></slot>所以使用button标签</button>"  }  }  });  
</script>  

当点击文字12345的区域时(而不是按钮全部),会触发父组件的tobeknow方法。

但是点击其他区域时则没有影响。

官方教程是这么说的:

父组件模板的内容在父组件作用域内编译;子组件模板的内容在子组件作用域内编译。

⑥当没有分发内容时的提示:

假如父组件没有在子组件中放置有标签,或者是父组件在子组件中放置标签,但有slot属性,而子组件中没有该slot属性的标签。

那么,子组件的slot标签,将不会起到任何作用。

除非,该slot标签内有内容,那么在无分发内容的时候,会显示该slot标签内的内容。

如示例代码:

<div id="app">  <children>  <span slot="first">【12345】</span>  <!--上面这行不会显示-->  </children>  
</div>  
<script>  var vm = new Vue({  el: '#app',  components: {  children: {    //这个无返回值,不会继续派发  template: "<div><slot name='first'><button>【如果没有内容则显示我1】</button></slot>为了明确作用范围,<slot name='last'><button>【如果没有内容则显示我2】</button></slot>所以使用button标签</div>"  }  }  });  
</script> 

 说明:

【1】name=’first’的slot标签被父组件对应的标签所替换(slot标签内部的内容被舍弃);

【2】name=’last’的slot标签,因为没有对应的内容,则显示该slot标签内部的内容。

⑦假如想控制子组件根标签的属性 

【1】首先,由于模板标签是属于父组件的,因此,将子组件的指令绑定在模板标签里,是不可以的(因为他归属于父组件);

【2】假如需要通过父组件控制子组件是否显示(例如v-if或者v-show),那么这个指令显然是属于父组件的(例如放在父组件的data下面)。可以将标签写在子组件的模板上。

如代码:

<div id="app">  <button @click="toshow">点击让子组件显示</button>  <children v-if="abc">  </children>  
</div>  
<script>  var vm = new Vue({  el: '#app',  data: {  abc: false  },  methods: {  toshow: function () {  this.abc = !this.abc;  }  },  components: {  children: {    //这个无返回值,不会继续派发  template: "<div>这里是子组件</div>"  }  }  });  
</script>  

说明:通过父组件(点击按钮,切换v-if指令的值)控制子组件是否显示。

【3】假如需要通过子组件,控制子组件是否显示(比如让他隐藏),那么这个指令显然是属于子组件的(会将值放在子组件的data属性下),那么就不能像上面这么写,而是必须放置在子组件的根标签中。

<div id="app">  <button @click="toshow">点击让子组件显示</button>  <children>  <span slot="first">【12345】</span>  <!--上面这行不会显示-->  </children>  
</div>  
<script>  var vm = new Vue({  el: '#app',  methods: {  toshow: function () {  this.$children[0].tohidden = true;  }  },  components: {  children: {    //这个无返回值,不会继续派发  template: "<div v-if='tohidden' @click='tohide'>这里是子组件</div>",  data: function () {  return {  tohidden: true  }  },  methods: {  tohide: function () {  this.tohidden = !this.tohidden;  }  }  }  }  });  
</script>  

说明:

点击子组件会让子组件消失;

点击父组件的按钮,通过更改子组件的tohidden属性,让子组件重新显示。

子组件的指令绑定在子组件的模板之中(如此才能调用);

转自:https://blog.csdn.net/sinat_17775997/article/details/52484072#comments

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++获取本机所有ip地址,可区分类型是有线无线虚拟机还是回环

一个小程序&#xff0c;可以获取本地所有ip地址&#xff0c;包括有线&#xff0c;无线&#xff0c;虚拟机&#xff0c;环回接口网卡&#xff0c;等。 如图&#xff0c;一台机器多个网卡&#xff1a; 程序执行结果&#xff1a; #include"stdio.h" #include"…

顿悟人生十一句话

一、永远不要埋怨你已经发生的事情 如果你打算忍受一件事情就闭上嘴巴吧。要么就改变它&#xff0c;要么就安静的接受它。 二、最让你忿忿不平的问题&#xff0c;就是你需要解决的问题 一个被酒后驾驶的司机撞死自己儿子的妇女&#xff0c;发起了反对酒后驾驶母亲协会…

Mybatis 在 IDEA 中使用 generator 逆向工程生成 pojo,mapper

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 使用mybatis可以逆向生成pojo和mapper文件有很多种方式&#xff0c;我以前用的是mybtais自带的generator包来生成&#xff0c;连接如下&…

控制台程序隐藏方法总结(四种)

学习计算机&#xff0c;往往先从Windows环境下学习编程&#xff0c;学习编程&#xff0c;往往从C学起&#xff0c;学习C&#xff0c;往往又从控制台程序学习&#xff0c;何为控制台&#xff0c;就是那个黑框白字的界面。对于这样一个最初认为奇陋无比而现在认为无所不能的编程平…

十大教养,让你气度非凡!

01.守时 无论是开会、赴约&#xff0c;有教养的人从不迟到。他们懂得&#xff0c;即使是无意迟到&#xff0c;对其他准时到场的人来说&#xff0c;也是不尊重的表现。 02.谈吐有节 注意从不随便打断别人的谈话&#xff0c;总是先听完对方的发言&#xff0c;然后再去反驳或者补…

mybatis :Criteria 查询、条件过滤用法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 PS&#xff1a;hibernate 中也有 Criteria 的用法&#xff0c;见另一文章&#xff1a;jpa : criteria 作排除过滤、查询 1. 包&#xf…

C++11多线程----线程管理

说到多线程编程&#xff0c;那么就不得不提并行和并发&#xff0c;多线程是实现并发&#xff08;并行&#xff09;的一种手段。并行是指两个或多个独立的操作同时进行。注意这里是同时进行&#xff0c;区别于并发&#xff0c;在一个时间段内执行多个操作。在单核时代&#xff0…

揭秘赚钱的技巧,学会让钱自己进来

学习把负债变为资产 贫穷是一种习惯&#xff0c;而不只是口袋里金钱的多寡。 每个人每天的时间是相同的&#xff0c;有人利用它来打工&#xff0c;赚取约80新台币的工资。也有人将时间用来教书&#xff0c;每小时赚取约500新台币&#xff0c;也有人用这些时间来上网&#xff0c…

Shell编程入门基础上

前言 为什么学 Shell Shell 脚本语言是实现 Linux/UNIX 系统管理及自动化运维所必备的重要工具&#xff0c; Linux/UNIX 系统的底层及基础应用软件的核心大都涉及 Shell 脚本的内容。每一个合格 的Linux 系统管理员或运维工程师&#xff0c;都需要能够熟练地编写 Shell 脚本语言…

宝宝不开心 : 减肚子大战进行中、持续更新,看看一个月后能不能把腰瘦下来 ...

公司研发中心离家很近&#xff0c;于是来这边后就天天回家吃吃、喝喝、睡睡 ... 中午一个半小时休&#xff0c;吃完就滚上床铺&#xff1a;睡午觉&#xff0c;就这样 天天过得好不惬意 ... // 每周也会发零售&#xff0c;大家都吃得乐呵呵的&#xff0c;晚上加班都是组上好些个…

内存问题提醒!结构体+protobuf做协议体发送!序列化

内存的三种分配方式&#xff1a; 1&#xff0e; 从静态存储区分配&#xff1a;此时的内存在程序编译的时候已经分配好&#xff0c;并且在程序的整个运行期间都存在。全局变量&#xff0c;static变量等在此存储。 2&#xff0e; 在栈区分配&#xff1a;相关代码执行时创建&…

穷人迈向富翁的理财十步曲

当你每日的储蓄随着时间的累积&#xff0c;达到一定数量后再转存到存款薄里&#xff0c;如此日积月累&#xff0c;就可以逐渐养成自身存钱理财的习惯。不管你做什么事情&#xff0c;是否养成了良好的习惯&#xff0c;都会决定你的成败。理财投资也是同样道理&#xff0c;在你养…

【融云分析】选择IM云服务,需要看哪些核心技术指标?

IM&#xff08;即时通讯&#xff09;云服务已发展数年&#xff0c;不少企业与开发者都倾向于选择第三方IM云服务&#xff0c;短平快地为应用添加即时通讯能力&#xff0c;但如何选择服务商却是个难题&#xff0c;单从简单的功能介绍来看无法判断&#xff0c;因为IM云服务接入后…

Nginx 配置详解

序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今&#xff0c;凭借开源的力量&#xff0c;已经接近成熟与完善。 Nginx功能丰富&#xff0c;可作为HTTP服务器&#xff0c;也可作为反向代理服务器&#xff0c;邮件服务器。支持FastCGI…

protocol buffers使用说明

一、什么是protocol buffers Protocol buffers是一个灵活的、高效的、自动化的用于对结构化数据进行序列化的协议&#xff0c;与XML相比&#xff0c;Protocol buffers序列化后的码流更小、速度更快、操作更简单。你只需要将要被序列化的数据结构定义一次(译注&#xff1a;使用…

jeeCMS首页加载流程

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/gyshun/article/details/79669293 如果JEECMS部署完毕之后&#xff0c;在浏览器中输入http://localhost:8080/jeecms&#xff0c;系统直接会按照以下步骤执行&#xff1a; 首…

车子突然溜坡追尾 驾校教练说挂P挡拉手刹不会溜坡

昨天4:44&#xff0c;朱先生来电&#xff1a;刚才登云路一个烧烤店门口&#xff0c;一辆车停在自己的车位上的&#xff0c;不知什么原因&#xff0c;突然溜坡撞上前面的一辆出租车。稀奇的是&#xff0c;这个溜坡的驾驶员全程都是车上睡觉睡着的&#xff0c;什么都不知道。记者…

VSCode 汉化、设置为 中文语言显示 、中文界面

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Vscode是一款开源的跨平台编辑器。默认情况下&#xff0c;vscode使用的语言为英文(us)&#xff0c;如何将其显示语言修改成中文了&#…

c++执行vbs脚本

#include<fstream> using namespace std;int main() {fstream out("StartIE.vbs",ios::out);out<<"AppName\"启动IE\"\n\Set WshellWScript.CreateObject(\"WScript.Shell\")\n\Set ieWScript.CreateObject(\"InternetEx…

Python-21-socket编程

一、基础知识 1. C/S架构 C/S架构即客户机/服务器模式。 它可以分为客户机和服务器两层&#xff1a; 第一层: 在客户机系统上结合了界面显示与业务逻辑&#xff1b; 第二层: 通过网络结合了数据库服务器。 简单的说就是第一层是用户表示层&#xff0c;第二层是数据库层。 这里…