[TOC]
# vuex
Vuex 是一個專為 Vue.js 應用程序開發的**狀態管理模式**。它采用集中式存儲管理應用的所有組件的狀態,并以相應的規則保證狀態以一種可預測的方式發生變化
*****
```js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
// state存放數據
state:{num:0,},
// getters對state中的數據做處理,相當于computed(getters是全局的)
getters :{},
// mutations做同步操作,(定時器,axios都不可使用),相當于組件中的methods
mutations :{},
// actions做異步操作,實際修改state狀態值的還是mutations
actions :{},
// 主模塊
modules: {
}
})
```
## 1.state
state存放Vuex的數據,相當于Vue中的data
>index.js
```
state:{num:0,}
```
>demo1目錄 ,獲取vuex中的state值
```HTML
<template>
<div>
//綁定,方法一
<h2>兄弟組件1 + {{this.$store.state.num}}</h2>
//方法二
<h2>兄弟組件1 + {{$store.state.num}} </h2>
</div>
</template>
```
## 2.getters
getters對state中的數據做處理,相當于computed(但getters是全局的)
>index.js目錄
```js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
// state存放數據
state:{num:0,},
// getters對state中的數據做處理,相當于computed(getters是全局的)
getters :{
// state作為實參傳入
getNum(state){
return state.num;
},
},
// mutations做同步操作,(定時器,axios都不可使用),相當于組件中的methods
mutations :{},
// actions做異步操作,實際修改state狀態值的還是mutations
actions :{},
// 主模塊
modules: {
}
})
```
>demo2目錄,獲取getters中的值
```
<template>
<div>
//綁定
<h2>兄弟組件2 + {{getNum}}</h2>
//方法二
<h2>兄弟組件1 + {{$store.getters.getNum}}</h2>
</div>
</template>
<script>
export default {
// 可在store中的getters屬性中寫
computed:{
// 1.方法一
computed: {
getNum(){
return this.$store.getters.getNum;
}
};
</script>
```
## 3.mutations
更改 Vuex 的 store 中的狀態的唯一方法是提交 mutation,每個 mutation 都有一個字符串的**事件類型 (type)**和 一個**回調函數 (handler)**。這個回調函數就是我們實際進行狀態更改的地方,并且它會接受 state 作為第一個參數。**只能做同步操作**
```js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
// state存放數據
state:{num:0,},
// getters對state中的數據做處理,相當于computed(getters是全局的)
getters :{
// state作為實參傳入
getNum(state){
return state.num;
},
},
// mutations做同步操作,(定時器,axios都不可使用),相當于組件中的methods
mutations :{// 方法
// payload,形參,如果組件在commit時傳參使用,組件不傳參則為undefined,可寫可不寫
increase(state,payload){
state.num += payload ? payload : 1 ;
},
// 累減
decrease(state){
state.num--;
},},
// actions做異步操作,實際修改state狀態值的還是mutations
actions :{},
// 主模塊
modules: {
}
})
```
>btn目錄,同步累加
```
<template>
<div>
<!-- <button @click="$store.state.num++">點擊 + 1</button> -->
<!-- 以上寫法看似頁面值發生了改變,實際num的值一直為0,修改state值唯一方式是commit一個mutation方法 -->
<!-- 寫法一 -->
<!-- <button @click="addFn">點擊 + 1</button> -->
<!-- 寫法二 -->
<button @click="$store.commit('increase',2)">點擊 累加</button>
</div>
</template>
<script>
export defalut {
methods:{
addFn() {
// 使用commit調用mutations的中的increase方法
// 傳參的話,使用payload,不傳參數為undefined
// this.$store.commit('increase',2);
this.$store.commit("increase");
},
}
}
</script>
```
## 4.actions
Action 類似于 mutation,不同在于:
* Action 提交的是 mutation,而不是直接變更狀態。
* Action 可以包含任意異步操作。Action 函數接受一個與 store 實例具有相同方法和屬性的 context 對象,因此你可以調用`context.commit`提交一個 mutation,或者通過`context.state`和`context.getters`來獲取 state 和 getters
```js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
// state存放數據
state:{num:0,},
// getters對state中的數據做處理,相當于computed(getters是全局的)
getters :{
// state作為實參傳入
getNum(state){
return state.num;
},
},
// mutations做同步操作,(定時器,axios都不可使用),相當于組件中的methods
mutations :{// 方法
// payload,形參,如果組件在commit時傳參使用,組件不傳參則為undefined,可寫可不寫
increase(state,payload){
state.num += payload ? payload : 1 ;
},
// 累減
decrease(state){
state.num--;
},},
// actions做異步操作,實際修改state狀態值的還是mutations
actions :{
// 異步操作,1秒后再減1
decreaseAsync(context){
context.commit('decrease');
}
},
// 主模塊
modules: {
}
})
```
>btn目錄,延期一秒后 -1(異步操作)
```
<template>
<div>
<!-- 隔1秒后再進行減1 -->
<!-- 寫法一 -->
<button @click="reduce" >點擊-1</button>
<!-- 寫法二 -->
<button @click='$store.dispatch("decreaseAsync")'> 點擊 -1</button>
</div>
</template>
<script>
export defalut {
methods:{
reduce(){
// $store.dispatch觸發store中的actions
this.$store.dispatch('decreaseAsync');
}
}
}
</script>
```
## 5.modules
由于使用單一狀態樹,應用的所有狀態會集中到一個比較大的對象。當應用變得非常復雜時,store 對象就有可能變得相當臃腫。
為了解決以上問題,Vuex 允許我們將 store 分割成**模塊(module)**。每個模塊擁有自己的 state、mutation、action、getter、甚至是嵌套子模塊——從上至下進行同樣方式的分割。
*****
在子模塊中要打開命名空間,這樣便于可使用點語法獲取到子模塊的內容` namespace:true`
## 6.輔助函數
輔助函數有4個,分別是mapState,mapGetters,mapMutations,mapActions。需現在使用的組件中引入輔助函數,在component中使用的是mapState,mapGetters,在methods中使用的是mapMutations,mapActions。
>demo1目錄
```
<template>
<div>
<h2>兄弟組件1 + {{num}}</h2>
<h2>兄弟組件1 + {{getNum}}</h2>
</div>
</template>
<script>
// 映射到store中
import {mapState,mapGetters} } from 'vuex'
export default {
//使用mapState方法
// 使用擴展運算符取出state中的參數對象
...mapState(['num']),
...mapGetters(["getNum"]),
},
};
</script>
```
>btn目錄
```
<template>
<div>
<!-- 輔助函數寫法-->
<button @click="increase(2)">點擊 + 1</button>
<button @click="decreaseAsync()">點擊延遲 - 1</button>
</template>
<script>
import {mapMutations , mapActions} from 'vuex'
export default {
methods: {
// 輔助函數寫法
...mapMutations(['increase']),
...mapActions(['decreaseAsync']),
},
};
</script>
```
- Javascript
- 組成
- Web API
- 初步認識DOM
- 經典案例 (使用獲取id的方法)
- 節點和元素
- 經典案例 (使用獲取節點和元素的方法)
- 函數
- 作用域鏈
- Array對象的方法
- String對象的方法
- 綁定事件
- 事件委托
- 邏輯運算
- js高級(面向對象、)
- 基本知識
- 數據類型
- 基本包裝類型的使用
- 定義變量的區別
- JavaScript對象的動態特性
- 關鍵字in
- 關鍵字delete
- 運算符
- 創建對象的方式
- 回調函數
- 高階函數
- 構造器屬性
- this指向
- hasOwnProperty屬性
- 私有成員和特權方法
- 面向對象和面向過程的基礎
- 異常捕獲
- 構造函數和普通函數的區別
- 構造函數的補充
- 原型
- 原型圖
- 獲取原型對象的方法
- 原型對象的訪問和設置
- 判斷某個對象是否是指定實例對象的原型對象
- constructor
- isPrototypeOf
- instanceof
- 檢測對象是公有還是私有
- 核心概念
- 繼承
- 混入式繼承
- 原型式繼承
- 原型鏈繼承
- 借用構造函數繼承(call繼承,經典繼承)
- 組合式繼承(推薦)
- class繼承
- __ proto __屬性
- call方法和apply方法
- Fuction相關知識
- 創建函數的方式
- eval函數
- 淺拷貝和深拷貝
- 淺拷貝
- 深拷貝
- Object相關知識
- Object原型屬性和方法
- Object靜態成員對象
- 案例
- 數組去重
- 閉包
- 語法
- DOM事件和閉包
- 定時器和閉包
- 即使對象初始化
- 閉包的變形
- 設計模式
- 單例模式
- 發布訂閱模式(觀察者模式)
- 工廠模式
- 命名空間模式
- 同步和異步
- 垃圾回收機制
- get和set
- JQuery
- 動畫方法
- 事件
- 方法
- 節點
- 方法er
- HTML + CSS
- 經驗
- flex布局
- px,em ,rem區別
- 清除浮動
- Less
- UI框架
- 一.Bootstrap框架
- 常用類名
- 二 .Animate.css
- 三.WOW.JS
- 四.scrollReveal.js
- 五.zepto框架
- zepto選擇器
- 滑動事件
- tap觸摸事件
- zepto動畫
- 六,swipe框架
- 分頁器
- 左右按鈕和循環輪播
- 底部滾動和輪播方向
- 自動播放和切換效果
- 移入移除事件
- swipe結合animate.css
- 總結
- 滾滾屏
- 自動化構建工具
- 1.gulp
- 使用gulp編譯less成css,并最終壓縮css
- 壓縮css
- 合并和壓縮js
- 壓縮圖片
- 編寫server服務
- 包管理器
- 介紹
- brew
- npm十全大補湯
- ES6
- class類
- class類的使用
- class類的繼承結構
- let 和const
- 結構語法
- 模板字符串
- 化簡寫法
- 形參的默認值
- ...rest參數
- rest剩余參數
- 擴展參數
- 正則表達式
- 創建正則表達式的方式
- 構造函數
- 字面量的方式
- 其他(修飾符)
- 判斷是否匹配成功
- 正則表達式案例
- 常見的匹配原則
- 驗證密碼長度
- 表單驗證
- 正則提取
- 正則替換
- vue
- 插值操作
- Mustache語法
- 過濾器
- 綁定相關知識
- 綁定對象
- 單向綁定
- 雙向綁定
- 綁定屬性
- 動態綁定style
- 綁定事件
- 補充
- 綁定語法
- 基礎
- vue介紹
- MVVM
- 計算屬性
- 指令
- v-cloak
- 顯示和隱藏
- 循環
- 自定義指令
- 本地緩存
- localStorage
- sessionStorage
- 對象劫持
- 組件
- 局部組件
- 父子組件
- 全局組件
- 組件訪問實例數據
- 父傳子
- 子傳父
- 兄弟傳兄弟
- 插槽
- methods,computed,watch的區別
- Vue.observable()
- vue.config.js配置
- 修飾符
- .sync修飾符
- $attrs和$listeners
- Node.js
- 使用Node執行js代碼的兩種方式
- 交互模式
- 解釋js文件
- http模板
- request對象的使用
- express框架
- 安裝
- post
- 獲取請求參數
- post返回頁面
- 重定向到別的接口
- get
- 返回頁面
- get獲取請求參數
- 請求靜態資源
- 熱重啟
- Ajax
- 請求方式
- get請求
- post請求
- jQuery中的ajax方法
- JQuery中的get請求
- jQuery中的post請求
- 微信小程序
- 認識
- 引入樣式的方式
- 綁定數據
- 小程序組件
- scroll - view 可滾動視圖區域
- 發起請求
- template模板
- rich-text
- web-view
- open-data
- checkbox組件
- label組件
- radio組件
- picker組件
- swiper組件
- Git
- 跨域
- 左側固定,右側自適應
- vuex
- 如何解決vuex頁面刷新數據丟失問題
- 數據結構
- 樹
- 問題累積
- Axios
- 前端路由