前言

在了解父子组件之前应先掌握组件开发基础。在实际开发过程中,组件之间可以嵌套,也因此生成父子组件。

父子组件创建流程

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>:pdatav-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值为name1ageage1
现在修改子组件中的值,就不会报错了,这是因为子组件中修改的是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原生组件化开发(二)——父子组件的更多相关文章

  1. iOS组件化开发· 什么是组件化

    越来越多公司,开始了组件化,你还要等到什么时候...... 说到开发模式,我们最熟知的开发模式 MVC 或者最近比较热门的MVVM.但是我今天说的组件化的开发,其实MVC不是一类的.它其实是····· ...

  2. Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

    ===重点重点开始 ========================== (三) 组件化开发 1.创建组件构造器: Vue.extends() 2.注册组件: Vue.component() 3.使用 ...

  3. 二、vue组件化开发(轻松入门vue)

    轻松入门vue系列 Vue组件化开发 五.组件化开发 1. 组件注册 组件命名规范 组件注册注意事项 全局组件注册 局部组件注册 2. Vue调试工具下载 3. 组件间数据交互 父组件向子组件传值 p ...

  4. Vue的指令以及组件化开发

    一. 自定义指令 如何: 1. 创建指令 Vue.directive("指令名",{ inserted(elem){//指令所在的元素被加载到DOM树上后自动执行指令 //elem ...

  5. Vue全家桶之组件化开发

    Vue全家桶之组件化开发   一.组件 组件 (Component) 是 Vue.js 最强大的功能之一 组件可以扩展 HTML 元素,封装可重用的代码   二. 组件注册 2.1 全局注册 Vue. ...

  6. vue04 组件化开发 Vue自动化工具

    5. 组件化开发 5.1 组件[component] 组件(Component)是自定义封装的功能.在前端开发过程中,经常出现多个网页的功能是重复的,而且很多不同的网站之间,也存在同样的功能. 而在网 ...

  7. 前端笔记之JavaScript面向对象(四)组件化开发&轮播图|俄罗斯方块实战

    一.组件化开发 1.1组件化概述 页面特效的制作,特别需要HTML.CSS有固定的布局,所以说现在越来越流行组件开发的模式,就是用JS写一个类,当你实例化这个类的时候,页面上的效果布局也能自动完成. ...

  8. vue.js原生组件化开发(一)——组件开发基础

    前言 vue作为一个轻量级前端框架,其核心就是组件化开发.我们一般常用的是用脚手架vue-cli来进行开发和管理,一个个组件即为一个个vue页面,这种叫单文件组件.我们在引用组件之时只需将组件页面引入 ...

  9. vue.js组件化开发实践

    前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎么实现,技术选型自然 ...

  10. 06Vue.js快速入门-Vue组件化开发

    组件其实就是一个拥有样式.动画.js逻辑.HTML结构的综合块.前端组件化确实让大的前端团队更高效的开发前端项目.而作为前端比较流行的框架之一,Vue的组件和也做的非常彻底,而且有自己的特色.尤其是她 ...

随机推荐

  1. GenIcam标准(一)

    1.概述 如今的数码摄相机包含了很多的功能,而不仅仅是采集图像.对于机器视觉相机来说,处理图像并把结果附加到图像数据流上,控制附加的硬件,代替应用程序作实时的处理等都是很平常的事情.这也导致了相机的编 ...

  2. SSH的理解

    SSH的利用,通俗的讲就是一个网络传输数据的加密协议,目前有一些基于SSH的构建了服务器-客户端的软件工具,在Windows上装一个客户端,Linux上则为服务端,这样就可以把Windows上写的内容 ...

  3. 洛谷 P2009 跑步

    P2009 跑步 题目背景 跑步是一项有意思的运动,尤其是可以开发人的脑筋.常神牛很喜欢跑步. 题目描述 常神牛跑步的场地是一个多边形(边数≤20,每个顶点用英文大写字母表示),并且在这个多边形内部, ...

  4. BNUOJ34980方(芳)格(哥)取数(好坑)

    方(芳)格(哥)取数 Time Limit: 3000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class n ...

  5. 【SSH 基础】浅谈Hibernate关系映射(3)

    继上篇博客 一对多关联映射(单向) 上面我们介绍了多对一,我们反过来看一对多不就是多对一吗?那还用再进行不同的映射吗?有什么区别吗?一对多和多对一映射原理是一致的,存储是同样的.也就是生成的数据库的表 ...

  6. Linux socket 编程中存在的五个隐患

    前言:         Socket API 是网络应用程序开发中实际应用的标准 API.尽管该 API 简单,但是   开发新手可能会经历一些常见的问题.本文识别一些最常见的隐患并向您显示如何避免它 ...

  7. 集合区别(list和linkedlist的区别)?

    1.list和linkedlist都是有序可重复,为什么还要用linkedlist呢? 数组和数组列表都有一个重大的缺陷,这就是从数组的中间位置删除一个元素需要付出很大的代价,其原因是数组中处于被删除 ...

  8. HDU 2515 Yanghee 的算术【找规律】

    题意:中文的题目 找规律可以发现 sum[1]=a[1]+a[2] sum[2]=a[1]+a[3] sum[n]=a[2]+a[3] 解出a[1],就可以求出其他的了 #include<ios ...

  9. Hyper-V 导入与导出虚拟机

    虚拟机的导入与导出功能可以将虚拟机通过文件的方式进行转移,可以将虚拟机的文件复制到活动硬盘,然后带到其他的地点进行导入,这样方便了虚拟机的跨地域的转移.但是有一点要注意,所有要转移的虚拟机都必须处于停 ...

  10. twig 模板引擎使渲染视图更加优雅

    在使用 laravel 的时候接触过 blade 模板引擎.在学习的时候,接触到了另外一个强大的模板引擎:twig 官网:https://twig.sensiolabs.org/ 中文手册:http: ...