Cet article vous présente l'exemple de code sur la modularisation et l'espace de noms vuex. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Étant donné que Vuex Store est enregistré à l'échelle mondiale, ce qui n'est pas propice aux projets plus importants, des modules sont introduits pour séparer les états et méthodes métier, et des espaces de noms sont introduits pour résoudre le problème des conflits de noms (getters, mutations, actions) dans différents modules
Créez d'abord un module./store/modules/sample.js
import SampleAPI from '@/api/sample-api-proxy.js' import { _AjaxUrl } from '@/store/constants' const state = { all: [] } const mutations = { resolve (state, payload) { for (let item of payload) { state.all.push(item) } } } const getters = { allstr (state) { return state.join(',') } } const actions = { async init ({commit,state}, pid) { await SampleAPI.get(_AjaxUrl + '/api/game/all', params: {pid}).then((res) => { state.all = res.all commit('resolve', res.data) }) } } export default { namespaced: true, state, mutations, getters, actions }
./store/index.js Injecter le module
import Vuex from 'vuex' import sample_module from './modules/sample' import other_module from './modules/other' export default new Vuex.Store({ //全局Store对象 mutations, actions, state, //模块 modules: { sample: sample_module, other: other_module } })
Enregistrer le magasin sur le composant racine dans le programme de démarrage (main.js)
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) new Vue({ el: '#app', data() { return { rootParam: 'test' } }, store, router, template: '<Home/>', components: { Home } })
Déclarez et appelez
<template> <div id="container"> <ul> <li v-for="(item, index) in all" :key="index"> <span>{{item}}</span> <button @click="removeItem(index)">删除</button> </li> </ul> <div>{{all2str}}</div> </div> </template> <style rel="stylesheet/stylus" scoped> @import '~style/common.styl' nospace() margin 0 padding 0 height(h) height unit(h, 'px') line-height unit(h, 'px') .sample-ul list-style-type none @nospace li display block height(20) &:hover background-color #fcc </style> <script type="text/ecmascript-6"> import { createNamespacedHelpers, mapState } from 'vuex' const { mapActions, mapGetters, mapMutations } = createNamespacedHelpers('sample') const { mapActions: mapOtherActions, mapGetters: mapOtherGetters } = createNamespacedHelpers('other') export default{ data() { return { } }, computed: { ...mapState({ all : state => state.sample.all }), ...mapGetters(['all2str']), ...mapOtherGetters(['test']) }, methods: { ...mapActions(['loadDataAsync']), ...mapMutations(['removeItem']), ...mapOtherMutations(['testing']) }, created() { const pid = this.$route.query.pid this.loadDataAsync(keep, pid) } } </script>
dans le composant de page (./components/sample.vue). pour utiliser l'opérateur d'expansion d'objet pour mapMutations, mapGetters, mapActions, mapState est mélangé dans le composant de page. La page n'est utilisée que pour une expérience interactive. Ne mélangez pas trop de logique métier et d'état. 🎜>
Structure du projet :
├── index.html ├── main.js ├── api │ ├── sample-api-proxy.js │ └── ... ├── components │ ├── sample.vue │ └── ... └── store ├── index.js ├── actions.js ├── mutations.js ├── state.js └── modules ├── sample.js └── other.js
Recommandations associées :
Qu'est-ce que le composant vue ? Introduction aux composants Vue Communication entre les composants enfants Vue et les composants parents (avec code)Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!