最近進入了乙個新專案組,前端框架選擇vue進行開發,資料的狀態管理選擇用vuex。本篇隨筆中的**採用vuex官網提供的購物車案例。
├── index.html
├── main.js
├── api
│ └── shop.js # 抽取出api請求
├── components
│ ├── cart.vue # 購物車元件
│ └── productlist.vue # 產品元件
│ └── store
├── index.js # 我們組裝模組並匯出 store 的地方
├── actions.js # 根級別的 action
├── mutations.js # 根級別的 mutation
├── mutation-types.js # mutation事件型別
└── modules
├── cart.js # 購物車模組
└── products.js # 產品模組
vuex有五個核心概念,分別是:state、getter、mutation、action和module
由於vuex的狀態儲存是響應式的,所以從store例項中讀取狀態最簡單的方式是在計算屬性中返回某個狀態
const state = ,]
}export default
import store from '../store/index'
當乙個元件需要獲取多個狀態時,可以通過mapstate
輔助函式幫助我們生成計算屬性
//改造productlist.vue
import from 'vuex'
export default */
})}
如果計算屬性名和state子節點名字相同,也可以傳遞乙個字串陣列
computed: mapstate([
// 對映 this.all 為 store.state.all
'all'
])
如果想要與區域性計算屬性混合使用,則可以通過物件展開運算子做到這一點
computed: ,
// 使用物件展開運算子將此物件混入到外部物件中
...mapstate()
}
getter相當於store例項的計算屬性,getter的返回值會根據它的依賴被快取起來,只有依賴發生改變,才會重新計算。
getter接受state作為第乙個引數,其他的getter作為第二個引數,同時也會暴露為store.getters物件
const getters =
export default
computed:
}
同樣,getter也有輔助函式mapgetters
,它的作用是將store中的getter對映到區域性計算屬性,使用方法與mapstate
一樣。
更改 vuex 的 store 中的狀態的唯一方法是提交 mutation。
每個 mutation 都有乙個字串的 事件型別 (type) 和 乙個**函式(handler)。這個**函式就是我們實際進行狀態更改的地方,並且它會接受 state 作為第乙個引數,通過store.commit可以傳遞第二個引數,也就是載荷(payload)
// project.js
// 可以使用常量代替mutation事件型別
const mutations = ) ,
[types.add_to_cart] (state, )
}// actions
const actions = ) )
})}}
// mutation-types.js
export const add_to_cart = 'add_to_cart'
export const receive_products = 'receive_products'
mutation也有輔助函式mapmutations
import from 'vuex'
export default )
}}
mutation必須是同步函式,如果想包含非同步操作,那麼必須要使用action
action和mutation有兩點不同:
actions: )
}
action通過store.dispatch
方法觸發
store.dispatch('getallproducts')
在元件中分發action,我們可以使用mapactions
輔助函式將元件的methods對映為store.dispatch
呼叫,使用方法同mapmutations
。
由於使用單一狀態樹,應用的所有狀態會集中到乙個比較大的物件。當應用變得非常複雜時,store 物件就有可能變得相當臃腫。
為了解決以上問題,vuex 允許我們將 store 分割成模組(module)。每個模組擁有自己的 state、mutation、action、getter、甚至是巢狀子模組——從上至下進行同樣方式的分割:
const modulea = ,
mutations: ,
actions: ,
getters:
}const moduleb = ,
mutations: ,
actions:
}const store = new vuex.store(
})store.state.a // -> modulea 的狀態
store.state.b // -> moduleb 的狀態
預設情況下,模組內部的action、mutation、getter是註冊在全域性命名空間的,如果需要模組被更好的封裝,那麼可以通過新增namespaced: true
的方式使其成為命名空間模組
啟用了命名空間的 getter 和 action 會收到區域性化的getter
,dispatch
和commit
。
vue 2 0 的專案配置
vue 2.0 的專案配置 1 vue腳手架指的是vue cli,它是乙個專門為單頁面應用快速搭建繁雜的腳手架,它可以輕鬆的建立新的應用程式而且可用於自動生成vue和webpack的專案模板 2 搭建步驟 全域性安裝 cnpm install vue cli g vue v 檢測版本 例項化乙個專案...
vue2 0入門及實戰開發 一
元件化 頁面 動態效果 樣式 new vue 原樣輸出裡面的內容 package.json webpack.config.js isshow style height 100px background color green isred?red green 1111 export default r...
vue2 0入門及實戰開發 四
過濾器 獲取dom元素 請輸入內容 text name v model text 顯示 export default filters 建立全域性過濾器 vue.filter myfilter function value 注意 當全域性過濾器和元件內過濾器重名的時候,是以元件內過濾器為有效的 獲取d...