Vue2.0 slot分发内容与props验证的方法


Posted in Javascript onDecember 12, 2017

使用一种方式混合父组件的内容与子组件自己的模板,这个过程被称为“内容分发”。在子组件中使用特殊的<slot>元素作为内容的插槽。

Slot分发内容

概述:

简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示、不显示、在哪个地方显示、如何显示,就是slot分发负责的活。

默认情况下

父组件在子组件内套的内容,是不显示的。

例如代码:

<div id="app"> 
  <children> 
    <span>12345</span> 
    <!--上面这行不会显示--> 
  </children> 
</div> 
<script> 
  var vm = new Vue({ 
    el: '#app', 
    components: { 
      children: {  //这个无返回值,不会继续派发 
        template: "<button>为了明确作用范围,所以使用button标签</button>" 
      } 
    } 
  }); 
</script>

显示内容是一个button按钮,不包含span标签里面的内容;

一、单个slot

在子组件模板中有slot标签,被视为备用内容,在父组件不提供内容的情况下使用。如果父组件提供内容,则把整个内容片段插入到slot所在的DOM位置,并替换掉slot标签本身。

子组件模板中没有slot标签,父组件提供的内容会被抛弃

如果替换的内容较多,可以直接用一个template替换。

<div id="app">
  <h2>自定义组件</h2>
  <custom>
   <!-- 当卸载自定义标签之前的内容,要混合子组件中的模板 -->
   <div>我是父组件提供的内容,我的存在会替换子组件中slot标签内的内容</div> 
  </custom>
</div>
<script type="text/javascript" src='https://i0.jrjimg.cn/zqt-red-1000/focus/focus2017YMZ/teamFrighting/js/vue.min.js'></script>
<script>
 Vue.component('custom',{
  template:`
   <div>
    <slot>
     <div>我备用内容,如果子组件中有内容会替换我哦~</div>
    </slot>
   </div>
  `
 })
 new Vue({
  el:"#app"
 })
</script>

见证奇迹的时候到了,页面上会显示如下内容

Vue2.0 slot分发内容与props验证的方法 

单个slot.png

二、有具体名称的slot

<slot>元素可以用一个特殊的属性name来配置如何分发内容。

<div id="app">
  <h2>自定义组件</h2>
  <custom>
   <!-- <div slot="one">我替换one</div> -->
   <div slot="three">我替换three</div>
   <div slot="two">我替换two</div>
   <span slot="two">我替换two</span>
   <div slot="one">我替换one</div>
  </custom>
</div>
<script type="text/javascript" src='https://i0.jrjimg.cn/zqt-red-1000/focus/focus2017YMZ/teamFrighting/js/vue.min.js'></script>
<script>
 Vue.component('custom',{
  template:`
   <div>
    <slot name="one"> 
     <p>我是one</p>
    </slot>
    <slot name="two">
     <p>我是two</p>
    </slot>
    <slot name="three">
     <p>我是three</p>
    </slot>
   </div>
  `
 })
 new Vue({
  el:"#app"
 })
</script>

你猜页面上会显示什么?猜对了我就告诉你-。-

Vue2.0 slot分发内容与props验证的方法 

具名slot.png

是不是被顺序惊到了,这是因为页面会根据子组件中slot的顺序去替换内容并渲染页面。

可以使用一个匿名的slot,处理那些没有对应slot的内容

<div id="app">
  <h2>自定义组件</h2>
  <custom>
   <!-- <div slot="one">我替换one</div> -->
   <div slot="three">我替换three</div>
   <div slot="two">我替换two</div>
   <span slot="two">我替换two</span>
   <div slot="one">我替换one</div>
   <div>替换无名的slot</div>
   <div>替换无名的slot</div>
   <div>替换无名的slot</div>
  </custom>
 </div>
<script type="text/javascript" src='https://i0.jrjimg.cn/zqt-red-1000/focus/focus2017YMZ/teamFrighting/js/vue.min.js'></script>
<script>
 Vue.component('custom',{
  template:`
   <div>
    <slot name="one"> 
     <p>我是one</p>
    </slot>
    <slot name="two">
     <p>我是two</p>
    </slot>
    <slot name="three">
     <p>我是three</p>
    </slot>
    <slot>
     <p>我是无名的slot</p>
    </slot>
   </div>
  `
 })
 new Vue({
  el:"#app"
 })
</script>

匿名的slot就会被那些没有对应slot的内容替换。

Vue2.0 slot分发内容与props验证的方法 

匿名slot.png

三、编译作用域

父组件模板的内容在父组件作用域内编译

子组件模板的内容在子组件作用域内编译

<div id="app">
  <h2>自定义组件</h2>
  <custom>
   <!-- 渲染的数据,是父组件中的数据,如果想使用子组件中的数据,就在子组件中建立自己的数据 -->
   {{message}}
  </custom>
