vue中的组件是自定的标签,可以扩展的原生html元素,封装可复用的代码

note:

1、在标签命中不要使用大写,标签名字必须用短横线隔开

2、模板中只能有一个根元素,不能使用并列标签。

定义组件

  • 全局定义,在所有实例中都可以使用这个组件
<template id='hello'>
<div>
<div>hello</div>
<div>world</div>
</div>
</template>
let data={msg:'world'}
Vue.component('myComponent',{
template:'#hello',//通过模板的ID来引用这个组件
return {msg:'world'};//此时不能return data;这样会导致如果有多个实例运用这个组件会导致,三者共享同一个data,改变其中一个,会导致其他的都改变。对象变量会导致共享数据。
})
此时就可以在实例中使用my-component标签。
  • 局部定义
let vm=new Vue({
el:'#app',
data:{msg:'hello'},
components:{
'my-component'(myComponent):{
template:'<h1>{{msg}}</h1>',
data(){
return {msg:'world'};
}
}
}
})
1、子组件不能直接使用父组件的数据
2、子组件可以声明自己的数据

组件之间的数据传递

1、每个组件是没关系的,都应该产生自己的数据。在组件中data使用的方法和默认的vm一样。只是data不再是对象而是函数。组件可以无限嵌套。
2、声明组件的名字,不能为已经存在的标签
3、组件的嵌套,子组件必须写在父组建的模板中才能使用
  • 1、父级向子级传递数据(传递的属性值)
1、如果直接写a='b'格式传递的是字符串,动态数据获取用的是v-bind,一般无论是动态还是静态,我们都会采用:。
2、:msg='meat',meat是变量;msg='meat',meat是字符串,:msg="'meat'",meat是字符串
3、子级不能直接改变父级的数据,如果要修改可以将父级的数据修改后赋值给子级的变量,可以使用data或者computed
<div id=app>
<child :data='aaa' :data1="bbb"></child>
//此处,在子组件中左边的是子组件的接收,用props接收,如果是放在数组中每一项就是一个字符串,右边是从父级传递的数据。
</div>
<script>
let vm=new Vue({
el:'#app',
data:{
aaa:'xxxxx',
bbb:'yyyyy'
}
components:{//
child:{
props:['data','data1'],
template:'<div>{{msg}}</div>',
data(){
return {msg:this.data+'zxvv'}
},
computed:{
msg:{
get(){
return this.data+'zxvv'
}
}
}
}
}
})
</script>

props中的validate

1、props:['xx','yy','zz'];
2、props:{
aa:{
type:[Number,String],//选择值得类型符不符合要求
default:'acac',//默认值
validator(val){//校验函数
return val>200//返回false,校验失败。
}
required:true,//代表属性必须填
}
}
  • 2、子级向父级传递数据(借助于事件)
1、子级$emit后会触发自己身上的某一个自定的方法,这个方法对应的函数在父级的身上。
<div id="app1">
{{datas}}
<child @get-data="getData"></child>//自定义方法写在自己身上,右边的是父级对应方法的函数
</div>
let vm1 = new Vue({
el: '#app1',
data: {
datas: '',//用来接收自己传递的空数据
},
methods: {
getData(msg){//接受的参数就是从子级传递过来的数据
this.datas = msg;
}
},
components: {
child: {
template: `<div><button @click="say">{{msg}}</button></div>`,//绑定触发事件
methods: {
say(){//触发事件,以及自定义方法
this.$emit('get-data', this.msg);//这里的this指的是当前子组件
}
},
data(){
return {
msg: 'xxx'
}
}
}
} })
  • 3、兄弟之间传递数据
1、兄弟之间传递数据需要借助于事件车,通过事件车的方式传递数据eventBus
2、创建一个Vue的实例,让各个兄弟共用同一个事件机制。
3、传递数据方,通过一个事件触发bus.$emit(方法名,传递的数据)。
4、接收数据方,通过mounted(){}触发bus.$on(方法名,function(接收数据的参数){用该组件的数据接收传递过来的数据}),此时函数中的this已经发生了改变,可以使用箭头函数。

slot

具名slot,通过组件传入模板,每个模板指定是slot名字,这个名字和定制模板匹配到,会替换定制的模板。
slot是vue中提供的一个标签,用来做模板定制的。属性,事件,定制模板组成了组件的API。
**使用slot分发内容**
为了让组件可以组合,我们需要一种防暑混合父组件的内容与子组件自己的模板。这个过程被称作内容分发(transclusion),vue.js实现了一个内容分发API,使用特殊的<slot>元素作为原始内容的插槽。
**编译作用域**
父组件模板的内容在父组件作用域内编译;子组件模板的内容在子组件作用域内编译。
**单个slot**
除非子组件模板包含至少一个 <slot> 插口,否则父组件的内容将会被丢弃。当子组件模板只有一个没有属性的 slot 时,父组件整个内容片段将插入到 slot 所在的 DOM 位置,并替换掉 slot 标签本身。
最初在 <slot> 标签中的任何内容都被视为备用内容。备用内容在子组件的作用域内编译,并且只有在宿主元素为空,且没有要插入的内容时才显示备用内容。
**具名slot**
<slot>元素可以用有个特殊的属性name来配置如何分发内容。多个slot可以有不同的名字。具名slot将匹配内容片段中对应slot特性的元素。但任然可以有一个匿名slot,它是默认的slot,作为找不到匹配的内容片段的备用插槽。如果没有默认的slot,这些找不到匹配的内容将被抛弃。

