• vue中的vuex使用


    vue中的vuex使用

    最近心事重重,好多事情堆到一起就有点闷,今天本来打算自己搓一篇vuex的博文,但是电脑坏了,内容丢了,很烦,就直接转载一个大神的吧。

    那晚和朋友聊到了vue的vuex的问题,我很霸气的说了一句没用过,但是回过头来就去百度学习一下发现,我好想之前用过,只不多当时不知道那就是vuex。今天本来打算自己搓一个案例,毕竟自己写的还好理解,但是最近点儿背,电脑死掉了,那转载个大神的博文吧,写的比我的好。

    vuex

    vuex是使用vue中必不可少的一部分,基于父子、兄弟组件,我们传值可能会很方便,但是如果是没有关联的组件之间要使用同一组数据,就显得很无能为力,那么vuex就很好的解决了我们这种问题,它相当于一个公共仓库,保存着所有组件都能共用的数据。

    那么,我们一起来看看vue项目怎么使用它吧。(如果你对vuex有一定了解,不是刚接触的小白,请忽略第一步,直接查看第二步)

    一、适合初学者使用,保存数据以及获取数据

    1、在store文件夹,新建个index.js文件(命名看个人习惯,如果没有该文件夹,可以新建一个,当然也可以不建文件夹,直接新建个js文件也是可以的)

    在新建的js文件中写入如下代码:

    import Vue from "vue"
    import Vuex from "vuex"
     
    Vue.use(Vuex);
     
    export default new Vuex.Store({
        state:{
            pathName: "",
            currDbSource: {},
            currJobData: {},
            DbSource: []
        },
        mutations:{
            // 保存当前菜单栏的路径
            savePath(state,pathName){
                state.pathName = pathName;
            },
            // 保存当前点击的数据源
            saveCurrDbSource(state,currDbSource){
                state.currDbSource = currDbSource;
            },
            // 保存当前点击的元数据
            saveCurrJobData(state,currJobData){
                state.currJobData = currJobData;
            },
            // 保存所有数据源
            saveDbSource(state,DbSource){
                state.DbSource = DbSource;
            }
        }
    })
    

    这里解释一下各个代码段的作用:state是自定义的一些变量,需要用来保存数据,mutations是用来触发事件,相当于方法,用户需要通过触发这个方法,借此来保存数据,参数的话,第二个参数就是用户传入的值,然后在方法中赋值给state中的变量

    2、main.js引用:(注意路径即可)

    // 引入vuex-store
    import store from './store/index';
     
    new Vue({
      el: '#app',
      router,
      store,
      render: h => h(App)
    });
    

    3、保存数据:(场景举例:当我点击按钮后,我需要把当前的数据保存到vuex中,然后跳转到别的路由,然后使用这些数据)

    methods:{
        click(){
            // 点击按钮进行一些操作,然后保存数据
            this.$store.commit('saveCurrDbSource',this.db)
        }
    }
    

    这里的第一个参数是要触发的方法,也就是上面mutations中的方法,第二个参数是你要传递的数据

    4、获取变量:(当数据初始获取不到时,可以使用计算属性用来获取)

    this.$store.state.变量名
     
    // 例如
    this.store.state.currDbSource
    

    这样其他组件就可以共用这个保存起来的数据了,也能进行相应的修改

    二、模块化(适合有部分基础的人)

    当然,上述方法中我们把所有东西都写在一个文件中了,这样数据多的时候,耦合度太高,也不便于维护,而且mutations也不能解决异步问题,这里就介绍另一种方式以及actions

    actions:看过官网介绍的人都知道,这是间接触发mutations方法的一种 " 中间商 ",而且它可以执行异步操作,避免用户去直接操作state

    1、state.js :保存所有数据,以对象的方式导出

    export default {
      pathName: '', // 路由
      currDbSource: {}, // 当前数据源
      currJobData: {}, // 当前元数据
      DbSource: [], // 所有数据源,供元数据界面下拉列表使用
      selectJobMeta: {}, // 当前选择的元数据(搜索后点击的单条数据)
      specialSubject: [], // 专题数据(多条)
      duplicateJobMeta: {}, // 复制的数据
    };
    

    2、mutations.js :保存所有方法,用来改变state的数据

    // 保存当前菜单栏的路径
    export const savePath = (state, pathName) => {
      state.pathName = pathName;
    };
     
    // 保存当前点击的数据源
    export const saveCurrDbSource = (state, currDbSource) => {
      state.currDbSource = currDbSource;
    };
     
    // 保存当前点击的元数据
    export const saveCurrJobData = (state, currJobData) => {
      state.currJobData = null;
      state.currJobData = currJobData;
    };
     
    // 保存所有数据源
    export const saveDbSource = (state, DbSource) => {
      state.DbSource = DbSource;
    };
     
    // 保存搜索后选择的那一条元数据
    export const saveSelectJobMeta = (state, selectJobMeta) => {
      state.selectJobMeta = selectJobMeta;
    };
     
    // 保存搜索的那一类专题
    export const saveSpecialSubject = (state, specialSubject) => {
      state.specialSubject = specialSubject;
      state.selectJobMeta = {};
    };
     
    // 保存复制的元数据(名称为空)
    export const saveDuplicateJobMeta = (state, duplicateJobMeta) => {
      state.duplicateJobMeta = duplicateJobMeta;
    };
    

    3、actions.js :暴露给用户使用,借此触发mutations中的方法,保存数据(可执行异步操作)

    // 触发保存菜单栏的路径方法
    export const savePath = ({ commit }, payload) => {
      commit('savePath', payload);
    };
     
    // 触发获取当前点击的数据源方法
    export const saveCurrDbSource = ({ commit }, payload) => {
      commit('saveCurrDbSource', payload);
    };
     
    // 触发获取当前点击的元数据方法
    export const saveCurrJobData = ({ commit }, payload) => {
      commit('saveCurrJobData', payload);
    };
     
    // 触发获取所有数据源方法
    export const saveDbSource = ({ commit }, payload) => {
      commit('saveDbSource', payload);
    };
     
    // 触发保存搜索后选择单条元数据方法
    export const saveSelectJobMeta = ({ commit }, payload) => {
      commit('saveSelectJobMeta', payload);
    };
     
    // 触发保存搜索专题数据方法
    export const saveSpecialSubject = ({ commit }, payload) => {
      commit('saveSpecialSubject', payload);
    };
     
    // 触发保存复制元数据方法
    export const saveDuplicateJobMeta = ({ commit }, payload) => {
      commit('saveDuplicateJobMeta', payload);
    };
    这里有2种方式:
    
    // 方法一:
    export const saveDbSource = (context, payload) => {
       context.commit('saveDbSource', payload);
    };
     
    // 方法二:
    export const saveDbSource = ({ commit }, payload) => {
      commit('saveDbSource', payload);
    };
    

    第一种是通过 context上下文用来触发事件,一种是直接通过commit,为了保存数据,都需要加第二个参数payload,不然保存到vuex的数据就是空值

    4、index.js:引入相应模块,暴露出store,供vue注册后全局使用

    import Vue from 'vue';
    import Vuex from 'vuex';
    import state from './state';
    import * as actions from './actions';
    import * as mutations from './mutations';
     
    Vue.use(Vuex);
     
    export default new Vuex.Store({
      state,
      actions,
      mutations
    });
    

    5、main.js中引入index.js

    // 引入vuex-store
    import store from './store/index';
     
    new Vue({
      el: '#app',
      router,
      store,
      render: h => h(App)
    });
    

    6、保存数据

    import { mapActions } from 'vuex';
     
    // 2种方式
     
    // 方法一(dispatch)
    this.$store.dispatch('saveDbSource', this.DbSource);
     
    // 方法二(映射)
    // 1、通过methods方法添加映射关系 
    methods: {
        ...mapActions(['saveDbSource'])
      }
     // 2、使用
    this.saveDbSource
    

    这里也有2种保存数据的方法,第一种就是直接操作方法,通过disptach派发给actions,让actions去触发

    第二种就是通过在methods中添加映射关系,数组方式,意味着我们可以在数组中写多个方法(这里数组中的每一个方法名是actions.js文件中所定义的方法名),然后在需要使用的地方直接this.方法名即可。当然,也可以直接绑定给html中的某个事件。

    值的注意的是,避免和methods中自己定义的其他方法的名字冲突

    7、获取数据

    import { mapState } from 'vuex';
     
    computed: {
        ...mapState(['DbSource']),
    },
    watch: {
        DbSource(currVal) {
            // 监听mapState中的变量,当数据变化(有值、值改变等),
            // 保证能拿到完整的数据,不至于存在初始化没有数据的问题,然后可以赋给本组件data中的变量
          this.currVal = currVal;
        }
    }
    

    通过计算属性,当数据发生改变,我们可以保证拿到的是响应过后的数据,也是数组形式,意味着我们可以拿到多组数据,这里数组中的数据也是state.js中定义的变量

    使用的时候,可以直接通过this.变量名拿到,例如本例中的 this.DbSource,我们可以把它赋给我们自定义的变量,也可以直接使用

    值的注意的是,避免和data中自己定义的其他变量的名字冲突

    至此,我们就完成了vuex的保存以及获取数据,希望对你有所帮助。

    当然,我们需要把一vuex中的一组数据过滤,其他组件都共用过滤后的数据,这种情况大家可能会用到getters,这里我就不多赘述了,有兴趣的小伙伴可以自己了解一下。

    附上vuex的运行过程,官网的图片:组件派发任务到actions,actions触发mutations中的方法,然后mutations来改变state中的数据,数据变更后响应推送给组件,组件重新渲染

    在这里插入图片描述
    我坦白,我是抄袭狗!

  • 相关阅读:
    ASP.NET Core 中文文档 第四章 MVC(3.2)Razor 语法参考
    ASP.NET Core 中文文档 第四章 MVC(3.1)视图概述
    ASP.NET Core 中文文档 第四章 MVC(2.3)格式化响应数据
    ASP.NET Core 中文文档 第四章 MVC(2.2)模型验证
    ASP.NET Core 中文文档 第四章 MVC(2.1)模型绑定
    ASP.NET Core 中文文档 第四章 MVC(01)ASP.NET Core MVC 概览
    mysql 解除正在死锁的状态
    基于原生JS的jsonp方法的实现
    HTML 如何显示英文单、双引号
    win2008 r2 服务器php+mysql+sqlserver2008运行环境配置(从安装、优化、安全等)
  • 原文地址:https://www.cnblogs.com/wjw1014/p/13121897.html
Copyright © 2020-2023  润新知