先創建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中的函數