Vue通信、传值的多种方式
一、通过路由带参数进行传值
1、两个组件 A和B,A组件通过query把orderId传递给B组件(触发事件可以是点击事件、钩子函数等)
this.$router.push({ path: '/conponentsB', query: { orderId: 123 } }) // 跳转到B
2、在B组件中获取A组件传递过来的参数
this.$route.query.orderId
二、通过设置 Session Storage缓存的形式进行传递
1、两个组件A和B,在A组件中设置缓存orderData
const orderData = { 'orderId': 123, 'price': 88 }
sessionStorage.setItem('缓存名称', JSON.stringify(orderData))
2、B组件就可以获取在A中设置的缓存了
const dataB = JSON.parse(sessionStorage.getItem('缓存名称'))
此时 dataB 就是数据 orderData
三、父子组件之间的传值
(一)父组件往子组件传值props
1、定义父组件,父组件传递 number这个数值给子组件,如果传递的参数很多,推荐使用json数组{}的形式。
2、定义子组件,子组件通过 props方法获取父组件传递过来的值。props中可以定义能接收的数据类型,如果不符合会报错。
3、假如接收的参数 是动态的,比如 input输入的内容 v-model的形式。
4、父子组件传值,数据是异步请求,有可能数据渲染时报错
(二)子组件往父组件传值,通过emit事件
四、不同组件之间传值,通过eventBus
小项目少页面用eventBus,大项目多页面使用 vuex
1、定义一个新的vue实例专门用于传递数据,并导出
2、定义传递的方法名和传输内容,点击事件或钩子函数触发eventBus.emit事件
3、接收传递过来的数据
五、vuex进行传值
1、 vuex主要是是做数据交互,父子组件传值可以很容易办到,但是兄弟组件间传值(兄弟组件下又有父子组件),或者大型spa单页面框架项目,页面多并且一层嵌套一层的传值,异常麻烦,用vuex来维护共有的状态或数据会显得得心应手
src新建一个vuex文件夹
vuex文件夹里新建一个store.js
安装vuex cnpm install vuex --save
在刚才创建的store.js 中引入vue、vuex 引入vue
2、VueX的核心概念
state
vuex中的数据源,我们需要保存的数据就保存在这
获取state中数据的方法:
(一)this.$store.state
(二)在组件中引入mapState
Mutation
可以更改state中的数据,好处:有益于监控所有数据的变化;坏处:不能执行异步操作
组件访问方式1: this.$store.commit('add',传递的参数首先需要定义一个参数)
组件访问方式2:import {mapMutation} from ...
在methods里面使用 ...mapMutation(['add','abc','在mutations里面定义的函数名'])
在methods直接调用this.add
Action
专门处理异步任务(不能直接修改state中的数据,只能通过context.commit('add')去出发mutation里面的方法)
组件访问方式1:$this.store.dispatch('addasync','传递的参数')
组件访问方式2:import {mapAction} from ...
在methods里面使用 ...mapAction(['addasync','在action里面定义的函数名'])
在methods直接调用this.addasync
Getter
用于对store中的数据进行加工处理形成新的数据
使用方法同上,只不过名字需要改一下
modules
modules,就是模块化的意思,因为是单一状态树,怕我们在state里面写的东西太多了,不好进行查找,那我们可以在我们的modules里面重新定义我们的一个模块,就是相当于一个store,里面也有我们所需要的五个属性,所进行的操作也是一样的