一、基础概念
1、this.$store.dispatch是VueX框架中用来触发actions的方法
2、actions是一个用于提交mutations的方法的对象集合,它可以包含任意异步操作
3、mutations是一个用于改变state状态的方法的对象集合,它只能包含同步操作
4、state是一个用来存储数据状态的集合
5、使用dispatch方法需要在Vue组件中先引入VueX的store文件
import store from './store' export default { mounted() { console.log(this.$store) //undefined console.log(store) // store对象 } }
二、dispatch方法的使用
1、基础用法:通过store.dispatch方法传入actions名称来触发actions中的方法
export default { methods: { async fetchData() { const data = await this.$store.dispatch('fetchDataAction') console.log(data) } } }
2、传参用法:如果actions中定义了参数,可以在store.dispatch()中传入参数
store.dispatch('fetchDataAction', params)
3、Promise用法:store.dispatch()返回一个promise对象,可以通过.then()访问actions中直接返回的数据
store.dispatch('fetchDataAction').then(data => { console.log(data) })
4、async/await用法:可以直接使用async/await语法获取异步操作返回的结果
async function() { const data = await store.dispatch('fetchDataAction') console.log(data) }
三、dispatch方法的参数
1、第一个参数:actions名称,必填项
2、第二个参数:actions操作的参数,可选项
3、第三个参数:具有多个触发mutations的actions执行器数据,必须为对象格式,可选项
4、第四个参数:触发成功时的回调函数,可选项
5、第五个参数:触发失败时的回调函数,可选项
store.dispatch('actionName', { parameter1: value1, parameter2: value2 }, { root: true, test: () => console.log('test') }, () => { console.log('success') }, () => { console.log('fail') })
四、常见应用场景
1、异步请求数据到组件中渲染页面
// action.js export const fetchDataAction = async ({ commit }) => { const data = await api.fetchData() commit('setFetchedData', data) return data } // mutation.js export default { setFetchedData (state, data) { state.data = data } } // component.vue async created () { await this.$store.dispatch('fetchDataAction') console.log(this.$store.state.data) }
2、调用其他mutation来执行多个异步操作
// action.js export const fetchDataAction = async ({ commit }) => { const data = await api.fetchData() commit('setData', data) return data } export const filterDataAction = async ({ commit }, filterValue) => { const filteredData = await api.filterData(filterValue) commit('setFilteredData', filteredData) } export const fetchAndFilterDataAction = async dispatch => { await dispatch('fetchDataAction') await dispatch('filterDataAction', 'filter') } // mutation.js export default { setData (state, data) { state.data = data }, setFilteredData (state, filteredData) { state.filteredData = filteredData } } // component.vue async created () { await this.$store.dispatch('fetchAndFilterDataAction') console.log(this.$store.state.data) console.log(this.$store.state.filteredData) }
3、使用commit方法提交多个mutation
// action.js export const fetchDataAction = async ({ commit }) => { const data = await api.fetchData() commit('setData1', data) commit({ type: 'setData2', data: 'data2' }) } // mutation.js export default { setData1 (state, data) { state.data1 = data }, setData2 (state, data) { state.data2 = data } } // component.vue async created () { await this.$store.dispatch('fetchDataAction') console.log(this.$store.state.data1) console.log(this.$store.state.data2) }
五、总结
通过以上的介绍,我们可以了解到this.$store.dispatch是用来触发actions的方法,具有传参、Promise、async/await用法,支持多个触发mutations的actions执行器数据和成功、失败回调函数。同时我们也能看到this.$store.dispatch广泛用于异步请求数据到组件中渲染页面、调用其他mutation来执行多个异步操作、使用commit方法提交多个mutation等方面,是VueX框架中非常重要的一个方法。