zoukankan      html  css  js  c++  java
  • 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;
         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中的函数

  • 相关阅读:
    PAT乙级1008. 数组元素循环右移问题 (20)
    PAT乙级1007. 素数对猜想 (20)
    PAT乙级1006. 换个格式输出整数 (15)
    ubuntu mate 开机自动启动ssh服务
    ubuntu 修改网卡名称
    ubuntu 绑定固定ip
    ubuntu sogou 輸入法無法輸入文字,解決辦法【转载】
    select()函数小结【转载】
    listen函数小结
    python学习过程二(《python核心编程》第三章)
  • 原文地址:https://www.cnblogs.com/dianzan/p/12400963.html
Copyright © 2011-2022 走看看