vue组件知识总结
vue组件化开发
将一个页面分割成若干个组件,一个页面js+css+html,将自己类容分割出来,方便开发,更好了维护我们的代码,每个组件封装自己的js+html+css,样式命名冲突
组件分类
页面级组件( 例如详情页页面)
基础组件(页面的一部分,例如轮播图)
组件的目的为了实现复用
指令和组件
在标签内增加的行内属性,实现功能指令
组件就是一个自定义(扩展)的标签<hello></hello>,封装代码的,组件的标签名不能破坏原有的html标签
组件:全局组件(不需要引用),局部组件(需要引用)
在vue中一个对象就是一个组件
在组件中data是一个函数,目的是不受别人干扰,因为组件是独立的
使用组件的步骤,
1.声明组件,并且引入到当前页面
2.在组件的父级模板中调用这个组件
组件名称不能和标签相同
全局组件
Vue.component('my-handsone',{
//template只会有一个根元素,而且不能直接放置文本节点
template:'<h1>{{msg}}</a></h1>',
data(){
return { //可以用来定义数据
msg:"帅吗",
types:[1,2,3]
}
}
});
let vm=new Vue({
el:"#app",
data:{}
})- 局部组件
//一个对象就是一个组件
let webeautiful={
template:'<h1>{{msg}}</h1>',
data(){
return {
msg:"很帅呀"
}
}
};
let vm=new Vue({
el:"#app",
//挂载在vue实例中components
components:{
webeautiful
}
})组件的数据传递
父传子属性传递 子组件通过props接收
props的api
type 接收数据的类型
default 默认数据的值
required 必须传递数据 不能和default同时引用
validator 自定义验证
子传父组件,事件触发 $emit->@方法="父组件的方法"
平级交互 eventBus 但是不用 -vuex
父组件调用子类的方法 ref=>this.$ref.xxx.子类方法
slot 插槽 (设置一些空闲的位置等等使用)
父亲传递给儿子数据
先在儿子组件上绑定一个属性名,然后赋值给这个属性 :m="msg",
儿子接受父亲传递的数据,用props接收传递的属性名字,例如 props:{m:{type:Array}}
// 父亲到儿子,默认组件是独立的,相互不能引用数据,可以通过属性方式传递给儿子
let vm=new Vue({
el:"#app",
//根实例上的data都是对象,组件中的都是函数
data:{
money:100
},
//父级传递给子集数据通过绑定属性,如果传递多个可以数组中写多个
template:'<div><child :m="money" o="美女"></child></div>',
components:{
child:{
//子集接收给父级给的数据,通过props属性接收
props:['m','o'],
computed:{
b(){
//这里的this指向子集child
//父亲的数据儿子不能更改 错误写法 this.o="丑呀"
return "大大"+this.o;
}
},
template:"<div>儿子 {{m}} {{b}}</div>"
}
}
})父亲接收儿子传递的参数
儿子通过自定义事件方法中给父亲发射自己的数据
先在儿子组件实例中created中发射一个数据
例如 created(){//传递自己的数据
this.$emit('childs',this.msg);
}
在儿子组件上要绑定这个自定义事件方法,然后里面赋值父亲接收的函数
例如儿子组件 <child @childs="父亲接收的函数"></child>
最后父亲接收的函数很简单,参数就是儿子传递的数据
例如父亲接收的函数 fn(data){//这里面的data就是儿子发射给父亲的参数}
//实例化一个Vue函数
let vm=new Vue({
//child 是儿子 触发了自己的一个方法,绑定了父亲的一个函数方法
template:'<div><child @childs="say"></child></div>',
//方法挂载
methods:{
//父亲的一个方法
say(data){
console.log(data);
}
},
//定义一个儿子组件
components:{
//儿子名字
child:{
//事件和数据初始化之后
created(){
//儿子发射一个方法 传递自己的数据
this.$emit('childs',this.msg);
},
template:'<div>子</div>',
data(){
return {
msg:"我饿了"
}
}, }
},
}).$mount("#app"); //手动将vue挂载在#app标签上
父亲和儿子实现双向数据绑定
父亲传递给儿子数据,儿子触发一个父亲方法,将最新的值传递给父亲,父亲更改后,属性会重新传递儿子,儿子会刷新
父亲先在儿子组件上通过绑定一个属性,然后给这个属性赋值,给儿子传递数据
例如<child :m="msg"></child>
儿子接收父亲的传递的数据props
props:{m:{type=Array}}
儿子拿到数据后,要修改数据,(儿子无法把父亲传递的参数重新赋值)
然后儿子重新发射一个自定义事件方法,后面跟要修改的值
this.$emit("ee",1000);
此时儿子组件上要绑定发射的自定义方法,赋值父亲的接收的函数fn
<child :m="msg" @ee="fn"></child>
父亲接收函数,参数就是儿子发射过来的数据
fn(data){//此时把儿子发射过来的数据data,重新赋值给第一次传递过去的msgreturn this.msg=data;}
这样就成功了实现父与子之间的数据双向绑定
let vm = new Vue({
el:'#app',
//通过在儿子组件上绑定一个属性向儿子传递数据
// @ee="fn" 接收儿子传递过来数据,ee是儿子那边自定义的事件方法,必须绑定在儿子组件上
template:'<div>父亲+{{money}}<child :m="money" @ee="fn"></child></div>',
data:{
money:100
},
methods:{
fn(data){
//父亲接收儿子的数据函数
return this.money=data;
}
},
components:{
child:{
//接收父亲传递过来的属性值
props:{m:{}},
template:'<div>{{m}}<button @click="more"></button></div>',
methods:{
more(){
//向父亲发射一个自定义方法,并传递过去自己的值
this.$emit('ee',1000)
}
}
}
}
})实现父亲月儿子之间的数据双向数据绑定 在高版本中有sync修饰符
父亲先通过在儿子身上绑定一个属性,向儿子传递数据
这时候,属性后面我们跟一个sync修饰符
例如 <child :m.sync="msg"></child>
这时候,儿子要通过props接受父亲传递的参数
props:{
m:{
type:Array //规定是数据类型
}}
儿子接受到数据,发现不满意,发射一个自定义事件方法给父亲
this.$emit('update:m',1000);
此时我们发现父亲的数据m自动更改了,变成1000
let vm = new Vue({
el:'#app',
template:'<div>父{{msg}}<child :a.sync="msg"/></div>',
data:{
msg:'美女'
},
components:{
child:{
props:['a'], //<comp :foo="bar" @update:foo="val => bar = val"></comp>
template:'<div>child {{a}} <button @click="change">换</button></div>',
methods:{
change(){ //固定的写法
//2.3.0版本以后才会用
//用了sync,下面必须用update
this.$emit('update:a','丑女');
}
}
}
}
})
父亲调用子组件的一些方法
第一步先定义儿子有一个fn方法
methods:{fn(){ console.log("王阿姨好漂亮"); }}
第二步在儿子身上标记一个表示ref
<child ref="msg"></child>
第三步父亲在视图加载完成后,调用儿子的fn方法
mounted(){this.$refs.msg.fn();}
this.$refs.msg 调用儿子身上的msg表示,这时候this.$refs.msg指向的就是儿子的实例
实例.fn() 这就调用到了儿子的fn方法
// ref如果写在dom上,表示获取dom,如果写在组件上,表示当前组件的实例
let vm=new Vue({
el:"#app",
template:'<child ref="c"></child>',
//一定要放在mounted下面,因为mounted方法表示数据和视图渲染完成,
mounted(){
//当前的ref指向的是child组件的实例,通过实例调用下面的fn方法
this.$refs.c.fn();
},
components:{
child:{
template:'<div>child</div>',
methods:{
fn(){
alert("王阿姨好漂亮")
}
}
}
}
})兄弟组件之间的数据通讯(就是平级组件之间的数据通讯)
兄弟组件之间数据互通,要借助第三个vue实例
eventBus使用起来不好管理,命名冲突,而且复杂,一般不用
我们通常叫这个实例叫eventBus
let eventBus=new Vue;
将兄弟发射的自定义事件方法,挂载到eventBus实例上
eventBus.$emit('aa',''c');
然后通过$on方法,将兄弟发射的自定义事件方法绑定里面去
后面的回调函数一定要是箭头函数,不改变实例的this,方便赋值
例如 eventBus.$on('aa',(data)=>{console.log(data) }
let eventBus=new Vue;
//eventBus使用起来不好管理,命名冲突,而且复杂,一般不用
let C={
template:'<div>{{val}}<button @click="ss">变C</button></div>',
data(){
return {
val:"C"
}
},
methods:{
ss(){ eventBus.$emit('bb','C');
}
},
created(){
//
eventBus.$on('aa',(data)=>{
this.val=data;
})
}
};
let D={
template:'<div>{{val}}<button @click="ee">变D</button></div>',
data(){
return {
val:"D"
}
},
created(){
//
eventBus.$on("bb",(data)=>{
this.val=data;
})
},
methods:{
ee(){
//
eventBus.$emit('aa','D');
}
}
}
let vm = new Vue({
el:'#app',
//1,找共同父级,时间交互,非常复杂,不采用
template:'<div><C></C><D></D></div>',
data:{ },
components:{
C,
D
}
})使用 slot 分发内容
slot 可以将不同的标签分开发送到指定的节点中
slot 有一个name属性
slot上的name属性,有一个默认值default
没有指定slot名字的都叫default 会塞到name=default的组件内
<div id="app">
<hello>
123
<ul slot="bottom">
<li>我很帅</li>
</ul>
<ul slot="top">
<li>你丑</li>
</ul>
456
</hello>
</div>
<template id="hello">
<div>
<!--slot是vue提供的内置插件,具名slot 在写内容时第一预留出来slot插口,如果没有使用则使用默认内容,没有指定slot名字的都叫default 会塞到name=default的组件内-->
<slot name="default">nihao </slot>
<slot name="top">这是上</slot>
<slot name="bottom">这是下</slot>
</div>
</template>
<script>
let vm = new Vue({
el:'#app',
components:{
hello:{
template:'#hello'
}
}
})
</script>vue动画组件 transition
transition有一个name属性
假设我们name="fade"
transition动画组件对应三个css样式
进入开始 .fade-enter 的样式
开始过渡阶段 .fade-enter-active
出去终点 .fade-leave-active
这三个样式里面,我们可以任意写样式
如果文章有帮助到您,请点右侧的推荐关注哈,O(∩_∩)O谢谢~ >>>>
vue组件知识总结的更多相关文章
- Vue组件(知识)
form最后一节. 组件基础 组件的复用: data必须是函数 组织 通过Prop向子组件传递data 单个根元素 通过event向父组件发送消息: 使用事件抛出一个value, 在组件上用v-mo ...
- JS组件系列——又一款MVVM组件:Vue(二:构建自己的Vue组件)
前言:转眼距离上篇 JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查) 已有好几个月了,今天打算将它捡起来,发现好久不用,Vue相关技术点都生疏不少.经过这几个月的时间,Vue ...
- Vue组件库的那些事儿,你都知道吗?
前段时间一直在研究Vue组件库,终于在组内派上了用场.来给大家贡献一篇关于Vue组件库的相关知识.经验不多,如果有不合理的地方还请多多指出哦--- 回想一下,在你们公司或者你们小组是否有一个以上的项目 ...
- vue初级知识总结
从我第一篇博客的搭建环境开始,就开始学习vue了,一直想将这些基本知识点整理出来,但是一直不知如何下手,今天刚好实战了两个小demo,所以就想趁这机会将以前的一起整理出来,这是vue最基础的知识,我有 ...
- Vue基础知识简介
基础知识: vue的生命周期: beforeCreate/created.beforeMount/mounted.beforeUpdate/updated.beforeDestory/destorye ...
- 阿里oss上传图片react组件alioss-react,vue组件alioss-vue (不用我先收藏着,后端看下前端处理方法)
1.介绍 最近开发了一个项目,其中需要一个上传图片到阿里云的 oss 上面,就是上传图片到阿里云的 oss 上面. 因为之前开发过 vue 的阿里云 oss 上传,所以直接复制粘 vue 的组件. 因 ...
- angular里使用vue/vue组件怎么在angular里用
欢迎加入前端交流群交流知识&&获取视频资料:749539640 如何在angularjs(1)中使用vue参考: https://medium.com/@graphicbeacon/h ...
- vue路由知识整理
vue路由知识整理 对于单页应用,官方提供了vue-router进行路由跳转的处理.我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将组件(compo ...
- 认识Vue组件
前言 Vue.js是一套构建用户界面的渐进式框架(官方说明).通俗点来说,Vue.js是一个轻量级的,易上手易使用的,便捷,灵活性强的前端MVVM框架.简洁的API,良好健全的中文文档,使开发者能够较 ...
随机推荐
- Akka源码分析-Cluster-ClusterClient
ClusterClient可以与某个集群通信,而本身节点不必是集群的一部分.它只需要知道一个或多个节点的位置作为联系节点.它会跟ClusterReceptionist 建立连接,来跟集群中的特定节点发 ...
- Chrome教程之NetWork面板分析网络请求
官方文档:https://developers.google.com/web/tools/chrome-devtools/network/ 最近打算写一写Chrome教程文档,不知道大家最感兴趣的是什 ...
- sql 索引详解
索引的重要性 数据库性能优化中索引绝对是一个重量级的因素,可以说,索引使用不当,其它优化措施将毫无意义. 聚簇索引(Clustered Index)和非聚簇索引 (Non- Clustered Ind ...
- Springboot拦截器线上代码失效
今天想测试下线上代码,能否正常的执行未登录的拦截.所以把拦截器的代码给开放出来,但是没想到线上代码addInerceptors(InterceptorRegistry registry) 这个方法一直 ...
- 浅谈算法——splay
BST(二叉查找树)是个有意思的东西,种类巨TM多,然后我们今天不讲其他的,我们今天就讲splay 首先,如果你不知道Splay是啥,你也得知道BST是啥 如上图就是一棵优美的BST,它对于每个点保证 ...
- 273 Integer to English Words 整数转换英文表示
将非负整数转换为其对应的英文表示,给定的输入是保证小于 231 - 1 的.示例:123 -> "One Hundred Twenty Three"12345 -> & ...
- C# 访问mongodb数据库
1.引用四个mongodb动态库MongoDB.Bson.dll,MongoDB.Driver.Core.dll,MongoDB.Driver.dll,MongoDB.Driver.Legacy.dl ...
- Spring.Net学习笔记(5)-集合注入
一.开发环境 系统:Win10 编译器:VS2013 .net版本:.net framework4.5 二.涉及程序集 Spring.Core.dll 1.3.1 Common.Loggin.dll ...
- 简单谈谈MySQL中的int(m)
转载地址:https://www.jb51.net/article/93760.htm 设置int型的时候,需要设置int(M),以前知道这个M最大是255,但是到底应该设置多少并没有在意.注意zer ...
- FCC 基础JavaScript 练习4
1.另一种数据类型是布尔(Boolean).布尔 值要么是true要么是false, 它非常像电路开关, true 是“开”,false是“关”.这两种状态是互斥的 2.伪代码 if(条件为真){ 语 ...