父子组件创建流程

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>', //:pdata是v-bind:pdata的缩写
data(){
return{
data:'这是父组件传来的数据'
}
},
components:{
'child':child
}
});

其中pdata是自定义传递数据的命名,子组件中也是用该名字获取数据,<code>data</code>是父组件中数据的命名。
(2)在子组件中通过props获取数据,并渲染出来

var child = Vue.extend({
template: '<div>这是子组件 {{pdata}}</div>',
props:['pdata']
});

查看浏览器

 
 

父组件中数据发生变化,子组件中自动更新
子组件不可直接修改通过props获取到的父组件中的数据

下面我们通过一个例子更好的理解上面两句话
(1)使用<code><template></code>标签创建子组件
为方便书写,我们使用<code><template></code>标签创建组件

<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>

这里使用<code>v-model</code>指令来双向绑定从父组件中获取到的数据
(2)使用<code><template></code>标签创建父组件

<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
}
});

查看浏览器

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

 
 

然后我们试着修改子组件中输入框的值,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
}
}
});

同时修改<code>v-model</code>绑定的<code>name</code>值为<code>name1</code>,<code>age</code>为<code>age1</code>
现在修改子组件中的值,就不会报错了,这是因为子组件中修改的是<code>name1</code>,并不是props传递过来的<code>name</code>值

 
 

2.1 子传父

子组件给父组件传值通过<code>emit</code>。父组件需在子组件标签上绑定<code>emit</code>事件。
例子:
(1)构建子组件

var child = Vue.extend({
template: '<div><button @click="change">点击给父组件传值</button></div>',
methods:{
change: function(){
this.$emit('posttoparent',10)
}
}
});

子组件按钮绑定了一个<code>click</code>事件,当点击按钮执行<code>change</code>方法,该方法触发<code>emit</code>事件,事件名为<code>posttoparent</code>,并且带了一个参数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方法名="父组件方法"

父组件将接收到的参数赋值给<code>datafromchild </code>
查看浏览器

 
 

3.兄弟组件间通信

兄弟组件间通信也是用的<code>emit</code>。但原生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组件注册与数据传递的更多相关文章

  1. vue组件间的数据传递

    父组件向子组件传递数据 在 Vue 中,可以使用 props 向子组件传递数据.   App.vue HelloWorld.vue 在子组件部分: 如果需要从父组件获取 logo 的值,就需要使用 p ...

  2. vue 组件之间的数据传递

    父组件传数据给子组件 创建数据 获取json数据 子组件传数据给父组件 1. 子组件使用$emit监听数据 getAreaValues(){ this.$emit('getAreaValues', { ...

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

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

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

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

  5. Vue基础知识之组件及组件之间的数据传递(五)

    vue中的组件是自定的标签,可以扩展的原生html元素,封装可复用的代码 note: 1.在标签命中不要使用大写,标签名字必须用短横线隔开 2.模板中只能有一个根元素,不能使用并列标签. 定义组件 全 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 项目Beta冲刺(团队)——05.24(2/7)

    项目Beta冲刺(团队)--05.24(2/7) 格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺(团队) 团队名称:为了交项目干杯 作业目标:记录Beta敏捷冲刺第2 ...

  2. Helm 安装部署Kubernetes的dashboard

    Kubernetes Dashboard 是 k8s集群的一个 WEB UI管理工具,代码托管在 github 上,地址:https://github.com/kubernetes/dashboard ...

  3. Windows下PHP7/5.6以上版本 如何连接Oracle 12c,并使用PDO

    https://blog.csdn.net/houpanqi/article/details/78841928 首先,本篇文章重点分享的是:在Win平台下,如何使用PHP7连接Oracle 12C,所 ...

  4. darw colorful more

  5. Dockerfile介绍、Docker制作jdk镜像

    Dockerfile介绍.Docker制作jdk镜像 目标 1.Dockerfile简介 2.Docker制作jdk镜像 Dockerfile简介 dockerfile 是一个文本格式的配置文件, 用 ...

  6. ent 基本使用 三 边(关系处理)

    ent 提供了图查询的能力,实际上在关系数据库中的表现就是relation,以下代码接前文 添加边(关系) 添加schema entc init Car Group 效果: 添加字段 car pack ...

  7. Filters in ASP.NET Core

    Filters in ASP.NET Core allow code to be run before or after specific stages in the request processi ...

  8. 【LG3783】[SDOI2017]天才黑客

    [LG3783][SDOI2017]天才黑客 题面 洛谷 题解 首先我们有一个非常显然的\(O(m^2)\)算法,就是将每条边看成点, 然后将每个点的所有入边和出边暴力连边跑最短路,我们想办法优化这里 ...

  9. JavaScript代码笔记重点:

    JavaScript的基本特点:JavaScript是基本对象和事件驱动,具有实时性,动态性,跨平台性和安全性等. JavaScript是对大小写敏感的. <!DOCTYPE html> ...

  10. while循环 运算符和编码

    昨日回顾 1. 初识python python是一门弱类型的解释型高级编程语言 解释器: CPython 官方提供的默认解释器. c语言实现的 PyPy 把python程序一次性进行编译. IPyth ...