学习vue第七天

86 阅读5分钟

Day7:

1.自定义创建项目

1.目标:基于 Vuecli 自定义创建项目架子
2.步骤:
    1.安装脚手架 (V)
    2.创建项目
    3.选择自定义
        1.Babel/Router/css/Linter
        2.Vue2.x
        3.VueRouter hash模式
        4.CSS预处理 Less
        5.ESlint: Standard & Lint on Save
        6.配置文件 dedicated config files

2.ESlint 代码规范

1.ESlint 代码规范
    1.目标:认识代码规范
    2.代码规范:一套写代码的约定规则。例如:"赋值符号的左右是否需要空格""一句结束是否是要加 ; "3.老话说:"没有规矩不成方圆" → 正规的团队需要 统一 的编码风格
    4.JavaScript Standard Style 规范说明 https://standardis.com/rules-zhcn.html
    5.下面是这份规则中的一小部分:
        1.字符串使用单引号  'abc'
        2.无分号  const name ='zs'
        3.关键字后加空格  if(name ='ls'){...}
        4.函数名后加空格  function name(arg){...}
        5.坚持使用全等 === 摒弃 ==
2.代码规范错误
    1.目标:学会解决代码规范错误
    2.两种解决方案:
        1.手动修正
            根据错误提示来一项一项手动修改纠正
            如果你不认识命令行中的语法报错是什么意思,根据错误代码去[ESLint 规则表]中查找其具体含义。
        2.自动修正
            基于 vscode 插件 ESLint 高亮错误,并通过配置 自动 帮助我们修复错误。
            在cscode里下载ESlint  打开设置 打开设置文件  加入以下代码:
                    //当保存的时候,eslint自动帮我们修复错误'
                "editor.codeActionsOnSave":{
                    "source.fixA1l": true
                },
                //保存代码,不自动格式化
                "editor.formatOnSave": false

3.vuex

1.vuex概述
    1.目标:明确 vuex是什么,应用场景,优势
    2.是什么:
        1.vuex是一个 vue 的 状态管理工具,状态就是数据。
        2.大白话:vuex 是一个插件,可以帮我们管理 vue 通用的数据(多组件共享的数据) 例如:购物车数据 个人信息数据
    3.场景:
        1.某个状态 在 很多个组件 来使用(个人信息)
        2.多个组件 共同维护 一份数据(购物车)
    4.优势:
        1.共同维护一份数据,数据集中化管理
        2.响应式变化
        3.操作简洁(vuex提供了一些辅助函数)
2.构建 vuex[多组件数据共享]环境
    1.目标:基于脚手架创建项目,构建 vuex 多组件数据共享环境
    2.效果是三个组件,共享一份数据:
        1.任意一个组件都可以修改数据
        2.三个组件的数据是同步的
    3.创建一个空仓库
        1.目标:安装 vuex插件,初始化一个空仓库
            1. 安装 vuex:yarn add vuex@3
            2.新建vuex模块文件:新建 store/index.js 专门存放 vuex
            3.创建仓库:Vue.use(Vuex) 创建仓库 new Vuex.Store()
            4.main.is导入挂载:在 main.js 中导入挂载到 Vue 实例上
            5.检验:this.$store
3.核心概念-state 状态
    1.目标:明确如何给仓库 提供 数据,如何 使用 仓库的数据
    2.提供数据:
        1.State 提供唯一的公共数据源,所有共享的数据都要统一放到 Store 中的 State 中存储
        2.在 state 对象中可以添加我们要共享的数据
              //创建仓库
            const store = new,Vuex.store({
              //state 状态,即数据,类似于vue组件中的data
              //区别:
              //1.data 是组件自己的数据
              //2.state 是所有组件共享的数据
              state:{
                count: 101
                }
            })
    3.使用数据:
        1.通过 store 直接访问
            获取 store:
                1.this.$store
                2.import 导入 store

            模板中:{{ $store.state.xxx }}
            组件逻辑中:this.$store.state.xxX
            JS模块中:store.state.xxx
        2.通过辅助函数
            mapState是辅助函数,帮助我们把 store中的数据 自动 映射到 组件的计算属性中
                1.导入mapState:import {mapState}from 'vuex'
                2.数组方式引入state:mapState(['count'])
                3.展开运算符映射:computed:{
                                  ...mapState(['count'])
                                }
4.核心概念-mutations
    1.目标:明确 vuex同样遵循单向数据流,组件中不能直接修改仓库的数据  
        1.this.$store.state.count++(错误写法) 
        2..通过 strict:true 可以开启严格模式
    2.目标:掌握 mutations 的操作流程,来修改 state 数据,(state数据的修改只能通过 mutations)
        1.定义 mutations 对象,对象中存放修改 state 的方法
        const store= new Vuex.store({
          state:{
            count:0
          },
          //定义mutations
          mutations :{
            //第一个参数是当前store的state属性
            addcount(state){
              state.count += 1  
            }
          }
        })               
        2.组件中提交调用 mutations
        this.$store.commit('addcount')
    3.目标:掌握 mutations 传参语法
        提交 mutation 是可以传递参数的`this.$store.commit('xxx',参数)`         
        1.提供 mutation 函数(带参数-提交载荷 payload)
            mutations:{
              ...
              addcount(state,n){  
                state.count += n
              }
            },
        2.页面中提交调用 mutation
            this.$store.commit('addcount', 10)
        3.Tips:提交参数只能一个,如果有多个参数,包装成一个对象传递
            this.$store.commit('addcount',{
              count:10,
              ...
            })
    4.练习
        1.目标:实时输入,实时更新,巩固 mutations 传参语法
            1.输入框内容渲染: :value
            2.监听输入获取内容: @input
            3.封装mutation处理函数: mutation传参
            4.调用传参: commit调用
