使用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 相关文章推荐
30个最好的jQuery 灯箱插件分享
Apr 25 Javascript
Function.prototype.call.apply结合用法分析示例
Jul 03 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
Aug 16 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
Jun 16 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
Jan 20 Javascript
React简单介绍
May 24 Javascript
Angular 2父子组件之间共享服务通信的实现
Jul 04 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
Dec 18 Javascript
js实现鼠标单击Tab表单切换效果
May 16 Javascript
微信小程序支付前端源码
Aug 29 Javascript
vue实现倒计时获取验证码效果
Apr 17 Javascript
Jquery异步上传文件代码实例
Nov 13 jQuery
不使用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
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
php导出csv文件,可导出前导0实例代码
2016/11/16 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
jquery异步请求实例代码
2011/06/21 Javascript
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
JS实现文字掉落效果的方法
2015/05/06 Javascript
javascript常用功能汇总
2015/07/05 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
javascript 中null和undefined区分和比较
2017/04/19 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
React Native 使用Fetch发送网络请求的示例代码
2017/12/02 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
2019/01/23 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
2019/06/24 Javascript
vue 实现模糊检索并根据其他字符的首字母顺序排列
2019/09/19 Javascript
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
初步探究Python程序的执行原理
2015/04/11 Python
Python中文件的读取和写入操作
2018/04/27 Python
python中的decorator的作用详解
2018/07/26 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
教师岗位职责范本
2013/12/29 职场文书
综合实践活动方案
2014/02/14 职场文书
体育运动口号
2014/06/09 职场文书
领导党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers