vue.js原生组件化开发(二)——父子组件
前言
在了解父子组件之前应先掌握组件开发基础。在实际开发过程中,组件之间可以嵌套,也因此生成父子组件。
父子组件创建流程
1.构建父子组件
1.1 全局注册
(1)构建注册子组件
//构建子组件child
var child = Vue.extend({
template: '<div>这是子组件</div>'
});
//注册名为'child'的组件
Vue.component('child',child);
(2)构建注册父组件
//构建父组件parent,在其中嵌套child组件
var parent = Vue.extend({
template: '<div>这是父组件<child></child></div>'
});
Vue.component('parent',parent);
(3)定义vue实例
var app = new Vue({
el: '#app'
})
(4)使用父组件
<div id="app"> <parent></parent> </div>
打开浏览器查看

1.2 局部注册
(1)构建子组件
var child = Vue.extend({
template: '<div>这是子组件</div>'
});
(2)构建父组件
在父组件中局部注册子组件
var parent = Vue.extend({
template: '<div>这是父组件<child></child></div>',
components:{
'child':child
}
});
(3)定义vue实例
在vue实例中局部注册父组件
var app = new Vue({
el: '#app',
components:{
'parent':parent
}
})
(4)使用父组件
<div id="app"> <parent></parent> </div>
2.父子组件间通信
2.1 父传子
父组件传消息到子组件使用props,并且这传递是单向的,只能由父组件传到子组件。我们将上面例子中的父组件增加一个数据传递到子组件中渲染显示。如果父组件需要传多个数据给子组件,依次在后面加即可。
(1)在父组件中增加data,并绑定到子组件上
var parent = Vue.extend({
template: '<div>这是父组件<child :pdata=data></child></div>',
data(){
return{
data:'这是父组件传来的数据'
}
},
components:{
'child':child
}
});
其中<child :pdata=data></child>,:pdata是v-bind:pdata的缩写,pdata是自定义传递数据的命名,子组件中也是用该名字获取数据,data是父组件中数据的命名。
(2)在子组件中通过props获取数据,并渲染出来
var child = Vue.extend({
template: '<div>这是子组件 {{pdata}}</div>',
props:['pdata']
});
查看浏览器

父组件中数据发生变化,子组件中自动更新
子组件不可直接修改通过props获取到的父组件中的数据
下面我们通过一个例子更好的理解上面两句话
(1)使用<template>标签创建子组件
为方便书写,我们使用<template>标签创建组件
<template id="child">
<div>
<p>这是子组件</p>
<table>
<tr>
<td>name</td>
<td>{{name}}</td>
<td><input type="text" v-model="name"></td>
</tr>
<tr>
<td>age</td>
<td>{{age}}</td>
<td><input type="text" v-model="age"></td>
</tr>
</table>
</div>
</template>
这里使用v-model指令来双向绑定从父组件中获取到的数据
(2)使用<template>标签创建父组件、
<template id="parent">
<div>
<p>这是父组件</p>
<table>
<tr>
<td>name</td>
<td>{{name}}</td>
<td><input type="text" v-model="name"></td>
</tr>
<tr>
<td>age</td>
<td>{{age}}</td>
<td><input type="text" v-model="age"></td>
</tr>
</table>
//给子组件传递2个数据
<child :name="name" :age="age"></child>
</div>
</template>
(3)构建子组件
var child = Vue.extend({
template: '#child',
props:['name','age']
});
(4)构建父组件
var parent = Vue.extend({
template: '#parent',
data(){
return{
age:16,
name:'乔巴'
}
},
components:{
'child':child
}
});
查看浏览器

接着,我们在父组件中修改输入框的值,这会引起v-model绑定的值变化,同时也会改变子组件中的值

然后我们试着修改子组件中输入框的值,vue会警告不能直接修改父组件传过来的值。

如果我们需要修改从父组件中props传过来的值,最好一开始把这个值赋给另外一个data。
var child = Vue.extend({
template: '#child',
props:['name','age'],
data(){
return{
name1: '',
age1: ''
}
},
//页面挂载时将props的值赋给子组件中的data
mounted:function(){
this.name1 = this.name
this.age1 = this.age
},
//同时增加监听,当props的值发生变化时,也立即赋值给子组件的data
watch:{
name:function(val){
this.name1 = this.name
},
age:function(val){
this.age1 = this.name
}
}
});
同时修改v-model绑定的name值为name1,age为age1
现在修改子组件中的值,就不会报错了,这是因为子组件中修改的是name1,并不是props传递过来的name值

2.1 子传父
子组件给父组件传值通过emit。父组件需在子组件标签上绑定emit事件。
例子:
(1)构建子组件
var child = Vue.extend({
template: '<div><button @click="change">点击给父组件传值</button></div>',
methods:{
change: function(){
this.$emit('posttoparent',10)
}
}
});
子组件按钮绑定了一个click事件,当点击按钮执行change方法,该方法触发emit事件,事件名为posttoparent,并且带了一个参数10。
(2)构建父组件
var parent = Vue.extend({
template: '<div>来自子组件的值为:{{datafromchild}} <child v-on:posttoparent="getfromchild"></child></div>',
data(){
return{
datafromchild:''
}
},
components:{
'child':child
},
methods: {
getfromchild: function(val){
this.datafromchild = val
}
}
});
父组件接收emit事件通过v-on指令,格式为:
v-on:emit方法名="父组件方法"
父组件将接收到的参数赋值给datafromchild
查看浏览器

