使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)


Posted in Javascript onMay 01, 2018

写在前面

之前写过一篇关于vue实现dialog会话框组件的文章https://3water.com/article/139218.htm

 讲到了如何实现一个vue对话框组件,其中涉及到了父组件和子组件的通信,这个不用多说,看我之前的文章就能明白,文章最后也说到了,我们可以使用slot插槽来编写组件,slot用来分发内容到子组件中,从而实现组件的高度复用,编写的组件更加灵活。

还是结合对话框的例子,使用slot来实现对话框组件

注册一个名叫dialog-tip的全局组件

Vue.component('dialog-tip', {
   template: '#dialog-tip',
   props:['dialogShow','message'],
   data:function(){
    return {
     content:''
    }
   },
   methods:{
   }
  });

使用templete标签来定义这个组件

<template id="dialog-tip">
  <div class="dialog_tip" v-if="dialogShow">
   <div class="dialog_tip--mask"></div>
   <div class="dialog_tip--content">
    <div class="dialog_tip--content__txt">
     <slot name="msg">请输入1-8000之间任意整数</slot>
    </div>
    <div class="dialog_tip--content__btns">
     <slot>
      <button class="btn">确定</button>
      <button class="btn">重新输入</button>
      <button class="btn">去注册</button>
     </slot>
    </div>
   </div>
  </div>
 </template>

<template id="dialog-tip">
  <div class="dialog_tip" v-if="dialogShow">
   <div class="dialog_tip--mask"></div>
   <div class="dialog_tip--content">
    <div class="dialog_tip--content__txt">
     <slot name="msg">请输入1-8000之间任意整数</slot>
    </div>
    <div class="dialog_tip--content__btns">
     <slot>
      <button class="btn">确定</button>
      <button class="btn">重新输入</button>
      <button class="btn">去注册</button>
     </slot>
    </div>
   </div>
  </div>
 </template>

组件内容包括两部分 ,一个是提示内容,一个是button按钮,我们将要修改替换的内容使用slot包含起来,
 这样父组件就可以分发内容到子组件里面了。

<div class="dialog_tip--content__txt">
     <slot name="msg">请输入1-8000之间任意整数</slot>
    </div>
    <div class="dialog_tip--content__btns">
     <slot>
      <button class="btn">确定</button>
      <button class="btn">重新输入</button>
      <button class="btn">去注册</button>
     </slot>
    </div>

除了默认插槽,还可以定义具名插槽 ,如果组件中有好几个部分内容需要替换,我们可以为它定义一个name,例如:

<slot name="msg">请输入1-8000之间任意整数</slot>

这样在使用组件的时候,指定slot的name ,就会将这一部分内容替换掉,而不会替换其他的插槽内容

<p slot="msg">请输入正确手机号</p>

使用定义好的dialog组件

<dialog-tip message="hello" :dialog-show="dialogShow.tip3">
   <p slot="msg">请输入正确手机号</p>
   <button class="btn" @click="closeDialogTip('tip3')">确定</button>
  </dialog-tip>
  <dialog-tip message="hello" :dialog-show="dialogShow.tip4">
   <p slot="msg">抱歉,没有此用户,请核实后输入</p>
   <button class="btn" @click="closeDialogTip('tip4')">重新输入</button>
   <button class="btn" @click="reg">去注册</button>
  </dialog-tip>

如果不指定slot的名称,默认dialog-tip标签里面的内容会替换子组件中使用slot包含的内容部分,例如以上

使用slot指定了它的名称来替换子组件中的对应的slot部分,而没有使用slot指定名称的内容会默认将子组件中
 没有定义具名插槽的部分内容替换掉。

需要注意的是,如果dialog-tip标签里没有定义需要分发的内容,那么子组件中会显示默认的插槽内容

关于更多的slot用法,请移步https://cn.vuejs.org/v2/guide/components-slots.html

最后

效果图

使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)

总结

以上所述是小编给大家介绍的使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
javascript下string.format函数补充
Aug 24 Javascript
js关闭子窗体刷新父窗体实现方法
Dec 04 Javascript
利用Keydown事件阻止用户输入实现代码
Mar 11 Javascript
JavaScript优化专题之Loading and Execution加载和运行
Jan 20 Javascript
JavaScript中循环遍历Array与Map的方法小结
Mar 12 Javascript
原生js制作日历控件实例分享
Apr 06 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
Nov 02 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
Apr 26 Javascript
vue实现条件叠加搜索的解决方法
May 28 Javascript
vue element-ui读取pdf文件的方法
Nov 26 Javascript
Vue如何实现监听组件原生事件
Jul 03 Javascript
vue data有值,但是页面{{}} 取不到值的解决
Nov 09 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
May 01 #Javascript
如何获取TypeScript的声明文件.d.ts
May 01 #Javascript
Vue项目中使用Vux的安装过程
May 01 #Javascript
在Vue项目中使用d3.js的实例代码
May 01 #Javascript
详解ajax的data参数错误导致页面崩溃
Apr 30 #Javascript
妙用缓存调用链实现JS方法的重载
Apr 30 #Javascript
JS实现的缓冲运动效果示例
Apr 30 #Javascript
You might like
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
在php中使用sockets:从新闻组中获取文章
2006/10/09 PHP
php获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
PHP中PDO的错误处理
2011/09/04 PHP
PHP代码审核的详细介绍
2013/06/13 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
Javascript中暂停功能的实现代码
2007/03/04 Javascript
理解JavaScript表单的基础知识
2016/01/25 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
微信小程序 实现点击添加移除class
2017/06/12 Javascript
关于定制FileField中的上传文件名称问题
2017/08/22 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
[01:08:29]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第一场 1月9日
2021/03/11 DOTA
Python实现随机选择元素功能
2017/09/14 Python
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
python读取并定位excel数据坐标系详解
2019/06/26 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
PHP面试题集
2016/12/18 面试题
广告学专业推荐信范文
2013/11/23 职场文书
赡养老人协议书
2014/04/21 职场文书
2014年社会实践活动总结范文
2014/04/29 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
Python学习之os包使用教程详解
2022/03/21 Python
Java 关于String字符串原理上的问题
2022/04/07 Java/Android
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS
Go Grpc Gateway兼容HTTP协议文档自动生成网关
2022/06/16 Golang