Vuex总结

一、简述对Vuex的理解
    1.什么是Vuex:
            Vuex是一个专为Vue.js应用程序开发的状态管理模式。
    2.使用Vuex的原因:
            当我们遇到多个组件共享状态时,多层组件的传值非常繁琐,不利于维护,因此我们把组件的共享状态抽取出来,以一个单例模式管理,在这种模式下,不管在哪个组件都可以获取状态或触发行为
    3.什么情况下使用:
            <1>虽然Vuex可以帮助我们管理共享状态,但是也附带了更多的概念和框架,增加了学习成本,所以决定是否要使用Vuex要对短期和长期效益进行权衡。
            <2>如果应用够简单,最好不要使用Vuex;如果需要构建一个中大型单页应用,可以考虑使用Vuex去更好的再组件外部管理状态。
    4.如何使用Vuex:
            <1>每一个Vuex应用的核心就是store(仓库),它包含着应用中大部分的状态(state),store是内存机制,而不是缓存机制,当前页面一旦刷新挥着通过路由跳转亦或是关闭,都会导致store初始化。
            <2>Vuex的核心概念分别是:
                    (1)State: 存放基本数据   ----辅助函数mapState: 当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键。
                    (2)getters:是从store中的state派生出来的状态,专门来计算state中的数据,相当于state中数据的计算属性  ---辅助函数mapGetters辅助函数: mapGetters 辅助函数仅仅是将 store 中的 getters 映射到局部计算属性,与state类似
                   (3)actions:  是专门操作异步请求的数据和业务逻辑的地方,它不能直接变更state中的状态,而是通过commit来调用mutations里的方法来改变state里的数据。 ---辅助函数mapActions 将组建的methods映射为store.dispath调用
                    (4)mutations:提交mutions是更改Vuex中的状态的唯一方法。mutations必须是同步的,如果要异步需要使用actions。每一个mutations都有一个字符串作为第一个参数,提交载荷作为第二个参数。 ---辅助函数mapMutations 将组建中的methods映射为store.commit调用。
                    (5)Moules:使用单一状态树,导致应用的所有状态几种到一个很大的对象,但是,当应用变得很大时,store对象会变得臃肿不堪,为了解决以上问题,Vuex允许我们将store分割到模块(modules)。每个模块拥有自己的state、mutations、avtions、grtters。
            <3>若要改变state里的数据,则通过actions使用comiit来调用mutations里的方法进而改变state里的数据。
                    
 
二、路由懒加载
    1.懒加载
            也叫延迟加载或者按需加载,即在需要的时候进行加载,
      2.为什么要使用懒加载
            像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,时间过长,会出现时间的白屏,即使做了loading也是不利于用户体验,而运用懒加载则可以将页面进行划分,需要的时候加载页面,可以有效的分担首页所承担的加载压力,减少首页加载用时
    简单的说就是:进入首页不用一次加载过多资源造成用时过长
      3.方式:
            (1) 使用vue的异步组件,可以实现路由的懒加载
  {           
     path: '/home',           
     name: 'home',           
     component: resolve => require(['../components/home'], resolve)       
 
   } 
 
        (2) es提出的import(推荐使用这种方式)
        const homeFn = () => import('../components/home/home')
        const movieFn = () => import('../components/movie/movie')   
        export default new Router({   
           routes: [       
         {   
      path: '/home',   
        name: 'home',            
      component: homeFn       
         },       
         {            
      path: '/movie',            
      name: 'movie',           
       component: movieFn      
      }  
          ] })   
 
路由懒加载代码:
 
import Vue from 'vue'
import Router from 'vue-router'
// import HelloWorld from '@/components/HelloWorld'
import Home from "../components/home.vue";
import List from "../components/list.vue";
Vue.use(Router)
//es import方式  必须要由一个返回值 所以加载的时候不需要加{}
const Hello = ()=>import("@/components/HelloWorld");
export default new Router({
  routes: [
    // {
    //   path: '/',
    //   name: 'HelloWorld',
    //   //vue异步组件加载方式
    //   //component: resolve=>{require(["@/components/HelloWorld"],resolve)}
    //   component:Hello
    // }
    {
      path:"/home",
      name:"home",
      component:Home,
      children:[],
      //路由解耦
      //porps:true
    },
    {
      path:"/list",
      name:"list",
      component:List,
      children:[],
      //路由解耦
      //porps:true
    }
  ]
})
/*
  vue异步组件
  component:resolve=>{require(["@/components/HelloWorld"],resolve)}
  参数1:需要加载的模块
  参数2:加载成功的参数
  2、es import
*/
 
 
 
 
 箭头函数不带{  }就是自动返回值;
 
 
Keep-alive:
 
组件的缓存,如果当前组件需要进行缓存的情况下,我们需要将当前组件外部,加keep-alive;
 
actived:huoyu:活跃状态;当前组件是一个显示状态;
deactived:  缓存状态;如果组件进行了切换,那么当前组件就会保存在缓存中;
 
参数: inclcude    包含: 包含哪些组件进入缓存状态
      exclude     排除: 排除哪些组件进入缓存状态
 
尽量配合component进行使用
router-view 也可以进行缓存,但是include,exclude不生效;
 
什么时候会用到路由的监听 或者 beforRouteUpdate
 
当当前组件被复用的时候(没有经历创建和销毁的时候),当路由发生改变的时候数据是不会发生改变的 需要调用
beforeRouteUpdate或者watch进行监听
 
路由解耦:
 
在router路由配置项中添加props:true
在需要接受理由参数的组件中通过props进行接收,如:例如 props:["属性","属性"]props:["id”,“name”](只适用于parms,不适用于query)
 
<template>
        <div>
            <router-view></router-view>
            <ul>
                <li v-for="(item,index) in goodsList">
                    <router-link :to="{name:'details',params:{name:item.goodsName,id:item.id}}">{{item.goodsName}}</router-link>
                </li>
            </ul>
        </div>
</template>
<style >
   
</style>
<script>
import Vuex from "vuex";
export default {
    created() {
        console.log(this.fn());
    },
    data(){
        return {
            goodsList:[
                {
                    id:1,
                    goodsName:"马蕊"
                },
                {
                    id:2,
                    goodsName:"胡丽霞"
                },
                {
                    id:3,
                    goodsName:"姗姗"
                },
                {
                    id:4,
                    goodsName:"田利利"
                }
            ]
        }
    },
    computed:{
        // ...Vuex.mapState({
        //     list:state=>{
        //         let arr =  state.list;
        //         var arr1 = arr.map((item)=>{
        //             console.log(item)
        //             return item*2
        //         })
        //         return arr1
        //         }
        // })
        ...Vuex.mapState({
            a:state=>state.homeStore.a
        })
    },
    methods:{
        ...Vuex.mapActions({
            fn:"homeStore/fn"
        })
    }
}
</script>
 
路由:根据用户请求地址不同返回不同的结果
前端路由,后端路由
 
 
 
 
...扩展运算符:
 
 
 
 
 
namespaced: true;
保证当前模块与其他模块之间的命名不产生冲突;
posted @ 2018-11-19 22:53  yay嫒瑜  阅读(84)  评论(0编辑  收藏  举报