,,Vue实现组件间通信的几种方式(多种场景)

,,Vue实现组件间通信的几种方式(多种场景)

本文主要介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: