Vue-admin工作整理(八): BUS | | 组件通信
一、父子组件之间通信
思路:定义一个个人组件,个人组件通常需要在前缀统一命名一下,如:AInput,该组件的作用是将编辑框中的内容获取并通过事件提交出去,然后在目标组件(store)中通过双向交互模式(v-model)来接收。具体实现为:
1、路由列表增加一个入口:
{
path: '/store',
name: 'store',
component: () => import('@/views/store.vue')
},
2、定义自定义组件:AInput(components->AInput):
<template>
<input @input="handleInput" :value="value"/>
</template>
<script>
export default {
name: 'AInput',
props: {
value: {
type: [String, Number],
default: ''
}
},
methods: {
handleInput (event) {
const value = event.target.value
this.$emit('input', value)
}
}
}
</script>
AInput设计逻辑:通过事件对象event的属性值来获取用户输入的内容,然后通过定义的input事件像外传出去,this.$emit的作用是触发自定义的input函数,该函数值就是用户输入的内容。
3、store组件中用来呈现用户输入的内容
<template>
<div>
<a-input v-model="inputValue"/>
<p>{{ inputValue }}</p>
</div>
</template>
<script>
import AInput from '_c/AInput.vue'
export default {
name: 'store',
data () {
return {
inputValue: ''
}
},
components: {
AInput
}
}
</script>
store实现思路:首先将事件组件(AInput)引进来,然后在通过components将其注册进来,再通过a-input来呈现AInput组件,只是是需要通过用 v-model来绑定用户在上一个组件中输入的值,这个值被命名为inputValue,并要在data里初始化一下,然后通过{{ inputValue }} 展示录入内容。
总结:v-model这个指令是一个双向绑定,它是一个语法堂,AInput的处理(<input @input="handleInput" :value="value"/>)实际就是通过input事件来处理用户的操作,通过:value绑定呈现用户输出的内容,而v-model实际的处理应该是<a-input: value="inputValue" @input="handleInput"/>,就是通过input事件的handleInput方法来获取用户输入的数据,然后通过 :value来获取呈现输入的内容。store的:value就是AInput里的props: {value: 属性值
备注:父子组件向子组件传值,一定是通过属性,而子组件想要修改父组件传来的值,必须通过事件的方式,把需要修改的值以参数的形式,放在自定义函数(this.$emit)里,提交给父组件,然后父组件通过绑定一个事件,来知道子组件要改一个值,改值的操作要在子组件里修改
二、兄弟组件之间通信:
思路:父组件引入AInput的兄弟组件:AShow组件,该组件中定义一个属性:content,用来获取兄弟组件AInput输入的内容,然后父组件 store中在components将AShow注册进来,再通过a-show来呈现,该步骤中是通过 绑定content来获取inputValue的返回值。
1、兄弟组件:AShow:
<template>
<div>
<p>AShow: {{ content }}</p>
</div>
</template>
<script>
export default {
props: {
content: {
type: [String, Number],
default: ''
}
}
}
</script>
2、父组件:store.vue:
<template>
<div>
<a-input v-model="inputValue"/>
<p>{{ inputValue }}</p>
<a-show :content = "inputValue"/>
</div>
</template>
<script>
import AInput from '_c/AInput.vue'
import AShow from '_c/AShow.vue'
export default {
name: 'store',
data () {
return {
inputValue: ''
}
},
components: {
AInput,
AShow
}
}
</script>
备注:两个兄弟组件是通过父组件来进行交互的
三、跨文件的两个组件之间的通信(BUS):
1、bus->index.js:
import Vue from 'vue' // 引入vue
const Bus = new Vue() // 创建Bus实例
export default Bus // 导出Bus
2、在main.js中将Bus引入进来
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import Bus from './bus'. // 引入 Vue.config.productionTip = false
Vue.prototype.$bus = Bus // 将Bus注册到根实例里:使用Vue.prototype属性在原型对象上添加$bus,并将Bus赋值给$bus,这样在
new Vue实例里就注入了Bus
new Vue({ router, store, render: h => h(App) }).$mount('#app')
3、在email.vue组件中创建一个mounted(生命周期钩子),目的是创建一个空的Vue实例来作为交互的中介,如何使用呢:通过email.vue组件中创建一个事件,然后再通过自定义函数的方式触发"on-click"事件,并需要给on-click赋值,例如“hello”,后提交给$bus,然后在另一个组件tel.vue里再接手这个事件,如何接手呢:通过在该组件里增加一个监听事件,来获取message的值
<template>
<div class="email">
Email: 8130512@QQ.com
<p>
<button @click="handleChick">点我</button>
</p>
</div>
</template>
<script>
export default {
methods: {
handleChick () {
this.$bus.$emit('on-click', '做自己擅长的!!!') //this.$bus.$emit触发当前实例上的事件,把on-click事件绑定在$bus上
} },
mounted () {
console.log(this.$bus)
}
} </script>
<style lang="less" scoped>
.email{ border: 1px solid green; }
</style>
4、tel.vue:
<template>
<div class="tel">
Tel: 19999999999
<p>
{{ message }}
</p>
</div>
</template>
<script>
export default {
data () {
return {
message: ''
}
},
mounted () {
this.$bus.$on('on-click', (mes) => { // 给当前事件绑定一个事件监听,读取$bus里的on-click事件
this.message = mes
})
}
}
</script>
<style lang="less" scoped>
.tel{
border: 1px solid red;
}
</style>

Vue-admin工作整理(八): BUS | | 组件通信的更多相关文章
- vue第八单元(组件通信 子父,父子组件通信 自定义事件 事件修饰符 v-model props验证 )
第八单元(组件通信 子父,父子组件通信 自定义事件 事件修饰符 v-model props验证 ) #课程目标 掌握使用props让父组件给子组件传参(重点) 掌握props属性的使用以及prop验证 ...
- vue.js入门(3)——组件通信
5.2 组件通信 尽管子组件可以用this.$parent访问它的父组件及其父链上任意的实例,不过子组件应当避免直接依赖父组件的数据,尽量显式地使用 props 传递数据.另外,在子组件中修改父组件的 ...
- vue学习笔记(五)— 组件通信
关于vue父子组件通信 作者:狐狸家的鱼 本文链接:vue组件通信 GitHub:sueRimn 如果组件是一个单页面,组件之间存在父子关系,数据传递就需要根据父子不同的地位使用不同的办法. 借助新建 ...
- 刚学的vue.js的单一事件管理组件通信
第一次在博客园写的技术分享,写的不好的话各位大神多体谅,好啦进入主题 说说思路 首先 第一步,准备一个空的示例对象 var Event=new Vue(); 第二步,准备发送的数据 Event.$em ...
- vue的props和$emit / 父子组件通信
props 父级: 父级组件中引用子组件,并将自己data下面的giveChild数据绑定在 giveChildData 传给子 <myChild :giveChildData=" ...
- vue 父子组件通信
算是初学vue,整理一下父子组件通信笔记. 父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息. 一.父组件向子组件下发数据: 1.在子组件中显式地用props选项声明它预期的数据 ...
- vue组件通信那些事儿
一.说说通信 通信,简言之,交流信息.交流结束后,把信息放在哪里,这是一个值得思考的问题.vue中保存状态有2种方式,组件内的data属性和组件外的vuex的state属性. 1.用state的场景 ...
- vue组件通信(props,$emit,$attrs,$listeners)
朝颜陌 vue基础----组件通信(props,$emit,$attrs,$listeners) 一.父传子,子传孙 1. props 1>在父组件中通过子组件自定义的标签属性来传递数据. ...
- vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例
vue2中废弃了$dispatch和$broadcast广播和分发事件的方法.父子组件中可以用props和$emit().如何实现非父子组件间的通信,可以通过实例一个vue实例Bus作为媒介,要相互通 ...
随机推荐
- Java 基础 IO流之序列化
一,前言 在前面的IO中,我们都是讲数据以字符串的形式保存.能不能将一个数组保存到文件呢,当取出数据时也是一个数组,如果能够实现那就完美了.我们都知道比较通用的有JSON格式的序列化,那java中也有 ...
- AIX修改密码
grid@DB01:/home/grid>su - oracleoracle's Password: 3004-303 There have been too many unsuccessful ...
- linux中巧用ctrl-z后台运行程序
我们知道后台运行任务时,可以用 () 和 &,但是有的时候我们会忘记加&,对于执行需要很长时间的任务来说,Ctrl+Z可能是一个比较好的把任务转入后台的方法. 当我们按下Ctrl+Z时 ...
- go 语言环境搭建(Ubuntu + Sublime Text3 + GoSublime + gocode)
1. 首先安装go http://code.google.com/p/golang-china/wiki/Install 或者http://golang.org/doc/install这里有详细介绍. ...
- JavaIO流——简单对文件的写入及读取(三)
已经讲了写入和读取了,那么想要把一个文件的内容复制到另一个文件呢 不说太多,直接见代码 public static void copyFile(String srcFilename, String d ...
- jOrgChart二叉树效果
引进文件: <link rel="stylesheet" type="text/css" href="Public/com/jQrgChart/ ...
- web框架实现购物车数量加减
企业开发中经常是团队协作,每个人分配一个小的模块,比如说购物车模块,数量加减这一块人们首先想到的就是通过jquery实现,其实作为一个后端接口开发的程序猿也可以用自己更擅长的后端的逻辑代码来实现,那我 ...
- IT题库5-并发和并行
并发和并行从宏观上来讲都是同时处理多路请求的概念.但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生.
- 打造RecyclerView的n级列表
先上效果图: 1.该多级列表的优势: 支持无限级列表展开 基于一个recyclerView实现 可以自定义每一级item的样式,定制化更强 2.设计的思路 数据结构List,ItemBean类中有变量 ...
- 认识volatile的工作原理
前言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”.可见性的意思是当 ...