vue非父子组件间传参问题
最近在使用vue进行开发,遇到了组件之间传参的问题,此处主要是针对非父子组件之间的传参问题进行总结,方法如下:
一、如果两个组件用友共同的父组件,即
FatherComponent.vue代码
<template>
<child-component1/>
<child-component2/>
</template>
此时需要组件1给组件2传递某些参数,实现如下:
1、父组件给组件1绑定一个方法,让组件1进行回调,组件2接收某个属性,通过改变父组件的数据从而实现组件2的属性值的更新,即
父组件
<child-component1 :callback="child1Callback" />
<child-component2 :props="child2Props" />
data () {
return {
child2Props: '';
}
}
child1Callback ([args...]) {
// 此处更新了父组件的data,使组件2的属性prop改变
this.child2Props = [args...]
}
组件1
props: ['callback']
change () {
this.callback([args...])
}
2、通过bus进行实现,首先bus.js如下
const bus = new Vue()
export default bus
组件1
import bus from './bus'
methods: {
change () {
bus.$emit('callComponent2', [args...])
}
}
组件2
import bus from './bus'
mounted () {
bus.$on('callComponent2', function ([args...]) {
// 做你想做的
})
}
3、利用vuex实现,创建store.js相当于某些全局变量,但是可以被vue检测到变化
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
pageNo: 0
},
mutations: {
'change' (state, [args...]) {
state.pageNo++
}
}
})
export default store
项目入口js
import store from './store.js'
new Vue({
...
store: store
...
})
此时在任意vue文件都可以改变pageNo的值,并且会影响到所有使用了pageNo的组件,都会进行更新
childComponent1.vue
this.$store.commit('change')
childComponent2.vue
{{this.$store.state.pageNo}}
总结:
1、第一种比较绕,需要有共同的父组件,如果组件间层级太多,会导致代码混乱,比较难维护。
2、第二种比较直观,推荐使用,但是要理解,请仔细阅读官方文档
3、利用vuex在很多项目中都会显得杀鸡用牛刀,虽然更好理解,但是也带来了学习成本,并且可能会有一些副作用,但是如果项目比较复杂,利用vuex更加直观
综合各种方法的优缺点,推荐使用第二种,项目过于复杂请使用第三种
如果有更好的方法,请留言指教,谢谢
原文地址:https://segmentfault.com/a/1190000012555128
vue非父子组件间传参问题的更多相关文章
- Vue—非父子组件间的传值(Bus/发布订阅模式/观察者模式/总线)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue2.0父子组件以及非父子组件通信传参详解
1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: <parent> <child :child-msg="msg" ...
- vue非父子组件间通信
有时候非父子关系的组件也需要通信.在简单的场景下,使用一个空的Vue实例作为中央事件总线: 有时候非父子关系的组件也需要通信.在简单的场景下,使用一个空的 Vue 实例作为中央事件总线: var bu ...
- Vue 非父子组件通信
组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求.组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信.前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有 ...
- Vue 非父子组件通信方案
Vue 非父子组件通信方案 概述 在 Vue 中模块间的通信很普遍 如果是单纯的父子组件间传递信息,父组件可以使用 props 将数据向下传递到子组件,而在子组件中可以使用 events (父组件需要 ...
- js 实现vue—引入子组件props传参
参考:https://www.cnblogs.com/xiaohuochai/p/7388866.html 效果 html <!DOCTYPE html> <html> < ...
- vue bus方式解决非父子组件间的传值
对于非父子组件之间的传值 通常使用VUEX 和总线等方式解决 这里我聊聊发布订阅模式(总线) <body> <div class="app"> <ch ...
- Vue的父子组件间通信及借助$emit和$on解除父子级通信的耦合度高的问题
1.父子级间通信,父类找子类非常容易,直接在子组件上加一个ref,父组件直接通过this.$refs操作子组件的数据和方法 父 这边子组件中 就完成了父 => 子组件通信 2. 子 =&g ...
- vue 非父子组件传值
/*非父子组件传值 1.新建一个js文件 然后引入vue 实例化vue 最后暴露这个实例 2.在要广播的地方引入刚才定义的实例 3.通过 VueEmit.$emit('名称','数据') 4.在接收收 ...
随机推荐
- HTML中使用 js 添加 data-toggle
情况:<li class="active"><a href="#server1" data-toggle="tab"> ...
- PHP SOAP 使用示例
soap_client.php <?php try { $client = new SoapClient( null, array('location' =>"http://lo ...
- 51nod 1302(贪心+平衡树)
能推出一些性质. 矩形肯定是全部躺着或全部立着比较优. 如图x1显然等于x2,y1显然小于y2. 所以我们就让它们都躺下吧. 然后一定有一组的宽为宽最小的矩形的宽. 然后我们枚举另一组的宽最小的矩形. ...
- BZOJ 2049 [SDOI2008]洞穴勘测 (LCT)
题目大意:维护一个森林,支持边的断,连,以及查询连通性 LCT裸题 洛谷P2147传送门 1A了,给自己鼓鼓掌 #include <cstdio> #include <algorit ...
- [caffe]网络各层参数设置
数据层 数据层是模型最底层,提供提供数据输入和数据从Blobs转换成别的格式进行保存输出,通常数据预处理(减去均值,放大缩小,裁剪和镜像等)也在这一层设置参数实现. 参数设置: name: 名称 ty ...
- SpringMVC请求@RequestParam中文乱码解决
private String encodeStr(String str) { try { return new String(str.getBytes("ISO-8859-1"), ...
- where和having
where可以不能使用别名作为过滤条件,而having可以使用别名作为过滤条件. 在ORACLE中,select 语句的执行顺序是: 1. from语句 2. where语句(结合条件) 3. sta ...
- 【 【henuacm2016级暑期训练】动态规划专题 P】Animals
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 第i只动物如果饲养它的话. 代价是固定的就是(n-i+1)a[i] 所以相当于给你n个物品,每个物品的重量为(n-i+1)a[i], ...
- arXiv 2015深度学习年度十大论文
由康奈尔大学运营维护着的arXiv网站,是一个在学术论文还未被出版时就将之向所有人开放的地方.这里汇聚了无数科学领域中最前沿的研究,机器学习也包括在内.它反映了学术界当前的整体趋势,我们看到,近来发布 ...
- spring mvc拦截器interceptor
1. SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像123 ...