vue 3.0 项目搭建移动端 (九) vuex的使用

先创建store数据仓库

import Vue from 'vue'
import Vuex from 'vuex'

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



Vue.use(Vuex)

export default new Vuex.Store({
    modules: {
        // user,
    },
    state: {},
    mutations: {},
    actions: {},
    getters
})

 

 然后在main.js中引入并注册

import store from './store'

 

 注册

 使用vuex

 import {mapState,mapMutations} from 'vuex'

在.vue组件中定义一个对象

computed:{
  ...mapState([        //mapState本是一个函数,在里面写一个数组,记得加...
  ‘num’ , //存的数据
  ‘id’
  ])
}

tore.state.num映射this.num这个this 很重要,这个映射直接映射到当前Vue的this对象上

然后就可以不用$store.state.num引用了,直接插值

{{num}}{{id}}   //引用多个

 

 

 https://vuex.vuejs.org/zh/guide/state.html

let mapState = {num:0,id:111}
let computed = {...mapState}
console.log(computed )
// 在单独构建的版本中辅助函数为 Vuex.mapState
import { mapState } from 'vuex'

export default {
  // ...
  computed: mapState({
    // 箭头函数可使代码更简练
    count: state => state.count,

    // 传字符串参数 'count' 等同于 `state => state.count`
    countAlias: 'count',

    // 为了能够使用 `this` 获取局部状态,必须使用常规函数
    countPlusLocalState (state) {
      return state.count + this.localCount
    }
  })
}

当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组。

computed: mapState([
  // 映射 this.count 为 store.state.count
  'count'
])

mapState 函数返回的是一个对象。我们如何将它与局部计算属性混合使用呢?通常,我们需要使用一个工具函数将多个对象合并为一个,以使我们可以将最终对象传给 computed 属性。但是自从有了对象展开运算符,我们可以极大地简化写法:

computed: {
  localComputed () { /* ... */ },
  // 使用对象展开运算符将此对象混入到外部对象中
  ...mapState({
    // ...
  })
}
<template>
  <div class="home">
    <!-- <button class="btn" @click="$store.commit('add',1)">点击加</button>
    <button class="btn"  @click="$store.commit('reduce',2)">点击减</button> -->
    <button class="btn" @click="add(2)">点击加</button>
    <button class="btn" @click="reduce(1)">点击减</button>
    <div>stor里面的count:{{count}}</div>
  </div>
</template>

<script>
  import {mapState,mapMutations} from 'vuex'
  export default {
    name: 'home',
    data() {
      return {}
     },
    created() {},
    computed: {
      // 方法一:--------------------------------------
      // count(){
      //   return this.$store.state.count
      // },

      //方法二:mapState-------------------------------
      //写法1:(mapState中用对象的形式获取)
      // ...mapState({
      //   count:state=>state.count
      // })
      // 写法2:mapState中用数组的形式获取):
      ...mapState(["count"])
    },
    methods: {
      //方法三:mapMutations -------------------------- 此方法只能写在 methods里面,在其他地方调用即可
      ...mapMutations(['add', 'reduce'])
    }
  }
</script>
<style scoped="scoped">
  .btn {
    display: block;
    width: 90%;
    height: 45px;
    margin: 0 auto;
    margin-bottom: 30px;
  }
</style>

其它例子

mapState使用:

import {mapState} from 'vuex'
      computed:{
        ...mapState({
      // car:'car',//最简单的写法
      car:state=>state.car//也可以这样写
                    })
      },
      //如果要监听car的数据改变,可以结合watch来使用。methods方法中也可以通过this.car访问到。

mapMutations使用:

import {mapMutations} from "vuex";
  methods: {
    ...mapMutations(["addToCar"]),//映射成this.addToCar
    cz() {
      this.addToCar("change");
    }
  },

其他使用方式了

<template>
  <div id="example">
    <button @click="decrement">-</button>
    {{count}}
    {{dataCount}}
    <button @click="increment">+</button>
    <div>{{sex}}</div>
    <div>{{from}}</div>
    <div>{{myCmpted}}</div>
  </div>
</template>
<script>
import { mapState } from 'vuex'
export default {
  data () {
    return {
      str: '国籍',
      dataCount: this.$store.state.count
    }
  },
  computed: mapState({
    count: 'count', // 第一种写法
    sex: (state) => state.sex, // 第二种写法
    from: function (state) { // 用普通函数this指向vue实例,要注意
      return this.str + ':' + state.from
    },
    // 注意下面的写法看起来和上面相同,事实上箭头函数的this指针并没有指向vue实例,因此不要滥用箭头函数
    // from: (state) => this.str + ':' + state.from
    myCmpted: function () {
      // 这里不需要state,测试一下computed的原有用法
      return '测试' + this.str
    }
  }),
  methods: {
    increment () {
      this.$store.commit('increment')
    },
    decrement () {
      this.$store.commit('decrement')
    }
  },
  created () {
    // 写个定时器,发现computed依旧保持了只要内部有相关属性发生改变不管是当前实例data中的改变,还是vuex中的值改变都会触发dom和值更新
    setTimeout(() => {
      this.str = '国家'
    }, 1000)
  }
}
</script>

 https://blog.csdn.net/dkr380205984/article/details/82185740

实例

index.js

import Vue from 'vue'
import Vuex from 'vuex'

import user from './modules/user'
// import getters from './getters'



Vue.use(Vuex)

export default new Vuex.Store({
    modules: {
        user,
    },
    state: {},
    mutations: {},
    actions: {},
    // getters  //其他数据这里可以自定义
})

 

 user.js

import Vue from 'vue'
// import {getUserInfo, getLogin} from "../../api/login";
import session from '../sessionStorage'
// import local from '../localStorage'
// import {getToken,removeToken} from "../../utils/auth";

const user = {
    state: {
        // token: getToken(),
        device: 'android',
        wxUserInfo: session.$getSessionStorageByName('wxUserInfo') || '',
        aliUserInfo: session.$getSessionStorageByName('aliUserInfo') || '',
        info: session.$getSessionStorageByName('userInfo') || {}
    },

    mutations: {
        SET_DEVICE: (state, device) => {
            state.device = device
        },
        // SET_TOKEN: (state, token) => {
        //     state.token = token
        // },
    },

    actions: {
        // 登录
        // Login({commit}, userInfo) {
        //     userInfo.username = userInfo.username.trim()
        //     return new Promise((resolve, reject) => {
        //         getLogin(userInfo).then(res => {
        //             if (res.status === 1) {
        //                 session.$setSessionStorageByName('userId', res.data.id)
        //             }

        //             resolve(res)
        //         }).catch(error => {
        //             reject(error)
        //         })
        //     })
        // },

    }
}

export default user

使用sotre中的函数

 

posted @ 2020-03-03 10:36  ThisCall  阅读(5691)  评论(1编辑  收藏  举报