5.辅助函数:mapMutations
    1.目标:掌握辅助函数 mapMutations,映射方法
    2.mapMutations 和 mapState很像,它是把位于mutations中的方法提取了出来,映射到组件methods中
        1.mutations:{
        subcount(state,n){
        state.count -= n
        }
        },

        2.import{mapMutations} from 'vuex'
        methods:{
          ...mapMutations(['subcount'])
        }
        等价于做了下面代码的事
        methods:{
          subcount(n){
            this.$store.commit('subcount', n)
          }
        },

        3.this.subcount(10)调用
6.核心概念-actions
    1.目标:明确 actions 的基本语法,处理异步操作。
    2.需求: 一秒钟之后,修改 state 的 count 成 6663.说明:mutations 必须是同步的(便于监测数据变化,记录调试)
        1.提供action 方法
            actions:{
              setAsyncCount(context,num){
                //一秒后,给一个数去修改 num
                setTimeout(() => {
                  context.commit('changecount',num)
                },1000)
              }
            }
        2.页面中 dispatch 调用
            this.$store.dispatch('setAsynccount',200)
7.辅助函数-mapActions
    1.目标:掌握辅助函数 mapActions,映射方法
    2.mapActions 是把位于 actions中的方法提取了出来,映射到组件methods中
        1.actions:{
          changecountAction(context,num){
            setTimeout(()=>{
              context.commit('changecount',num)
            },1000)
          }
        }

        2.import {mapActions }from 'vuex

        methods:{
          ...mapActions(['changecountAction')
        }
        等价于
        methods:{
          changecountAction(n){
            this.$store.dispatch('changeCountAction',n)
          },
        }

        3.this.changeCountAction(666)调用
8.核心概念-getters
    1.目标:掌握核心概念 getters 的基本语法(类似于计算属性)
    2.说明:除了state之外,有时我们还需要从state中派生出一些状态,这些状态是依赖state的,此时会用到getters
    3.例如:state中定义了list,为1-10的数组,组件中,需要显示所有大于5的数据
        state:{
          list:[12345678910]
        }
            1.定义 getters
                getters:
                  // 注意:
                  //(1)getters函数的第一个参数是 state
                  //(2)getters函数必须要有返回值
                  filterList(state){
                    return state.list.filter(item=> item > 5)
                  }
                }
            2.访问getters
                1.通过 store 访问 getters
                    {{ $store.getters.filterList }}
                2.通过辅助函数 mapGetters 映射
                    computed:{
                      ...mapGetters(['filterList'])
                    },

                    {{ filterList }}
9.核心概念-模块 module(进阶语法)
    1.目标:掌握核心概念 module 模块的创建
    2.由于 vuex 使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。(当项目变得越来越大的时候,Vuex会变得越来越难以维护)
    3.例如:
        state:{
          userInfo:{
            name:'zs',
            age:18
          },
          theme:'dark',
          desc:'测试项目'
        },

    模块拆分:ser模块:store/modules/user.js
        1.const state = {
          userInfo: {
          name: 'zs',
          age: 18
          }
        }
        const mutations = {}
        const actions = {}
        const getters = {}
        export default {
          state,
          mutations,
          actions,
          getters
        }

        2.import user from'./modules/user'

        const store = new Vuex.store({
          modules:{
            user
          }
        })
10.核心概念-模块 module(进阶语法)
    1.目标:掌握模块中 state 的访问语法
        1.尽管已经分模块了,但其实子模块的状态,还是会挂到根级别的state 中,属性名就是模块名
        2.使用模块中的数据:
            1.直接通过模块名访问 $store.state.模块名.xxx
            2.通过 mapState 映射
                1.默认根级别的映射 mapstate(['xxx'])
                2.子模块的映射 mapstate('模块名',['xxx'])-需要开启命名空间
                    export defaultf
                      namespaced: true,  //命名空间开启
                      state,
                      mutations,
                      actions,
                      getters
                    }
    2.目标:掌握模块中 getters 的访问语法
        1.使用模块中 getters 中的数据:
            1.直接通过模块名访问 $store.getters['模块名/xxx']
            2.通过 mapGetters 映射
                1.默认根级别的映射 mapGetters(['xxx'1)
                2.模块的映射 mapGetters('模块名',['xxX'])-需要开启命名空间
    3.目标:掌握模块中 mutation 的调用语法
        1.注意:默认模块中的 mutation 和 actions 会被挂载到全局,需要开启命名空间,才会挂载到子模块
        2.调用子模块中 mutation:
            1.直接通过 store 调用 $store.commit('模块名/xxx',额外参数)
            2.通过 mapMutations 映射
                1.默认根级别的映射 mapMutations(['xxx'])
                2.子模块的映射 mapMutations('模块名',['xxx'])-需要开启命名空间
    4.目标:掌握模块中 action 的调用语法(同理-直接类比 mutation 即可)
        1.注意:默认模块中的 mutation 和 actions 会被挂载到全局,需要开启命名空间,才会挂载到子模块。
        2.调用子模块中 action:
            1.直接通过 store 调用 $store.dispatch('模块名/xxx',额外参数)
            2.通过 mapActions 映射
                1.默认根级别的映射 mapActions(['xxx'])
                2.子模块的映射 mapActions('模块名',['xxx'])-需要开启命名空间

4.购物车案例(第100-104集)