重要文件源码

App.vue

<template>
    <div>
        <Count/>
        <hr>
        !--    <Person/> -->
    </div>
</template>

<script>
    import Count from './components/Count'
    //import Person from './components/Person'

    export default {
        name:'App',
        components:{Count},
        mounted() {
            // console.log('App',this)
        },
    }
</script>

store/index.js

//该文件用于创建Vuex中最为核心的store
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'


//应用Vuex插件
Vue.use(Vuex)

//思想:
//    将上节本文件的内容进行归类。

//求和相关的配置
const countOptions = {
    namespaced:true, //该配置,默认为false。 true-表示可以在 创建并暴露store 的时候, 让其中的key 作为 分类名 被 ...mapState(第0个参数-分类名,...) 认识。
    actions:{
        jiaOdd(context,value){
            console.log('actions中的jiaOdd被调用了')
            if(context.state.sum % 2){
                context.commit('JIA',value)
            }
        },
        jiaWait(context,value){
            console.log('actions中的jiaWait被调用了')
            setTimeout(()=>{
                context.commit('JIA',value)
            },500)
        }
    },
    mutations:{
        JIA(state,value){
            console.log('mutations中的JIA被调用了')
            state.sum += value
        },
        JIAN(state,value){
            console.log('mutations中的JIAN被调用了')
            state.sum -= value
        },
    },
    state:{
        sum:0, //当前的和
        school:'尚硅谷',
        subject:'前端',
    },
    getters:{
        bigSum(state){
            return state.sum*10
        }
    },
}

//人员管理相关的配置
const personOptions = {
    namespaced:true,
    actions:{

    },
    mutations:{
        ADD_PERSON(state,value){
            console.log('mutations中的ADD_PERSON被调用了')
            state.personList.unshift(value)
        }
    },
    state:{
        personList:[
            {id:'001',name:'张三'}
        ]
    }
}

//创建并暴露store
export default new Vuex.Store({
    //★★★ 模块 将不同数据归类
    modules:{
        //最终会在 $store.state 中看到这里的 key=countAbout(如果上面namespaced:true, 那么 countAbout 就可以作为类名)
        countAbout:countOptions,    //求和相关的配置.

        personAbout:personOptions     //人员管理的配置
    }
})

上面进行模块化分类之后,在下面使用的时候,就要借助类名调用其中的内容。

components\Count.vue

<template>
    <div>
        <h1>当前求和为:{{sum}}</h1>
        <h3>当前求和放大10倍为:{{bigSum}}</h3>
        <h3>我在{{school}},学习{{subject}}</h3>

        <h3 style="color:red">Person组件的总人数是:{{personList.length}}</h3>

        <select v-model.number="n">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
        </select>

        <button @click="increment(n)">+</button>
        <button @click="decrement(n)">-</button>
        <button @click="incrementOdd(n)">当前求和为奇数再加</button>
        <button @click="incrementWait(n)">等一等再加</button>
    </div>
</template>

<script>
    import {mapState,mapGetters,mapMutations,mapActions} from 'vuex'
    export default {
        name:'Count',
        data() {
            return {
                n:1, //用户选择的数字
            }
        },
        computed:{
            //借助mapState生成计算属性,从state中读取数据。(数组写法)
            //countAbout.sum
            //countAbout.school
            //countAbout.subject
            //...mapState(第0个参数-分类名, [...]) 如果想在第0个参数指定分类,那么需要在配置 Vuex 的时候,  给每个配置加一个 namespaced:true
            ...mapState('countAbout',['sum','school','subject']), //★ 数组中写的内容,要保证 store 里已经有了。
            //personAbout.personList
            ...mapState('personAbout',['personList']),

            //借助mapGetters生成计算属性,从getters中读取数据。(数组写法)
            ...mapGetters('countAbout',['bigSum'])
        },
        methods: {
            //借助mapMutations生成对应的方法,方法中会调用commit去联系mutations(对象写法)
            ...mapMutations('countAbout',{increment:'JIA',decrement:'JIAN'}),
            //借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(对象写法)
            ...mapActions('countAbout',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
        },
        mounted() {
            console.log(this.$store)
        },
    }
</script>

<style lang="css">
    button{
        margin-left: 5px;
    }
</style>

components\Person.vue

<template>
    <div>
        <h1>人员列表</h1>
        <h3 style="color:red">Count组件求和为:{{sum}}</h3>

        <input type="text" placeholder="请输入名字" v-model="name">
        <button @click="add">添加</button>

        <ul>
            <li v-for="p in personList" :key="p.id">{{p.name}}</li>
        </ul>
    </div>
</template>


<script>
    import {nanoid} from 'nanoid'

    //本节视频的本文件中,没有一次使用 ...map***()方法。因为为下一节做好准备。
    export default {
        name:'Person',
        data() {
            return {
                name:''
            }
        },
        computed:{
            personList(){
                return this.$store.state.personList
            },
            sum(){
                return this.$store.state.sum
            }

        },
        methods: {
            add(){
                if(this.name.length == 0){
                    alert('名字不能为空.')
                    return
                }

                const personObj = {id:nanoid(),name:this.name}

                this.$store.commit('ADD_PERSON',personObj)
                this.name = ''
            },

        },
    }
</script>