使用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 相关文章推荐
显示、隐藏密码
Jul 01 Javascript
javascript实现的一个随机点名功能
Aug 26 Javascript
jQuery对指定元素中指定字符串进行替换的方法
Mar 17 Javascript
javascript中checkbox使用方法简单实例演示
Nov 17 Javascript
js获取当前日期时间及其它日期操作汇总
Mar 08 Javascript
使用JavaScript获取URL中的参数(两种方法)
Nov 16 Javascript
JS日程管理插件FullCalendar中文说明文档
Feb 06 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
Aug 31 Javascript
JS数组实现分类统计实例代码
Sep 30 Javascript
Angular设置别名alias的方法
Nov 08 Javascript
详解JavaScript类型判断的四种方法
Oct 21 Javascript
动态实现element ui的el-table某列数据不同样式的示例
Jan 22 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
提取HTML标签
2006/10/09 PHP
php curl模拟post提交数据示例
2013/12/31 PHP
php简单解析mysqli查询结果的方法(2种方法)
2016/06/29 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
php session_decode函数用法讲解
2019/05/26 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
2019/06/19 PHP
PHP字符串与数组处理函数用法小结
2020/01/07 PHP
jquery 1.3.2 IE8中的一点点的小问题解决方法
2009/07/10 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
vue.js+Element实现表格里的增删改查
2017/01/18 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
Python常用库推荐
2016/12/04 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
python2.7实现爬虫网页数据
2018/05/25 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
python 19个值得学习的编程技巧
2020/08/15 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
木马的传播途径主要有哪些
2016/04/08 面试题
50道外企软件测试面试题
2014/08/18 面试题
就业自荐书
2013/12/05 职场文书
简单的项目建议书模板
2014/03/12 职场文书
房展策划方案
2014/06/07 职场文书
汽车运用工程专业求职信
2014/06/18 职场文书
求职简历自我评价范文
2015/03/10 职场文书
小学教师节活动总结
2015/03/20 职场文书
博士生专家推荐信
2015/03/25 职场文书
文化大革命观后感
2015/06/17 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电
天谕手游15杯全调酒配方和调酒券的获得方式
2022/04/06 其他游戏
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL