vuex基础使用大全

vuex是什么

vuex是一个状态管理工具,在使用vue写代码的时候能帮助我们更好的管理数据

vuex

  • 当我们需要对数据进行更好的统一的管理的时候
  • 就需要用到vuex
    • 安装vuex指令:npm i vuex -S
    • 创建一个store文件夹,在下面创建一个index.js文件
    • 引入vue和vuex
    • store用来统一管理数据
    • 在组件中我们可以使用$store.state.username访问到下面仓库中声明定义的username属性
//引入vue和vuex
import Vue from 'vue'
import Vuex from 'vuex'
//插件使用
Vue.use(Vuex);

// 创建vue项目管理状态的仓库
const store = new Vuex.Store({
  // 提供仓库管理的状态
  state: {
    username: 'zhangsan'
  }

});
//导出仓库
export default store;

vue中的mutation

  • 在vue中,不推荐在仓库外部对state直接进行修改
  • 推荐使用提交mutation从而修改state
  • 使用下面两种方法进行修改数据修改
  • 当我们在组件中直接修改state中数据,也是可以修改的,但是这样会让数据变得变得不可控,我们需要阻止启动生产消息,当我们在组件中修改state中数据中报出警告提示
  • 我们把mutation作为修改state的唯一方式
//在main.js中输入这一行语句后,如果组件中直接修改state,vue可以给我报出警告提示
Vue.config.productionTip = false
//使用mutation修改state方法
//方法一:使用一个数组
this.$store.commit('modifyUsername', 'lisi')
//方法二:使用一个对象
    this.$store.commit({
        // type不能省略
        type: 'modifyUsername',
        value: 'lisi'
     })

vue中的action

  • 对仓库数据进行修改前,有异步操作,就使用actions
  • 我们组件中调起action操作,在action中执行异步操作,然后调起mutation,依旧使用mutation修改state
  • 示例
//在组件中调起action
// 调用actions
// 调用action方法一,使用一个数组
// this.$store.dispatch('modifyUsernameAction', 'lisi');
// 调用action方法二,使用一个对象
this.$store.dispatch({
type: 'modifyUsernameAction',
value: 'lisi'
})
//在仓库中使用action调用mutation
 actions: {
    // 方法名字是自定义的
    modifyUsernameAction(context, payload){
      console.log('modifyUsernameAction执行了。。。。。');
      setTimeout(() => {
        context.commit({
          type: 'modifyUsername',
          value: payload.value
        });
      }, 2000);
    }
  }
//mutation被调用修改state
mutations: {
    // 方法名字自定义
    modifyUsername(state, payload){
      console.log('modifyUsername调用了。。。。');
      state.username = payload.value;
    }
  }

过滤器

  • 过滤器可以将数据在dom中的展示变成我们需要的样子,而不改变变量本身的内容
  • 因此我们可以方便的计算和展示

全局过滤器

  • 我们在main.js中声明全局过滤器
  • 声明一个名为upppercase的过滤器,将字母转化为大写
//这是在main.js中声明的一个全局过滤器
Vue.filter("uppercase", (value, ...rest) => {
  console.log("uppercase过滤器执行了。。。。");
  console.log(rest);
  return value.toUpperCase();
});
  • 当我们使用时,使用如下方式
//这样子message代表的字符串就会以uppercase返回后的数据方式展示在dom元素上,而message不被改变
<template>
<h1>{{ message | uppercase }}</h1>
</template>

局部过滤器

  • 局部过滤器我们在组件的script中创建
export default {
  // 局部过滤器
  filters: {
    currency(value, num) {
      return "$" + (value / 6.6999).toFixed(num);
    },
  },
  data(){
      return{}
  }
}

vuex中的计算属性getters

  • 类似组件中的计算属性,
  • 在组件中我们用this.$store.getters.recommendCount来访问
  • 示例:
const store = new Vuex.Store({
    state: {
        banner: [],
        list: []
     },

  // 计算属性
  // 返回 list的长度和奇偶
    getters: {
        recommendCount(state, getters){
          return state.list.length;
        },
        type(state, getters){
          return getters.recommendCount % 2 === 1 ? 'odd' : 'even';
        }
      },
    })