递归组件

组件在它的模板内可以递归地调用自己。recursive 递归组件,自己调用自己,必须有中断条件。
默认情况下,递归组件是不会执行的,要制定name属性(只在局部组件中需要添加),全局逐渐不需要加name属性。

动态组件

is可以指定当前标签内可以指定插入什么元素,可以防止解析出错。
radio中默认没有绑定数据,要给value值,这个value值会映射到radio上
<keep-alive>
<component :is="rad"></component><!--缓存组件的上一次状态,防止每次切换时都需要渲染组件-->
</keep-alive>

Vue基础知识之组件及组件之间的数据传递(五)的更多相关文章

  1. Vue 爬坑之路(二)—— 组件之间的数据传递

    Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递. 首先用 vue-cli 创建一个项目,其中 App.vue 是父组件,com ...

  2. 解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function

    Vue的项目中,如果项目简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式 进行传递 但是如果是大中型项目中,很多时候都需要在不相关的平行组件之间传递数据,并且很多数据需要 ...

  3. Vue之组件之间的数据传递

    Vue的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据,必须使用特定的方法才能实现组件之间的数据传递. 下列为在vue-cli创建项目中的操作 一·父组件向子组件传递数据 在Vue中 ...

  4. 【整理】解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function

    解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function https://www.cnblogs.com/jaso ...

  5. (转)Vue 爬坑之路(二)—— 组件之间的数据传递

    Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递. 首先用 vue-cli 创建一个项目,其中 App.vue 是父组件,com ...

  6. React中父组件与子组件之间的数据传递和标准化的思考

    React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...

  7. vue基础知识之vue-resource/axios

    Vue基础知识之vue-resource和axios(三)   vue-resource Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没 ...

  8. Vue基础知识之vue-resource和axios

    Vue基础知识之vue-resource和axios  原文链接:http://www.cnblogs.com/Juphy/p/7073027.html vue-resource Vue.js是数据驱 ...

  9. Angular06 组件、模块、父子组件之间的数据传递

    1 创建组件 进入到angular项目的根目录,执行如下命令 ng g component test-component 注意:执行完上述命令后在angular项目的src/app文件夹下就会多出一个 ...

随机推荐

  1. .NET练习计算平方根

    1.新建Windows窗体 2.窗体中添加控件:TextBox(文本框).Button(按钮).和Label(标签) 3.为Button对象添加点击事件代码 点击事件代码设计思路 ①从文本框中获取输入 ...

  2. DS博客作业04--树大作业说明

    大作业题目说明 1.目录树 按照如下目录路径,设计一颗目录树保存.并能实现对目录树遍历.目录路径存在file.txt,格式如下: b.txt c\ ab\cd.txt a\bc.txt ab\d.tx ...

  3. 20155229 2016-2017-2 《Java程序设计》第八周学习总结

    20155229 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第十四章 NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以设定缓冲区 ...

  4. 利用Fierce2查询子域名

    http://pnig0s1992.blog.51cto.com/393390/368428 安装方法引用Mickey的: 1.Mickey@pentestbox:/pentest/enumerati ...

  5. 51Nod - 1001:数组中和等于K的数对

    基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对.例如K = 8,数组A: ...

  6. nyoj 密码宝盒

    密码宝盒 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描述 小M得到了一个宝盒,可惜打开这个宝盒需要一组神奇的密码,然而在宝盒的下面 有关于密码的提示信息:密码是一个C进制 ...

  7. revit API 生成墙图元

    由于Revit的版本问题,在网上找的生成墙图元的代码,在我机器上的Revit 2016中编译不能通过,通过多次调试,终于找到在revit 2016中使用API生成墙图元的代码,现在贴出来. 下面的代码 ...

  8. commonJS规范基本结构

    commonJS规范:使用 module.exports 和 require ,基本结构如下: // foo.js 输出模块 module.exports = function(x) { consol ...

  9. php 两种短网址生成方法

    使用以下PHP代码可以生成唯一的6位的短网址. 代码如下: <?php //生成短网址方法1 function shortUrl1($url) { if (empty($url)) { retu ...

  10. win10激活命令

    以管理员方式打开命令提示符输入以下3条命令slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX 按回车slmgr /skms 54.223.212.31 按回车slmgr ...