</div>
<script type="text/javascript" src='https://i0.jrjimg.cn/zqt-red-1000/focus/focus2017YMZ/teamFrighting/js/vue.min.js'></script>
<script>
 Vue.component('custom',{
  data(){
   return {
    message:"我是子组件的数据"
   }
  },
  template:`
   <div>
    <p>我是{{message}}</p>
    <slot>
    // 这的内容会被父组件中内容替换
     <p> {{message}}</p>
    </slot>
   </div>
  `
 })
 new Vue({
  el:"#app",
  data:{
   message:"我是父组件的数据"
  }
 })
</script>

页面渲染

Vue2.0 slot分发内容与props验证的方法 

编译作用域.png

运用了slot分发,使我们对组件的应用更加灵活。

单向数据流

数据从父组件传递给子组件,只能单项绑定。

在子组件内不应该修改父组件传递过来的数据。

改变prop的情况:

1.作为data中局部数据的初始值使用

2.作为子组件中computed属性

props 验证

我们在父组件给子组件传值得时候,为了避免不必要的错误,可以给prop的值进行类型设定,让父组件给子组件传值得时候,更加准确

props:{
  propA:Number, 数值类型
  propB:[String,Number], 多种类型
  propC:{type:String,required:true}, 必填项
  propD:{type:Number,default:100}, 默认是
  propE:{typr:Number,default:function(){return 1000}}
  propF:{validator:function(value){return value>2}} 符合value>2的值
  }

不明白,看如下案例,要求父组件给子组件传值得时候

1、这个参数是必须传的

2、值必须是数值类型的

3、默认参数是10

Vue.component('custom-cmpontent',{
  data(){
   return {
    incrementCount:this.count //作为局部组件的data的初始值
   }
  },
  props:{
   count:{
    type:Number, // 类型
    default:10, // 默认值
    required:true //必须要传参数
   }
  },
  computed:{
   incrementCount2(){
    return this.incrementCount
   }
  },
  template:`
    <div>
     <h2>我是一个自定义组件</h2>
     <input type='button' value="改变count的值" @click="changeCount">
     {{incrementCount}}
    </div>
  `,
  methods:{
   changeCount:function(value){
    this.incrementCount++;
    this.$emit('receive')
   }
  }
 })
 new Vue({
  el:"#app",
  data:{
   count:0
  },
  methods:{
   countH:function(){
    this.count++;
   }
  }
 })

那如果我们给子组件传值得时候,传过去的是一个字符串,就会报错

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于Jquery的淡入淡出的特效基础练习
Dec 13 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
Feb 03 Javascript
Easyui 之 Treegrid 笔记
Apr 29 Javascript
localStorage的黑科技-js和css缓存机制
Feb 06 Javascript
微信小程序 template模板详解及实例
Feb 21 Javascript
JavaScript面试出现频繁的一些易错点整理
Mar 29 Javascript
vue.js 实现输入框动态添加功能
Jun 25 Javascript
vue.js父子组件通信动态绑定的实例
Sep 28 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
Oct 14 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
Apr 21 Javascript
详解JavaScript中的this指向问题
Feb 05 Javascript
JavaScript实现一键复制内容剪贴板
Jul 23 Javascript
分析JS中this引发的bug
Dec 12 #Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
Dec 12 #Javascript
基于input动态模糊查询的实现方法
Dec 12 #Javascript
详解vue.js之props传递参数
Dec 12 #Javascript
react实现菜单权限控制的方法
Dec 11 #Javascript
Angular 作用域scope的具体使用
Dec 11 #Javascript
angularjs实现柱状图动态加载的示例
Dec 11 #Javascript
You might like
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
解决File size limit exceeded 错误的方法
2013/06/14 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
php+Ajax无刷新验证用户名操作实例详解
2019/03/04 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
Javascript 读后台cookie代码
2008/09/15 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
JS重载实现方法分析
2016/12/16 Javascript
ES6学习笔记之正则表达式和字符串正则方法分析
2017/04/25 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
vue项目中使用particles实现粒子背景效果及遇到的坑(按钮没有点击响应)
2020/02/11 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
vue实现简单加法计算器
2020/10/22 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
[44:40]KG vs LGD 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
python获取当前日期和时间的方法
2015/04/30 Python
浅谈dataframe中更改列属性的方法
2018/07/10 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
浅析python参数的知识点
2018/12/10 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
Python eval函数原理及用法解析
2020/11/14 Python
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
分布式数据库需要考虑哪些问题
2013/12/08 面试题
武汉某公司的C#笔试题面试题
2015/12/25 面试题
拾金不昧表扬信范文
2014/01/11 职场文书
学习十八大报告感言
2014/02/04 职场文书
2014党员自我评议表范文
2014/09/20 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
《角的度量》教学反思
2016/02/18 职场文书
Python Django搭建文件下载服务器的实现
2021/05/10 Python