-
官方推荐:
src/vuex/getters.js:
const getters = { //这里还可以有第二个参数getters,用来获取getters里面的其他getters friend: (state) => { return state.data.friends.filter(x => x._id === state.activeId)[0]; }, ...... }; export default getters;
src/vuex/mutations.js:
const mutations = { getData: (state, data) => { state.data = data; ...... }, }; export default mutations;
src/vuex/actions.js
import axios from 'axios'; const actions = { // 这里结构里面不止有commit,也可以有dispatch等,这个也是最常用的;当然也有state、getters getAllData: async ({commit}) => { let self = {}; let friends = []; await axios.get('../../static/mockdata.json').then(response => { self = response.data.self; friends = response.data.friend; console.log(response.data); }, response => { console.log("error"); }); commit('getData', { self, friends }) }, }; export default actions;
src/vuex/store.js:
import Vue from 'vue'; import Vuex from 'vuex'; import mutations from "./mutations"; import getters from "./getters"; import actions from "./actions"; Vue.use(Vuex); let state = { data: { self: {}, friends: [] }, ...... }; export default new Vuex.Store({ state, mutations, actions, getters })
-
Vuex多模块写法:
src/store/index.js
import Vue from 'vue' import Vuex from 'vuex' import { $fetch } from '../plugins/fetch' import router from '../router' import maps from './maps' import posts from './posts' Vue.use(Vuex) const store = new Vuex.Store({ strict: process.env.NODE_ENV !== 'production', state () { return { user: null, } }, getters: { user: state => state.user, userPicture: (state, getters) => { const user = getters.user if (user) { const photos = user.profile.photos if (photos.length !== 0) { return photos[0].value } } }, }, mutations: { user: (state, user) => { state.user = user }, }, actions: { async init ({ dispatch }) { await dispatch('login') }, async login ({ commit, dispatch }) { try { const user = await $fetch('user') console.log('user', user) commit('user', user) if (user) { // Redirect to the wanted route or home router.replace(router.currentRoute.params.wantedRoute || { name: 'home' }) dispatch('logged-in') } } catch (e) { console.warn(e) } }, logout ({ commit, dispatch }) { commit('user', null) $fetch('logout') // If the route is private // We go to the login screen if (router.currentRoute.matched.some(r => r.meta.private)) { router.replace({ name: 'login', params: { wantedRoute: router.currentRoute.fullPath, }}) } }, }, // 引入其他的store modules: { posts, }, }) export default store
src/store/posts.js
import { $fetch } from '../plugins/fetch' let fetchPostsUid = 0 export default { namespaced: true, state () { return { // New post being created draft: null, // Bounds of the last fetching // To prevent refetching mapBounds: null, // Posts fetched in those map bounds posts: [], // ID of the selected post selectedPostId: null, // Fetched details for the selected post selectedPostDetails: null, } }, getters: { draft: state => state.draft, posts: state => state.posts, // The id field on posts is '_id' (MongoDB style) selectedPost: state => state.posts.find(p => p._id === state.selectedPostId), selectedPostDetails: state => state.selectedPostDetails, // The draft has more priority than the selected post currentPost: (state, getters) => state.draft || getters.selectedPost, }, mutations: { addPost (state, value) { state.posts.push(value) }, addComment (state, { post, comment }) { post.comments.push(comment) }, draft (state, value) { state.draft = value }, likePost (state, { post, userId }) { const index = post.likes.indexOf(userId) if (index !== -1) { post.likes.splice(index, 1) } else { post.likes.push(userId) } }, posts (state, { posts, mapBounds }) { state.posts = posts state.mapBounds = mapBounds }, selectedPostId (state, value) { state.selectedPostId = value }, selectedPostDetails (state, value) { state.selectedPostDetails = value }, updateDraft (state, value) { Object.assign(state.draft, value) }, }, actions: { clearDraft ({ commit }) { commit('draft', null) }, createDraft ({ commit }) { // Default values commit('draft', { title: '', content: '', position: null, placeId: null, }) }, async createPost ({ commit, dispatch }, draft) { const data = { ...draft, // We need to get the object form position: draft.position.toJSON(), } // Request const result = await $fetch('posts/new', { method: 'POST', body: JSON.stringify(data), }) dispatch('clearDraft') // Update the posts list commit('addPost', result) dispatch('selectPost', result._id) }, async fetchPosts ({ commit, state }, { mapBounds, force }) { let oldBounds = state.mapBounds if (force || !oldBounds || !oldBounds.equals(mapBounds)) { const requestId = ++fetchPostsUid // Request const ne = mapBounds.getNorthEast() const sw = mapBounds.getSouthWest() const query = `posts?ne=${ encodeURIComponent(ne.toUrlValue()) }&sw=${ encodeURIComponent(sw.toUrlValue()) }` const posts = await $fetch(query) // We abort if we started another query if (requestId === fetchPostsUid) { commit('posts', { posts, mapBounds, }) } } }, async likePost ({ commit, rootGetters }, post) { const userId = rootGetters.user._id commit('likePost', { post, userId, }) await $fetch(`posts/${post._id}/like`, { method: 'POST', }) }, 'logged-in': { handler ({ dispatch, state }) { if (state.mapBounds) { dispatch('fetchPosts', { mapBounds: state.mapBounds, force: true, }) } if (state.selectedPostId) { dispatch('selectPost', state.selectedPostId) } }, root: true, }, // 这样写的话dispatch('logout')不仅可以触发index.js中的logout,也可以触发这里的logout,也就是状 // 态提升 logout: { handler ({ commit }) { commit('posts', { posts: [], mapBounds: null, }) }, root: true, }, async selectPost ({ commit, getters }, id) { commit('selectedPostDetails', null) commit('selectedPostId', id) const details = await $fetch(`posts/${id}`) commit('selectedPostDetails', details) }, async sendComment({ commit, rootGetters }, { post, comment }) { const user = rootGetters.user commit('addComment', { post, comment: { ...comment, date: new Date(), user_id: user._id, author: user, }, }) await $fetch(`posts/${post._id}/comment`, { method: 'POST', body: JSON.stringify(comment), }) }, setDraftLocation ({ dispatch, getters }, { position, placeId }) { if (!getters.draft) { dispatch('createDraft') } dispatch('updateDraft', { position, placeId, }) }, unselectPost ({ commit }) { commit('selectedPostId', null) }, updateDraft ({ dispatch, commit, getters }, draft) { commit('updateDraft', draft) }, }, }
在 .vue 中使用(推荐):
<script> import { createNamespacedHelpers } from 'vuex' // Vuex mappers // posts module const { mapGetters: postsGetters, mapActions: postsActions, } = createNamespacedHelpers('posts') export default { computed: { ...postsGetters([ 'draft', 'posts', 'currentPost', ]), mapOptions () { return { fullscreenControl: false, } }, }, methods: { ...postsActions([ 'selectPost', 'setDraftLocation', ]), onIdle () { this.setBounds(this.$refs.map.getBounds()) }, onMapClick (event) { this.setDraftLocation({ position: event.latLng, placeId: event.placeId, }) }, }, } </script>
Vuex的多种写法
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...