《进阶篇第9章》学习vuex知识点后练习:把求和案例改成vuex模块化编码

简介: 《进阶篇第9章》学习vuex知识点后练习:把求和案例改成vuex模块化编码

image.png

@[toc]

效果展示:

image.png

注意点1:

问题:如何实现“当前和为奇数再加”?

答案:
incrementOdd(){
   
    if(this.sum % 2){
   
        this.sum += this.n
    }
}
注意点2:

问题:select下拉框默认为1时,点击加号没问题,但是下拉框选中为2时,n值变成字符串了,不应该是数字类型名吗?

旧代码:无论设置 value="1"还是 value=1都无效
<h1>当前求和为:{
   {
   sum}}</h1>
<select v-model="n">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>
答案:因为没设置值选中值为数值类型

方式1,使用v-bind

<h1>当前求和为:{
   {
   sum}}</h1>
<select v-model="n">
    <option :value="1">1</option>
    <option :value="2">2</option>
    <option :value="3">3</option>
</select>

方式2,v-model设置修饰符

<h1>当前求和为:{
   {
   sum}}</h1>
<select v-model.number="n">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>

9.7求和案例_vuex模块化编码

image.png
image.png
image.png

注意点1:
创建并暴露store有2种写法

写法1完整写法

//创建并暴露store
export default new Vuex.Store({
   
    modules:{
   
        countAbout:countOptions,
        personAbout:personOptions
    }
})

写法2简写,不写kye,默认就是key和value同名

//创建并暴露store
export default new Vuex.Store({
   
    modules:{
   
        countOptions,
        personOptions
    }
})
注意点2:
报错如图,问题发生在length不认识是哪个对象获得的,解决方案就是如下,mapState第一个参数必须指定分类,不然personList就是underfine,而underfine.length就会报错

java <h3 style="color:red">Person组件的总人数是:{ {personList.length}}</h3> ...mapState('countAbout',['sum','school','subject']),
image.png

注意点3:

问题:mapState第一个参数指定分类时,报错如图

解决方案:mapState如果想指定分类,那有个前提,在配置vuex时候每个配置里面都加namespaced:true,不配置namespaced默认为false,只有这么写,你的创建并暴露store的modules的名称(也就是countAbout和personAbout),才能被mapState第一个参数认识。
image.png

注意点4:...mapState可以写很多个进行配置

注意点5:

问题:报错如图,就说明没指定这个JIA是哪个分类下面的

解决方案:mapMutations第一个参数也需要指定分类名称,代表从哪里来,正确代码,同理...mapActions第一个参数也需要指定分类名称。

...mapMutations('countAbout',{
   increment:'JIA',decrement:'JIAN'}),

image.png

注意点6:
Count.vue使用map方法封装函数,而Person.vue就用最原始的方法去练习

注意点7:
注意state、getters、dispatch、commit中配置modules的分类名称方法是不一样的,有的方法第一个参数,有的是使用/,识别/前面作为分类名,后面作为mutations的名,详情请看开头总结图片。

注意点8:
在Person.vue中定义的vuex配置项中的state可不是总的state,而是Person.vue它自己的state

注意点9:
读取对象属性使用点“.”的时候就不能使用“/”,

错误写法

firstPersonName(){
   
    return this.$store.getters.personAbout/firstPersonName
}

正确写法

firstPersonName(){
   
    return this.$store.getters['personAbout/firstPersonName']
}

完整代码

main.js

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//引入插件
import vueResource from 'vue-resource'
//引入store
import store from './store'

//关闭Vue的生产提示
Vue.config.productionTip = false
//使用插件
Vue.use(vueResource)

//创建vm
new Vue({
   
    el:'#app',
    render: h => h(App),
    store,
    beforeCreate() {
   
        Vue.prototype.$bus = this
    }
})

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,Person},
        mounted() {
   
            // console.log('App',this)
        },
    }
</script>

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中读取数据。(数组写法)
            ...mapState('countAbout',['sum','school','subject']),
            ...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>

Person.vue

<template>
    <div>
        <h1>人员列表</h1>
        <h3 style="color:red">Count组件求和为:{
   {
   sum}}</h3>
        <h3>列表中第一个人的名字是:{
   {
   firstPersonName}}</h3>
        <input type="text" placeholder="请输入名字" v-model="name">
        <button @click="add">添加</button>
        <button @click="addWang">添加一个姓王的人</button>
        <button @click="addPersonServer">添加一个人,名字随机</button>
        <ul>
            <li v-for="p in personList" :key="p.id">{
   {
   p.name}}</li>
        </ul>
    </div>
</template>

<script>
    import {
   nanoid} from 'nanoid'
    export default {
   
        name:'Person',
        data() {
   
            return {
   
                name:''
            }
        },
        computed:{
   
            personList(){
   
                return this.$store.state.personAbout.personList
            },
            sum(){
   
                return this.$store.state.countAbout.sum
            },
            firstPersonName(){
   
                return this.$store.getters['personAbout/firstPersonName']
            }
        },
        methods: {
   
            add(){
   
                const personObj = {
   id:nanoid(),name:this.name}
                this.$store.commit('personAbout/ADD_PERSON',personObj)
                this.name = ''
            },
            addWang(){
   
                const personObj = {
   id:nanoid(),name:this.name}
                this.$store.dispatch('personAbout/addPersonWang',personObj)
                this.name = ''
            },
            addPersonServer(){
   
                this.$store.dispatch('personAbout/addPersonServer')
            }
        },
    }
