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作为媒介,要相互通 ...
随机推荐
- 【HBase】-NO.140.HBase.1 -【HBase】
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- iframe子页面与父页面元素的访问以及js变量的访问
1.子页面访问父页面元素 parent.document.getElementById('id')和document相关的方法都可以这样用 2.父页面访问子页面元素 document.getEle ...
- SpringMVC常见面试题总结
1.什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于MVC架构的用来简化web应用程序开发的应用开发框架,它是Spring的一个模块,无需中间整合 ...
- SpringBoot整合Apache Shiro权限验证框架
比较常见的权限框架有两种,一种是Spring Security,另一种是Apache Shiro,两种框架各有优劣,个人感觉Shiro更容易使用,更加灵活,也更符合RABC规则,而且是java官方更推 ...
- set nocount on/off的作用,可配合存储过程使用
当set nocount 为NO的时候,不返回计数(受Transact-SQL语句影响行数) 当set nocount 为OFF时,返回计数(默认返回) 当 SET NOCOUNT 为 ON 时,将不 ...
- 深入浅出Java探针技术2---java字节码生成框架ASM、Javassist和byte buddy的使用
目前Java字节码生成框架大致有ASM.Javassist和byte buddy三种 ASM框架介绍及使用 1.ASM介绍 ASM是一种Java字节码操控框架,能够以二进制形式修改已有的类或是生成类, ...
- Django session存储到redis数据库
把session存储到redis数据库,需要在setting中配置 django-redis 中文文档 http://django-redis-chs.readthedocs.io/zh_CN/lat ...
- 字段like多个条件(or关系)简写
字段 like ‘匹配串1’or 字段 like ‘匹配串2’or ... 有如下简写方式 oracle: select * from tablex where REGEXP_LIKE(字段名, ' ...
- vue的三种通信方式
一 确定组件关系二 使用第一步确定的组件关系在下面找到使用方法 1 父子通信(子组件使用父组件数据渲染) a) 在 子组件 中添加props props: [自定义prop名字] b) 在子组件中把自 ...
- CentOS与Win7远程桌面互通
在CentOS上装上Rdesktop即可连接Windows,如下命令,第一次执行时报错,提示CredSSP required by server. [root@localhost ~]# rdeskt ...