1、元件下載
vue 與vuex的版本對應關係:Vue 2 匹配的 Vuex 3
Vue 3 匹配的 Vuex 4
Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式 + 庫。它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。
官方網站:https://vuex.vuejs.org/zh/
1 // npm 2 npm install vuex@next --save 3 4 // yarn 5 yarn add vuex@next --save
2、專案中定義及配置
在src目錄下新增store目錄,建立index.js檔案,內容如下
1 // 1. 匯入所需的包 2 import Vue from 'vue' 3 import Vuex from 'vuex' 4 // 2. 將Vuex註冊為Vue的外掛 5 Vue.use(Vuex) 6 // 3. 建立 store 例項物件 7 const store = new Vuex.Store({ 8 // 配置vuex 9 strict: true, // 開啟嚴格模式,防止小白在元件中使用的時候直接修改state資料 10 // state 用於儲存資料(儲存狀態) (vuex狀態管理) 11 state: { 12 sex: 23, 13 uname: 'badWoman', 14 list: [ 15 { id: 1, name: '吃飯', isDone: true }, 16 { id: 2, name: '睡覺', isDone: false }, 17 { id: 3, name: '聽歌', isDone: true } 18 ] 19 }, 20 // mutations 是 vuex 中"唯一"可以修改 state 資料的方法, 不支援非同步更新,只能放同步程式碼 21 mutations: { 22 abc (state, n) { 23 state.sex = n 24 } 25 }, 26 // actions 裡面放非同步方法 27 actions: { 28 newSex (store, n) { 29 setTimeout(() => { 30 store.commit('abc', n) // 只要是修改state中內容, 都透過mutations中的方法進行操作 31 }, 3000) 32 } 33 }, 34 // getters 是vuex中的計算屬性(和元件中的計算屬性意義一樣,但是不支援set修改) 35 // 為了方便獲取state中的資料;外掛作者會給每個計算屬性方法,傳遞一個 state 引數 36 getters: { 37 ccc (state) { 38 return state.sex * state.sex 39 }, 40 all (state) { 41 return state.list.every(item => item.isDone === true) 42 } 43 } 44 }) 45 // 4. 匯出 store 物件 46 export default store
main.js
1 import Vue from 'vue' 2 import App from './App.vue' 3 // 匯入定義的store目錄下的index.js檔案 4 // import store from '@/store/index.js' // 如果匯入某個目錄下的index檔案, 則可以省略index 5 import store from '@/store' 6 Vue.config.productionTip = false 7 8 new Vue({ 9 store, // 將匯入的store新增到vue例項 10 render: h => h(App) 11 }).$mount('#app')
元件AnyOne.vue
1 <template> 2 <div> 3 <h2>隨便一個元件-1</h2> 4 <!-- 使用vuex中狀態, state中的uname --> 5 <p>{{ $store.state.uname }}</p> 6 <!-- 使用vuex中狀態, state中的sex --> 7 <p>{{ $store.state.sex }}</p> 8 <!-- 使用vuex中配置的計算屬性 --> 9 <p>{{ $store.getters.ccc }}</p> 10 <p>{{ $store.getters.all }}</p> 11 12 <!-- 呼叫mutations中定義的修改state的方法abc, 並傳遞引數5000 --> 13 <button @click="$store.commit('abc', 5000)">更新sex</button> 14 <br /> 15 <!-- 呼叫actions中定義的非同步方法newSex,並傳遞引數20 --> 16 <button @click="$store.dispatch('newSex', 20)">3s後更新sex</button> 17 </div> 18 </template> 19 20 <script> 21 export default {} 22 </script> 23 <style lang="less" scoped></style>
元件AnyTwo.vue
1 <template> 2 <div> 3 <h2>隨便一個元件-2</h2> 4 <!-- 使用計算屬性 --> 5 <!-- <P>{{ sex }}</P> --> 6 <p>{{ uname }}</p> 7 <P>{{ nianLing }}</P> 8 <P>{{ uname }}</P> 9 <P>{{ ccc }}</P> 10 <P>{{ all }}</P> 11 <button @click="abc(100)">更新年齡</button> 12 <br /> 13 <button @click="newSex(200)">三秒後更新年齡</button> 14 </div> 15 </template> 16 17 <script> 18 // 匯入vuex中提供的一些方法 19 import { mapState, mapGetters, mapMutations, mapActions } from 'vuex' 20 export default { 21 // data () { 22 // return { 23 // sex: 1777 24 // } 25 // }, 26 computed: { 27 // mapState提供一種簡寫方式: ...mapState() 傳想要獲取的狀態資訊, 拿到當前頁面作為計算屬性使用 28 // ...mapState(['sex', 'uname', 'list']), // 陣列寫法 29 30 // 給從state中獲取的狀態取別名,防止與當前頁面重名,作為當前頁面的計算屬性 31 ...mapState({ nianLing: 'sex', uname: 'uname', list: 'list' }), // 物件寫法, 相當於取別名, 防止與data中的變數重名 32 33 // 將vuex中的getters拿到當前頁面作為當前頁面的計算屬性 34 ...mapGetters(['ccc', 'all']) 35 }, 36 methods: { 37 // 將vuex中mutations定義的方法拿到當前頁面作為當前頁面的方法 38 ...mapMutations(['abc']), 39 ...mapActions(['newSex']) 40 } 41 } 42 </script> 43 <style lang="less" scoped></style>
根元件App.vue
1 <template> 2 <div> 3 <AnyOne></AnyOne> 4 <hr /> 5 <AnyTwo></AnyTwo> 6 </div> 7 </template> 8 9 <script> 10 import AnyOne from './components/AnyOne.vue' 11 import AnyTwo from './components/AnyTwo.vue' 12 export default { 13 data () { 14 return {} 15 }, 16 components: { 17 AnyOne, 18 AnyTwo 19 } 20 } 21 </script> 22 <style lang="less" scoped></style>
3、使用
4、簡化呼叫資料
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'透過vuex中的一些方法將定義的store中的內容拿到當前頁面