</script>

Index.js

//该文件用于创建Vuex中最为核心的store
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
import countOptions from './count'
import personOptions from './person'
//应用Vuex插件
Vue.use(Vuex)

//创建并暴露store
export default new Vuex.Store({
   
    modules:{
   
        countAbout:countOptions,
        personAbout:personOptions
    }
})

count.js

//求和相关的配置
export default {
   
    namespaced:true,
    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
        }
    },
}

person.js

//人员管理相关的配置
import axios from 'axios'
import {
    nanoid } from 'nanoid'
export default {
   
    namespaced:true,
    actions:{
   
        addPersonWang(context,value){
   
            if(value.name.indexOf('王') === 0){
   
                context.commit('ADD_PERSON',value)
            }else{
   
                alert('添加的人必须姓王!')
            }
        },
        addPersonServer(context){
   
            axios.get('https://api.uixsj.cn/hitokoto/get?type=social').then(
                response => {
   
                    context.commit('ADD_PERSON',{
   id:nanoid(),name:response.data})
                },
                error => {
   
                    alert(error.message)
                }
            )
        }
    },
    mutations:{
   
        ADD_PERSON(state,value){
   
            console.log('mutations中的ADD_PERSON被调用了')
            state.personList.unshift(value)
        }
    },
    state:{
   
        personList:[
            {
   id:'001',name:'张三'}
        ]
    },
    getters:{
   
        firstPersonName(state){
   
            return state.personList[0].name
        }
    },
}

结果展示

image.png

本人其他相关文章链接

1.《进阶篇第9章》学习vuex知识点后练习:求和案例_纯vue版代码
2.《进阶篇第9章》学习vuex知识点后练习:把求和案例改成vuex版代码
3.《进阶篇第9章》学习vuex知识点后练习:把求和案例改成getters
4.《进阶篇第9章》学习vuex知识点后练习:把求和案例改成mapState与mapGetters
5.《进阶篇第9章》学习vuex知识点后练习:把求和案例改成mapMutations与mapActions
6.《进阶篇第9章》学习vuex知识点后练习:把求和案例改成多组件共享数据
7.《进阶篇第9章》学习vuex知识点后练习:把求和案例改成vuex模块化编码

目录
相关文章
|
架构师 测试技术 C语言
软件测试的优势和劣势
我们需要对软件测试有清晰的认识。那么作为软件测试,和软件开发相比,又有哪些优势呢?
647 0
|
7月前
|
人工智能 IDE Devops
通义灵码编程智能体,上线!
近期,Qwen3正式发布并开源8款“混合推理模型”,参数量235B,激活仅需22B,性能超越多个国际顶尖模型。通义灵码全面支持Qwen3,上线编程智能体,具备工程级变更、自动感知、工具使用和终端命令执行四大能力。插件集成魔搭MCP广场2400+服务,大幅提升开发效率。目前,通义灵码插件下载超1500万,生成代码超30亿行,服务上万家企业。
802.11g 标准的数据速率是多少?
【8月更文挑战第24天】
844 0
|
存储 关系型数据库 MySQL
MySQL 字段类型探究:深入理解 Varchar(50) 与 Varchar(500)
在MySQL数据库中,`VARCHAR`类型是一种常用的字符串存储类型,它允许定义一个可变长度的字符串。然而,`VARCHAR(50)`和`VARCHAR(500)`之间的差异不仅仅是长度的不同,它们在存储和性能方面也有显著的区别。本文将深入探讨这两种字段类型的区别,以及它们在实际应用中的选择。
492 3
|
机器学习/深度学习 移动开发 Java
一文搞懂:一般用到的短信,邮件换行符号
一文搞懂:一般用到的短信,邮件换行符号
577 0
|
Linux
68Linux - 解决CentOS启动卡住了,提示starting auditd: [failed]
68Linux - 解决CentOS启动卡住了,提示starting auditd: [failed]
400 0
|
CDN 缓存 UED
【计算巢】内容分发网络(CDN):加速全球内容传输的技术
【6月更文挑战第3天】内容分发网络(CDN)是加速全球内容传输的关键技术,通过在全球建立节点服务器,缓存内容以减少传输延迟。CDN在电商、视频流媒体等领域提升用户体验,确保快速加载速度。示例代码展示了CDN基本逻辑。然而,构建高效CDN需解决缓存策略、节点管理等问题,并依据业务需求规划配置。随着技术演进,CDN将持续优化性能,为数字生活带来更多便利。
253 3
【计算巢】内容分发网络(CDN):加速全球内容传输的技术
|
云计算
云计算Agent问题之Agent的思考阶段步骤如何解决
云计算Agent问题之Agent的思考阶段步骤如何解决
184 1
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
前端开发
uniapp 实现退出登录 清除Token
uniapp 实现退出登录 清除Token
437 0