vuex中的mapState

  • mapState可以将全局state中的属性转化成组件的计算属性
  computed: {
    // 内部的计算属性
    ab() {
      return this.a + this.b;
    },
    //.......其他内部计算属性都可以在这写
    // 全局的属性转为组件的计算属性
    ...mapState({
      bannerData: (state) => state.banner,
      listData: (state) => state.list,
      count: (state) => state.list.length,
    })
  },

vuex中的mapGetters

  • mapGetters可以将全局中的计算计算属性(getters)中的属性转化为组件的计算属性
  computed: {
    // 内部的计算属性
    ab() {
      return this.a + this.b;
    },
    //.......其他内部计算属性都可以在这写
    // 全局的属性转为组件的计算属性
    ...mapState({
      bannerData: (state) => state.banner,
      listData: (state) => state.list,
      count: (state) => state.list.length,
    }),
    
    
    // 全局的计算属性转为组件的计算属性
    // 方式1:
    // ...mapGetters(['recommendCount', 'type']),
    // 方式2:
    ...mapGetters({
      count: 'recommendCount',
      type: 'type',
    }),

  }

vuex的mapMutations和mapActions

  • mapMutations可以将全局中的matation为组件的methods
  • mapActions可以将全局中的actions转化为组件的methods
  methods: {
    //组件内部的方法。。。

    // 转换全局的mutations为组件的methods
    // ...mapMutations([]),
    // ...mapMutations({}),

    // 转换全局的actions为组件的methods
    // 方式1:
    // ...mapActions(['requestBannerData', 'requestRecommendList']),
    // 方式2:
    ...mapActions({
      requestBanner: 'requestBannerData',
      requestRecommend: 'requestRecomm,endList',
    }),
  },

vuex中的模块化(modules)

  • 当我们在store中的index.js中写所有的数据管理时,数据非常多,管理不方便,所以我们使用模块化管理数据
  • 创建新的文件分别管理不同组件的数据,如下示例1
  • 可以给模块化设置命名空间,如下示例1
  • 在index.js中导入组件数据管理的文件,如下示例2
  • 在组件中调用时需要加上路径名称,如下示例3
  • 当有模块化时候,我们需要使用到mapState,mapGetters,mapMutations,mapActions时候,需要加上模块名称,如下示例4
//示例1
//在管理组件数据的文件夹导出一个对象,
export default {
  // 设置命名空间
  namespaced: true,

  state: {
    banner: [1, 2, 3, 4]
  },

  getters: {
    len(state, getters, rootState, rootGetters){
      console.log(state, getters, rootState, rootGetters);
      return state.banner.length;
    }
  },

  mutations: {
    add(state, payload){
      console.log('home add.....');
      state.banner.push(payload);
    } 
  },
  actions: {
    addAction(context, payload){
      console.log('home add action.....');
      context.commit('add');
    } 
  }
}
//示例2
import Vue from "vue";
import Vuex from "vuex";
//导入模块
import user from './modules/user'
import home from './modules/home'
Vue.use(Vuex);
// 创建vue项目管理状态的仓库
const store = new Vuex.Store({
  // 仓库外部不能对state进行修改,只能在仓库内部修改
  strict: true,
  
  state: {},
  mutations: {},
  actions: {},
  
  // 设置了仓库的模块
  modules: {
  //给user模块重新命名为了u
    u: user,
    home
  }
});
//示例3
export default {
  methods: {
    btnAction(){
      // 调用模块的state
      console.log(this.$store.state.home.banner);

      // 调用getters
      console.log(this.$store.getters['home/len']);

      // 调用muataions
      this.$store.commit('home/add', 'a');

      // 调用actions
      this.$store.dispatch('home/addAction', 'a');
    }
  }
}
//示例4
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'
export default {
  computed: {
    ...mapState({
      name: state=>state.user.name
    }),
    ...mapGetters({
      age: 'user/age'
    })
  },
  methods: {
    ...mapMutations({
      modifyName: 'user/modifyName'
    }),
    ...mapActions({
      modifyNameAction: 'user/modifyNameAction'
    })
  },

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348