本文主要介绍了Vue中组件间通信的几种方式。不同的场景使用不同的方式,基本满足了所有开发场景下的通信需求。有兴趣的可以看看。
目录
1、Props Parent(道具)Parent ($emit)2、Bus Event Bus 3、Vuex状态管理库4、Router5、Cache以下是我在开发中用过的vue组件之间的通信方式。不同的场景使用不同的方法,基本满足了所有开发场景下的沟通需求。从最简单的例子开始,我就告诉你怎么用,不多说。
1、Props
父 子 (Props)
当另一个组件被引入到一个组件中时,就形成了父子关系。当前组件是“父组件”,引入的组件是“子组件”。例如,当前组件(父组件)通过父组件中的“:message”与子组件通信。
模板
div class='parent-box '
差异
我是父页面/div。
div{{message}}/div
/div
children:message=' toChildrenMsg '/children
/div
/模板
脚本
从'导入孩子。/children . vue '//当前页面介绍子组件。
导出默认值{
姓名:'家长',
组件:{
儿童
},
data(){
返回{
消息:“我是父页面的内容”,
ToChildrenMsg:“从父页面传递到子页面的内容”
}
}
}
/脚本
子组件通过props接收。请注意,子组件props中接收的对象名称必须与父组件中子组件中绑定的名称一致。当前的例子是“message”,props中的值可以这样用在组件返回中。
模板
div class='儿童盒'
差异
我是子页/div。
div{{message}}/div
/div
/div
/模板
脚本
导出默认值{
姓名:'孩子',
道具:{
消息:{
类型:字符串,//类型判断
默认值:' '//默认值
}
}
}
/脚本
子组件从父组件接收内容,实现效果如下图所示:
子 父($emit)
子组件通过这个与父组件通信。$emit()方法,如下所示。单击触发事件并执行以下操作。$emit('fromChildMethod ')触发父组件的fromChildMethod。
模板
div class='儿童盒'
差异
我是子页/div。
div{{message}}/div
Span @ click=' topArentMethod '单击以触发父页面事件/span/div
/div
/div
/模板
脚本
导出默认值{
姓名:'孩子',
道具:{
消息:{
类型:字符串,
默认值:“”
}
},
方法:{
toParentMethod(){
这个。$emit('fromChildMethod ')
}
}
}
/脚本
将fromChildMethod方法绑定到父组件的子组件上,监控该方法,当该方法被触发时,执行父组件中fromChild的相应方法。
模板
div class='parent-box '
差异
我是父页面/div。
div style=' font-size:12px;'{{message}}/div
div style=' font-size:12px;颜色:红色“{fromChildMsg}}/div
/div
children:message=' toChildrenMsg ' @ from child method=' from child '/children
/div
/模板
脚本
从'导入孩子。/Children.vue '
导出默认值{
姓名:'家长',
组件:{
儿童
},
data(){
返回{
消息:“我是父页面的内容”,
ToChildrenMsg:“从父页面传递到子页面的内容”,
fromChildMsg:“”
}
},
方法:{
fromChild(){
This.fromChildMsg='子页面触发的方法'//监听子组件触发的方法并显示内容。
}
}
}
/脚本
当单击子组件的相应范围时,会触发方法来通知父组件。
小结:父传子,props;子传父,this.$emit();触发、监听名称须一致。
2、Bus事件总线
在真实场景中,组件不仅是“父子”关系,还有“兄弟”关系和跨级组件。此时,道具和$emit可能不适用。这时候就出现了,就是Bus(事件总线),亲子组件也适用。
总线触发$emit,监控$on,关闭$off,主要使用$emit和$on。
首先,在项目中创建一个新的包含index.js文件的文件夹总线,创建一个新的Vue实例,然后导出模块。
接下来,导入这个新的Vue实例,也就是bus。常见的导入方式有两种,一种是全局导入,一种是本地导入(每个组件需要导入一次)。下面是一个全局导入,这个总线作为main.js中当前Vue实例的原型方法,可以被每个组件中的this.bus直接调用。
从“vue”导入Vue
从'导入应用程序。/App '
从'导入总线。/总线/索引'
Vue.prototype.bus=bus
新Vue({
埃尔:' #app ',
组件:{ App },
模板:“应用程序/”
})
下面是实现总线通信的过程。场景是父子。同样,同级和跨级用法也与之类似:
与父组件中子组件的通信由this.bus.$emit()触发
模板
div class='parent-box '
差异
我是父页面/div。
Div @ click=' tochildbus与子组件通信/span/div
/div
儿童/儿童
/div
/模板
脚本
从'导入孩子。/Children.vue '
导出默认值{
姓名:'家长',
组件:{
儿童
},
方法:{
toChildBus(){
Let='父组件与子组件通信'
This.bus. $ emit ('to child ',val)//val是传递的值,不是必需的。
}
}
}
/脚本
子组件监听父组件触发的事件(在已安装阶段进行绑定监听)。注意事件名称的一致性。通过this.bus.$on()收听。当方法在总线中被触发时,获取传递的值(也可以在其中执行自定义方法)。
模板
div class='儿童盒'
差异
我是子页/div。
div style=' font-size:12px;颜色:蓝色;'{{fromParentMsg}}/div
/div
/div
/模板
脚本
导出默认值{
姓名:'孩子',
data(){
返回{
fromParentMsg:“”
}
},
已安装(){
this.bus.$off('toChild ')
this.bus.$on('toChild ',val={
This.fromParentMsg=val //这里是复制操作,对应的方法也可以在里面执行。
})
}
}
/脚本
效果图:
总结:父子、兄弟、跨层级(爷爷奶奶、孙子孙女等。)通信也是这么写的,就不一一举例了。都是由this.bus.$emit()触发,由this.bus.$on()监控,执行相应的操作。记住:触发器和监视器名称必须相同!
3、Vuex状态管理库
Vuex相当于一个仓库。你可以把东西放进仓库,保持放进去的时候的状态,修改,或者需要的时候拿出来。这是一个全球性的国家。这次我只讲如何使用vuex进行通信,不深入其原理。
安装vuex
npm安装vuex -保存
在这里,我创建一个名为store的新文件夹,其中有一个index.js文件,创建一个vuex.store的实例,然后导出这个实例。从图中,我们可以清楚地看到商店的大致结构和元素。我们就不细说了。关于Vuex的相关文章数不胜数,大家可以自己去了解一下。这里主要说一下一般用法。
在mian.js中全局介绍,然后就可以直接使用了。
从“vue”导入Vue
从'导入应用程序。/App '
从'导入路由器。/路由器'
从'导入总线。/总线/索引'
从'导入存储。/存储/索引'
Vue.config.productionTip=false
Vue.prototype.bus=bus
新Vue({
埃尔:' #app ',
路由器,
店,
组件:{ App },
模板:“应用程序/”
})
一种方式,这种。$store.state.xxx,直接操作状态,在一个组件的挂载阶段将值存储在store中。当然,你也可以按照你想要的方法操作。
模板
div class='parent-box '
差异
我是父页面/div。
/div
儿童/儿童
/div
/模板
脚本
从'导入孩子。/Children.vue '
导出默认值{
姓名:'家长',
组件:{
儿童
},
data(){
返回{
fromChildMsg:“”
}
}
已安装(){
这个。$store.state.msg='父组件已保存'//以第一种方式保存在此处。
}
}
/脚本
其他组件从商店中取出,但也可以进行修改。
模板
div class='儿童盒'
差异
我是子页/div。
从商店获取/span/div
div{{fromStoreMsg}}/div
/div
/div
/模板
脚本
导出默认值{
姓名:'孩子',
data(){
返回{
fromStoreMsg:“”
}
},
方法:{
fromStore(){
this.fromStoreMsg=this。$store.state .味精
}
}
}
/脚本
效果图:
第二,通过这个拿出来。$store.getters.xxx和mapGetters。
//store/索引. js
getters:{
getMsg:state={
返回state.msg
}
},
//从组件中获取
这个。$store.getters.getMsg
//你也可以使用mapGetters的方式
从“vuex”导入{ mapGetters }
计算值:{
.mapGetters(['getMsg'])
},
存储在存储中的数据可以通过突变和动作(异步)来存储,所以细节就不展开了。有兴趣的话可以自己深入一下。
4、Router
您可以通过动态路由和路由跳转来传递值,就像这样。$ router.push ({path:' XXX ',查询:{value:' XXX'}})。你可以在跳转的时候传递值,通过这个得到传递的参数。$route.params.value和this。$route.query.value此方法有局限性。它只能通过相互跳转的组件之间的通信来获取值,并且只能在跳转后的页面被刷新而无法获取值时视情况而定。
5、缓存
sessionStorage、localStorage、cookie
除了总线和存储,多个组件之间还有一种通用的通信方式——缓存。当同一个窗口没有关闭时,这个窗口中的其他组件可以使用sessionstorage.setitem (key,value)、localStorage.setItem(key,Value)等获取已经存储在缓存中的值。其他组件可以通过sessionStorage.getItem(key)、localStorage.getItem(key)等获取。多个页面共享缓存数据,刷新页面数据不会被破坏。可以通过sessionStorage.removeItem(key),localStorage.removeItem(key)来移除缓存,还有很多可用的场景。
总结:大致介绍vue组件中几种常用的通信、传值方式,考虑不同的场景使用不同的方式,提高开发效率,减少bug的产生。
关于Vue组件之间通信的几种方式(多种场景),本文到此结束。有关Vue组件之间通信的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。