Vue组件注册与数据传递
父子组件创建流程
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组件注册与数据传递的更多相关文章
- vue组件间的数据传递
父组件向子组件传递数据 在 Vue 中,可以使用 props 向子组件传递数据. App.vue HelloWorld.vue 在子组件部分: 如果需要从父组件获取 logo 的值,就需要使用 p ...
- vue 组件之间的数据传递
父组件传数据给子组件 创建数据 获取json数据 子组件传数据给父组件 1. 子组件使用$emit监听数据 getAreaValues(){ this.$emit('getAreaValues', { ...
- 解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function
Vue的项目中,如果项目简单, 父子组件之间的数据传递可以使用 props 或者 $emit 等方式 进行传递 但是如果是大中型项目中,很多时候都需要在不相关的平行组件之间传递数据,并且很多数据需要 ...
- Vue 爬坑之路(二)—— 组件之间的数据传递
Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递. 首先用 vue-cli 创建一个项目,其中 App.vue 是父组件,com ...
- Vue基础知识之组件及组件之间的数据传递(五)
vue中的组件是自定的标签,可以扩展的原生html元素,封装可复用的代码 note: 1.在标签命中不要使用大写,标签名字必须用短横线隔开 2.模板中只能有一个根元素,不能使用并列标签. 定义组件 全 ...
- Vue之组件之间的数据传递
Vue的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据,必须使用特定的方法才能实现组件之间的数据传递. 下列为在vue-cli创建项目中的操作 一·父组件向子组件传递数据 在Vue中 ...
- 【整理】解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function
解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function https://www.cnblogs.com/jaso ...
- (转)Vue 爬坑之路(二)—— 组件之间的数据传递
Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递. 首先用 vue-cli 创建一个项目,其中 App.vue 是父组件,com ...
- React中父组件与子组件之间的数据传递和标准化的思考
React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...
随机推荐
- LOJ6070 基因
基因 给定一个长度为 \(n\) 的字符串 \(s\),有 \(q\) 组询问,每个询问给定 \(l,r\),询问 \(s[l..r]\) 中有多少本质不同的回文子串. 强制在线.\(n\leq 10 ...
- spark运行时加载配置文件(hive,hdfs)
文章为转载,如有版权问题,请联系,谢谢! 转自:https://blog.csdn.net/piduzi/article/details/81636253 适合场景:在运行时才确定用哪个数据源 imp ...
- keepalived是什么及作用?
参考:https://www.cnblogs.com/hqjy/p/7615439.html keepalived介绍 keepalived观察其名可知,保持存活,在网络里面就是保持在线了, 也就是所 ...
- LeetCode 865. Smallest Subtree with all the Deepest Nodes
原题链接在这里:https://leetcode.com/problems/smallest-subtree-with-all-the-deepest-nodes/ 题目: Given a binar ...
- SpringBoot:使用Jenkins自动部署SpringBoot项目(一)环境准备
1.安装JDK 1.在java官网下载linux下的安装包,上传到云服务器 /user/java 目录下 2.解压:tar xzvf jdk-8u161-linux-x64.tar.gz 3.为了好看 ...
- sourceforge文件下载过慢
sourceforge文件下载过慢,可以用下面网址镜像下载, http://sourceforge.mirrorservice.org 按搜索到的项目的英文字母依次查询,如http://sourcef ...
- android常见错误之 No resource found that matches the given name
新手上路,还希望大神多多照顾,刚自学android,遇到很多困难.其中就有这个问题,不知道你们遇到过没有,反正我是很头痛. No resource found that matches the giv ...
- [Gamma阶段]第八次Scrum Meeting
Scrum Meeting博客目录 [Gamma阶段]第八次Scrum Meeting 基本信息 名称 时间 地点 时长 第八次Scrum Meeting 19/06/04 大运村寝室6楼 40min ...
- php提示Notice: Undefined index解决方法
php提示Notice: Undefined index问题,Undefined index:是指你的代码里存在:“变量还未定义.赋值就使用”的错误,这个不是致命错误,不会让你的php代码运行强行中止 ...
- IntelliJ IDEA-设置字体大小
setting 设置字体font大小,点击apply-ok