使用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 相关文章推荐
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
May 06 Javascript
js中查找最近的共有祖先元素的实现代码
Dec 30 Javascript
javascript数组的使用
Mar 28 Javascript
js实现网页随机切换背景图片的方法
Nov 01 Javascript
Javascript window对象详解
Nov 12 Javascript
jquery插件NProgress.js制作网页加载进度条
Jun 05 Javascript
JS提交form表单实例分析
Dec 10 Javascript
Vue通过input筛选数据
Oct 26 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
Aug 08 Javascript
在微信小程序中渲染HTML内容的方法示例
Sep 28 Javascript
javascript实现数字时钟效果
Feb 06 Javascript
JavaScript声明变量和数据类型的转换
Apr 12 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循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
php实现微信发红包功能
2018/07/13 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
javascript生成大小写字母
2015/07/03 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
2016/02/27 Javascript
微信小程序 实例应用(记账)详解
2016/09/28 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
vue 1.x 交互实现仿百度下拉列表示例
2017/10/21 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
JavaScript实现百度搜索框效果
2020/03/26 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
opencv实现简单人脸识别
2021/02/19 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
Python 读取位于包中的数据文件
2020/08/07 Python
基于Django快速集成Echarts代码示例
2020/12/01 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
韩国邮政旗下生鲜食品网上超市:epost
2016/08/27 全球购物
汽车技术服务英文求职信范文
2014/01/02 职场文书
销售员求职个人的自我评价
2014/02/19 职场文书
离婚协议书范文
2015/01/26 职场文书
导游词之山东八大关
2019/12/18 职场文书
Redis IP地址的绑定的实现
2021/05/08 Redis