zoukankan      html  css  js  c++  java
  • vuex的使用

    vuex说白了就是vue中的数据管理仓库,为开发者的数据操作,例如购物车类似的操作,带来了极大的便捷,最近也在使用vuex整理了如下的学习心得,希望能帮大家解决问题.

    vuex的基础使用

    1.下载好vue.js和vuex.js文件,并引入到html页面中去

    2.对vuex的基础配置

    const store = new Vuex.Store({ 
            state:{ 
                count:0
            },
            mutations:{
                increment:function (state) {
                    state.count++;
                },
                descrement:function (state) {
                    state.count--
                }
            }
        });

    store是新创建vuex中对的store对象

    state是专门来管理数据的仓库

    mutations是用来处理各种判断,异步请求,流程控制,也就是说要干什么事情,在这里监听了两个action名,只有接受到相对应的action名,就会触发函数,对state中的count进行操作

    3.html代码

    <div id="app">
        count的值:{{count}}
        <p><button @click="increment">count加1</button></p>
        <p><button @click="descrement">count减1</button></p>
        <p><button @click="checkAsyncAdd">延迟加1</button></p>
        <p><button @click="checkAsyncOdd">延迟减1</button></p>
        <p></p>
    </div>

    每一个按钮绑定一个事件,实现对count的改变

    4.vue实例中代码的编写

        new Vue({
            computed:{
                count(){
                    return store.state.count
                }
            },
            methods:{
                increment:function () {
                    store.commit("increment")
                },
                descrement:function () {
                    store.commit("descrement")
                },
                checkAsyncAdd:function () {
                   setTimeout(function () {
                       store.commit("increment")
                   },1000)
                },
                checkAsyncOdd:function () {
                    setTimeout(function () {
                        store.commit("descrement")
                    },1000)
                }
            }
        }).$mount("#app")

    使用计算属性来实时元素标签更新对state.count中的引用,(因为state是一个对象,那么count就是其属性,所以在vuex的store中count变化,由于是地址引用,那么count就在全局进行变化)

    increment函数执行通过store中的commit属性发送"increment"action名,就可以实现了state中count的改变,其他的方法类似

    在vue项目中使用vuex

    1没有安装vuex就使用cnpm/npm i vuex -D  安装好vuex

    2.创建store.js文件(随便创建在哪个目录下,我推荐跟main.js在同一目录下),设置如下内容

    import Vue from 'vue'
    import Vuex from 'vuex'
    Vue.use(Vuex); //全局使用vuex
    const state = { //定义数据仓
      count :10
    };
    const mutations = { //处理数据(状态)变化
      ydb(state){  //"ydb"和"ydb1"都是action名
        state.count++;
      },
      ydb1(state){
        state.count--;
      }
    };
    const actions= {
      increment:({commit})=>{  //"increment"是接受前端页面传过来的事件名,下面的也是
          commit("ydb") //发送actions名,下面类似
      },
      descrement:({commit})=>{
        console.log(arguments);
        commit("ydb1");
      },
      checkOdd:({commit,state})=>{
        if(state.count%2===0){
          commit("ydb")
        }
      },
      checkAsync:({commit})=>{
       new Promise((resolve)=>{
         setTimeout(function () {
           commit("ydb");
           resolve();
         },1000)
       })
      }
    };
    const getters = { //设置仓库数去获取对象,方便页面获取仓库中的值
      count:function () {
        return state.count
      }
    };
    export default new Vuex.Store({ //导出一个新的vuex.Store对象
      state,
      actions,
      mutations,
      getters
      //并返回定义好的各种功能对象,注意名称必须按照我这样子写,如state写成states会报错
    })

    3 在项目主文件main.js中引入vuex

    import Vue from 'vue'
    import App from './App.vue'
    //import Loading from './components/loading/index'
    import store from  './store' //引入创建好的store对象
    //Vue.use(Loading);
    new Vue({
      store,
      el: '#app',
      render: h => h(App)
    })

    4.APP.vue文件中编写如下代码

    <template>
      <div id="app">
       <p @click="get">welcome to 蚂蝗俱乐部</p>
        <Loading ></Loading>
        {{count}}
        <p><button @click="increment">count加1</button></p>
        <p><button @click="descrement">count减1</button></p>
        <p><button @click="checkOdd">偶数才能点击+</button></p>
        <p><button @click="checkAsync">点击异步+</button></p>
      </div>
    </template>
    
    <script>
    import {mapGetters,mapActions} from "vuex" //通过es6中的语法,对vuex进行解构赋值,注意名称必须这样写 关于es6的更多介绍,请查看我其他随笔
    export default {
      name: 'app',
      data () {
        return {}
      },
      computed: { //第一种写法:获取在main.js中全局使用store中state中count的值
        ...mapGetters([
          'count'
        ])
      },
    //  computed:mapGetters( //第二种写法:作用同上
    //      ['count']
    //  ),
      methods: {
        ...mapActions([ //第一种写法:向store对象中的actions发送事件名
          'increment', 'descrement', "checkOdd", "checkAsync"
        ]),
        get(){
          alert(1)
        }
      },
    //  methods:mapActions([ //第二种写法:向store对象中的actions发送事件名
    //      'increment', 'descrement', "checkOdd", "checkAsync"
    //    ]),
      
    }
    </script>
    <style>
    </style>

    vuex模块化

    个人感觉使用vue项目中使用vuex的方法,所有东西都在store.js中,这样页面显的比较代码拥堵,在官网中,作者提供了vuex模块化的思路,自己也把上面的代码改造了一下,实现了一个小的demo

    1.在vue项目中创建store文件夹,创建如下文件

    actions.js相当于之前的actions对象,用来监听不同的事件名来发送不同的actions名

    import * as types from './types' //导入actions名集合
    import state from './module'//导入数据仓库
    export default { //到处一个发送actions名的对象
      increment:({commit})=>{ //"increment"为前端页面在mapActions中传递过来的事件名,监听到就发送对应的actions名,下面的类似
        commit(types.YDB);
      },
      descrement:({commit})=>{
        commit(types.YDB1);
      },
      checkOdd:({commit})=>{
        if(state.count%2===0){
          commit(types.YDB);
        }
    
      },
      checkAsync:({commit})=>{
        new Promise((resovle)=>{
          setTimeout(function () {
            commit(types.YDB);
            resovle()
          },1000)
        })
    
      }
    }
    

      

    getters.js相当于之前的getters对象

    export default { //返回数据仓库中的count值
      count:(state)=>{
        return state.count
      }
    }
    

      

    index就是主文件,负责到处vuex所必须要的配置好之后的对象

    import Vue from 'vue'
    import Vuex from 'vuex'
    import mutations from './mutations'
    import actions from './actions'
    Vue.use(Vuex); //全局使用vuex
    export  default new Vuex.Store({
      actions,   
      modules:{
        mutations //这里的mutations里面包含了多个对象,使用modules可以转化格式导出
      }
    })
    //导出配置好的vuex对象

    module.js相当于之前的state对象,用来存放数据,就是一个数据仓库

    const state = {
      count:20
    };
    export default state //导出数据仓库
    

      

    types.js其实在官方中是没有的,但是大多数人的项目中是用的,一般用来放置一些acction名集合

    export const YDB = "YDB";
    export const YDB1 = "YDB1";
    

      如上所示,已经成功的把vuex模块化,这样不同的操作,只需要找到不同的js文件就可以进行处理,更符合模块化开发

    其中main.js中的内容如下

    import Vue from 'vue'
    import App from './App.vue'
    import Loading from './components/loading/index'
    import store from  './store/index' //引入store文件夹中的index主文件
    Vue.use(Loading);
    new Vue({
      store, //全局使用
      el: '#app',
      render: h => h(App)
    })  


    //注 APP.vue中的代码没有发生任何改变
    累积知识点,解决每一个遇到的问题,实现从量变到质变
  • 相关阅读:
    Jam的计数法
    你已经爱我多久了
    脏话过滤
    三角恋
    栈练习3
    栈练习2
    栈练习
    高精度之乘法
    高精度之减法
    高精度之加法
  • 原文地址:https://www.cnblogs.com/jsydb/p/9240741.html
Copyright © 2011-2022 走看看