3.兄弟组件间通信
兄弟组件间通信也是用的emit。但原生vue.js需要新建一个空的vue实例来当桥梁。
下面直接贴代码
//新建一个空的vue实例bus
var bus = new Vue();
var myCom1 = Vue.extend({
template: '<div><button @click="change">点击给兄弟组件传值</button></div>',
methods:{
change: function(){
//通过空实例去触发emit
bus.$emit('posttobro',10)
}
}
});
var myCom2 = Vue.extend({
template: '<div>来自兄弟组件的值为:{{datafrombro}}</div>',
data(){
return{
datafrombro:''
}
},
mounted:function(){
//接收emit事件
bus.$on('posttobro',function(val){
this.datafrombro = val
}.bind(this))
}
});
Vue.component('my-com1',myCom1);
Vue.component('my-com2',myCom2);
var app = new Vue({
el: '#app'
});
使用组件
<div id="app"> <my-com1></my-com1> <my-com2></my-com2> </div>
查看浏览器

vue.js原生组件化开发(二)——父子组件的更多相关文章
- iOS组件化开发· 什么是组件化
越来越多公司,开始了组件化,你还要等到什么时候...... 说到开发模式,我们最熟知的开发模式 MVC 或者最近比较热门的MVVM.但是我今天说的组件化的开发,其实MVC不是一类的.它其实是····· ...
- Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
===重点重点开始 ========================== (三) 组件化开发 1.创建组件构造器: Vue.extends() 2.注册组件: Vue.component() 3.使用 ...
- 二、vue组件化开发(轻松入门vue)
轻松入门vue系列 Vue组件化开发 五.组件化开发 1. 组件注册 组件命名规范 组件注册注意事项 全局组件注册 局部组件注册 2. Vue调试工具下载 3. 组件间数据交互 父组件向子组件传值 p ...
- Vue的指令以及组件化开发
一. 自定义指令 如何: 1. 创建指令 Vue.directive("指令名",{ inserted(elem){//指令所在的元素被加载到DOM树上后自动执行指令 //elem ...
- Vue全家桶之组件化开发
Vue全家桶之组件化开发 一.组件 组件 (Component) 是 Vue.js 最强大的功能之一 组件可以扩展 HTML 元素,封装可重用的代码 二. 组件注册 2.1 全局注册 Vue. ...
- vue04 组件化开发 Vue自动化工具
5. 组件化开发 5.1 组件[component] 组件(Component)是自定义封装的功能.在前端开发过程中,经常出现多个网页的功能是重复的,而且很多不同的网站之间,也存在同样的功能. 而在网 ...
- 前端笔记之JavaScript面向对象(四)组件化开发&轮播图|俄罗斯方块实战
一.组件化开发 1.1组件化概述 页面特效的制作,特别需要HTML.CSS有固定的布局,所以说现在越来越流行组件开发的模式,就是用JS写一个类,当你实例化这个类的时候,页面上的效果布局也能自动完成. ...
- vue.js原生组件化开发(一)——组件开发基础
前言 vue作为一个轻量级前端框架,其核心就是组件化开发.我们一般常用的是用脚手架vue-cli来进行开发和管理,一个个组件即为一个个vue页面,这种叫单文件组件.我们在引用组件之时只需将组件页面引入 ...
- vue.js组件化开发实践
前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎么实现,技术选型自然 ...
- 06Vue.js快速入门-Vue组件化开发
组件其实就是一个拥有样式.动画.js逻辑.HTML结构的综合块.前端组件化确实让大的前端团队更高效的开发前端项目.而作为前端比较流行的框架之一,Vue的组件和也做的非常彻底,而且有自己的特色.尤其是她 ...
随机推荐
- 数组名作为函数参数以及sizeof用法
来源:https://blog.csdn.net/jay_zhouxl/article/details/51745518 int f(int *p,char *a) { printf("p[ ...
- nginx proxy_set_header设置,自定义header
在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断,或者统计ip访问次数等,通常情况下我们使用request.getRemoteAddr()就可以获取到客户端ip,但是当我们使用了ng ...
- MySQL数据类型及后面小括号的意义
1,数值类型 1.1数值类型的种类 标准 SQL 中的数值类型,包括严格数值类型(INTEGER.SMALLINT.DECIMAL.NUMERIC),以及近似数值数据类型(FLOAT.REAL.DOU ...
- 收集整理的openstack java封装 api的第三方实现的选择
Apache jclouds 地址:http://jclouds.apache.org/guides/openstack/ 一个开源库,java实现,支持cloudstack,openstack以及各 ...
- HTML5 canvas炫酷棱镜效果的幻灯片特效
这是一款效果很炫酷华丽的HTML5 canvas带棱镜效果的幻灯片特效. 这个特效在每个幻灯片的前面放置一个图形.并将图形制作为三棱镜效果.它底下的幻灯片图片会被"折射"到棱镜上面 ...
- mysql-管理事务
一.介绍 mysql支持几种基本的数据库引擎,其中MYSQL的两种最基本的引擎MyISAM和InnoDB,其中只有InnoDB支持事务管理. 事务处理:可以用来维护数据库的完整性,他保证成批的MySQ ...
- 学习bootstrap
菜鸟教程 bootstrap开发框架 伍华聪 Bootstrap——一款超好用的前端框架
- kotlin MutableList sort
fun MutableList<Int>.swap(index1: Int, index2: Int) {val tmp = this[index1] // 'this' correspo ...
- mac终端(terminal)里的快捷键
Command + K 清屏 Command + T 新建标签 Command +W 关闭当前标签页 Command + S 保存终端输出 Command + D 垂直分隔当前标签页 Command ...
- 用SAXReader解析xml文档【转】
来源:http://blog.csdn.net/seayqrain/article/details/5024068 使用SAXReader需要导入dom4j-full.jar包. dom4j是一个Ja ...