使用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 相关文章推荐
基于jQuery替换table中的内容并显示进度条的代码
Aug 02 Javascript
使用ajax+jqtransform实现动态加载select
Dec 01 Javascript
JS实现一个按钮的方法
Feb 05 Javascript
Jquery树插件zTree用法入门教程
Feb 17 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
Oct 19 Javascript
详解JavaScript的变量和数据类型
Nov 27 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
Jun 12 Javascript
JS实现环形进度条(从0到100%)效果
Jul 05 Javascript
Vue.js中extend选项和delimiters选项的比较
Jul 17 Javascript
vue--点击当前增加class,其他删除class的方法
Sep 15 Javascript
关于vue-cli 3配置打包优化要点(推荐)
Apr 22 Javascript
JS前端使用canvas实现扩展物体类和事件派发
Aug 05 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
php mysql_real_escape_string函数用法与实例教程
2013/09/30 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
Javascript延迟执行实现方法(setTimeout)
2010/12/30 Javascript
随窗体滑动的小插件sticky源码
2013/06/21 Javascript
JS创建类和对象的两种不同方式
2014/08/08 Javascript
Bootstrap树形控件使用方法详解
2016/01/27 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
Python中操作文件之write()方法的使用教程
2015/05/25 Python
Python正则表达式分组概念与用法详解
2017/06/24 Python
Python中创建二维数组
2018/10/17 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
2019/08/02 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
Django自带的用户验证系统实现
2020/12/18 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
纯CSS3实现地球自转实现代码(图文教程附送源码)
2012/12/26 HTML / CSS
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
HTML5的postMessage的使用手册
2018/12/19 HTML / CSS
Hotels.com印度:酒店预订
2019/05/11 全球购物
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
EntityManager都有哪些方法
2013/11/01 面试题
优秀党员主要事迹
2014/01/19 职场文书
《长相思》听课反思
2014/04/10 职场文书
酒店管理求职信
2014/06/09 职场文书
法人委托书
2014/07/31 职场文书
2014离婚协议书范文
2014/09/10 职场文书
2015年小学教科研工作总结
2015/07/20 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书