vue组件间通信、数据传递(父子组件,同级组件)
2018-04-01 19:56
1061 查看
vue组件之间通信
组件目录结构
父组件 app.vue
<template> <div id="app"> <h1>{{title}}</h1> <p>用户名: <span>{{username}}</span></p> <p>密码: <span></span>{{password}}</p> <page1 :text="text" @outPutName="getUserName"></page1> <page2 :text1="text1" @outPutPassWord="getPassword"></page2> </div> </template> <script> import Page1 from './components/page1' import Page2 from './components/page2' export default { name: 'app', components:{ 'page1':Page1, 'page2':Page2 }, data(){ return{ title:'vue组件传值', text:'参数1', text1:'参数2', username:'', password:'' } }, methods:{ getUserName:function (msg) { this.username = msg; }, getPassword:function (msg) { this.password = msg; } } } </script>
子组件 page1.vue
<template> <div class="hello"> <h1>{{ msg }}</h1> <h2>{{text}}</h2> <input type="text" @change="setUserName" v-model="username" placeholder="请输入用户名"> </div> </template> <script> export default { name: 'hello', props:['text'], data () { return { msg: '世界', username:'' } }, methods:{ setUserName:function () { this.$emit('outPutName',this.username); } } } </script>
子组件 page2
<template> <div class="hello"> <h1>{{ msg }}</h1> <h3>{{text1}}</h3> <input type="text" v-model="password" @change="outPutPassword" placeholder="请输入密码"> </div> </template> <script> export default { name: 'hello', props:['text1'], data () { return { msg: '你好', password:'' } }, methods:{ outPutPassword:function () { /*$emit 提交自定义事件*/ this.$emit('outPutPassWord',this.password); } } } </script>
通信过程介绍
父组件向子组件传值
父组件中
import Page1 from './components/page1' export default { name: 'app', components:{ 'page1':Page1 } ``` import引入子组件,并在**components** 中注册组件 <page1 :text="text"></page1> 在父组件中使用子组件 通过`v-bind`绑定一个**text**属性(这个属性名任意取),并且给这个属性赋需要向子组件中传递的值
子组件page1 中
<div class="hello"> <h2>{{text}}</h2> </div> export default { name: 'hello', props:['text'], data () { }
通过props属性接受父组件v-bind绑定的text,在
{{text}}
便可以使用从父组件中接受到的值了。子组件向父组件中传值
子组件page1中
<input type="text" @change="setUserName" v-model="username" placeholder="请输入用户名"> export default { name: 'hello', props:['text'], data () { return { msg: '世界', username:'' } }, methods:{ setUserName:function () { this.$emit('outPutName',this.username); } } }
在data中,定义一个username属性
通过
v-on绑定一个
setUserName方法,
v-model将定义的username和dom做双向数据绑定,在
methods中,通过
this.$emit绑定一个
outPutName的事件,并将username的值传递出去。
在父组件 app.vue中
<page1 :text="text" @outPutName="getUserName"></page1> methods:{ getUserName:function (msg) { this.username = msg; } }
在input上绑定一个事件,事件名
outPutName为子组件page1.vue中通过
this.$emit注册的事件,并给这个事件绑定一个方法
getUserName用了接收子组件传递过来的数据。
在
data中定义一个
username属性来保存子组件传递的值,并通过
v-model将这个值绑定到父组件的dom元素上
同级组件传值
同级组件不能直接传值,需要一个中间桥梁,可以先将数据传递给公共的父组件,然后父组件再将数据传递给需要的子组件。定义一个公共文件
eventBus.js,代码很简单(就2句),只是创建一个空的vue实例
import Vue from 'vue' export default new Vue()
在需要通信的同级组件中分别引入
eventBus.js文件
在page1.vue 中,
<input type="text" @change="setUserName" v-model="username" placeholder="请输入用户名"> bus.$emit('addCart', this.data) 在setUserName 方法中,通过vm.$emit 触发<code>addCart</code> 方法,并将需要传递的数据<code>this.data</code> 传入。 ``` ``` 在page2.vue 中, mounted(msg) { bus.$on('addCart', (msg) => { this.dom = msg console.log(this.dom) }) }
在方法中,通过vm.$on 监听
addCart方法,并获取传递过来的参数,从而实现了同级组件间的通信
一般复杂的应该推荐使用Vuex来管理组件之间的通信
以上是自己在学习vue中遇到组件通信,并做出的一些总结,写的很粗糙,后面继续学习改进……
相关文章推荐
- vue中父子组件通信,异步数据传递
- vue父子组件的数据传递
- Vue 父子组件的数据传递、修改和更新方法
- Vue.js 父子组件相互传递数据
- 关于vue.js父子组件数据传递
- Vue笔记2 父子组件的数据通信
- Vue 组件通信(子组件向父组件传递数据)
- Angular2父子组件之间数据传递:父子组件共享服务通信
- Vue 父子组件之前的数据通信
- vue2.0父子组件间传递数据的方法
- Vue4种父子组件数据双向传递
- vue父子组件数据传递方式
- vue.js---父子组件之间简单的数据传递
- Angular2父子组件之间数据传递:父子组件共享服务通信
- vue学习记录——父子组件间传递数据
- vue父子组件的数据传递示例
- react都这么无情了,vue还是那么有义,4种父子组件数据双向传递大法
- Vue4种父子组件数据双向传递
- vue2.0中的组件通信2——子组件向父组件传递数据
- Vue 父子组件的数据传递、修改和更新