• 一个简单的实例演示vuex模块化和命名空间


    因为Vuex Store是全局注册的,不利于较大的项目,引入模块分离业务状态和方法,引入命名空间解决不同模块内(getters,mutaions,actions)名称冲突的问题

    ------------------------------------------------------------------

    首先建立一个模块 ./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 注入模块

    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
        }
    })

    启动程序(main.js)中注册 store 到根组件

    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 }
    })

    页面组件(./components/sample.vue)中声明并调用

    <template>
        <div id="container">
        <ul class="sample-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 lang="stylus" 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>

    推荐使用对象展开运算符将 mapMutations,mapGetters,mapActions,mapState 混入到页面组件,页面仅用于交互体验,不要参杂过多的业务逻辑和状态
    通过 createNamespacedHelpers 映射到命名空间

    项目结构:

    ├── 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
  • 相关阅读:
    确认收货逻辑 根据索引删除 和找到这一项数据 直接从本地进行删除数据(不通过调用接口刷新页面 本地刷新页面)
    页面栈getCurrentPages()=》通过获取(页面栈 传递参数 触发上一个页面的函数 修改数据)==> //通过索引改变数据 ==》 点赞逻辑
    保存图片到本地(分享海报功能)
    点赞功能(手动更新当前项 无状态刷新页面) ==》点赞的时候手动拼接
    省市区选择器的做法
    小程序把按钮做成图片(运用到了分享功能)
    小程序接口封装签名
    util.js(涉及到当前项目的一些公共方法)
    time.js(转为年-月-日 时:分:秒)
    request.js(封装请求文件)
  • 原文地址:https://www.cnblogs.com/felixnet/p/9434484.html
Copyright © 2020-2023  润新知