摘要:使用在的單頁面應用中使用,需要使用調用插件。使用非常簡單,只需要將其注入到根實例中。想要異步地更改狀態需要使用。將映射為也支持載荷將映射為將分割為模塊。的基本使用大致如此。
使用
在 Vue 的單頁面應用中使用,需要使用Vue.use(Vuex)調用插件。
使用非常簡單,只需要將其注入到Vue根實例中。
import Vuex from "vuex"
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
count: 0
},
getter: {
doneTodos: (state, getters) => { return state.todos.filter(todo => todo.done) }
},
mutations: {
increment (state, payload) { state.count++ }
},
actions: {
addCount(context) {
// 可以包含異步操作 // context 是一個與 store 實例具有相同方法和屬性的 context 對象
}
}
})
// 注入到根實例
new Vue({
el: "#app",
store,
template: "
components: { App }
})
然后改變狀態:
this.$store.commit("increment")
Vuex 主要有四部分:
state:包含了store中存儲的各個狀態。
getter: 類似于 Vue 中的計算屬性,根據其他 getter 或 state 計算返回值。
mutation: 一組方法,是改變store中狀態的執行者。
action: 一組方法,其中可以含有異步操作。
state
Vuex 使用 state來存儲應用中需要共享的狀態。為了能讓 Vue 組件在 state更改后也隨著更改,需要基于state創建計算屬性。
const Counter = {
template:
computed: {
count () { return this.$store.state.count // count 為某個狀態 }
}
}
getters
類似于 Vue 中的 計算屬性,可以在所以來的其他 state或者 getter改變后自動改變。
每個getter方法接受 state和其他getters作為前兩個參數。
getters: {
doneTodos: (state, getters) => { return state.todos.filter(todo => todo.done) }
}
mutations
前面兩個都是狀態值本身,mutations才是改變狀態的執行者。mutations用于同步地更改狀態
// ...
mutations: {
increment (state, n) {
state.count += n
}
}
其中,第一個參數是state,后面的其他參數是發起mutation時傳入的參數。
this.$store.commit("increment", 10)
commit方法的第一個參數是要發起的mutation名稱,后面的參數均當做額外數據傳入mutation定義的方法中。
規范的發起mutation的方式如下:
store.commit({
type: "increment",
amount: 10 //這是額外的參數
})
額外的參數會封裝進一個對象,作為第二個參數傳入mutation定義的方法中。
mutations: {
increment (state, payload) {
state.count += payload.amount
}
}
actions
想要異步地更改狀態,需要使用action。action并不直接改變state,而是發起mutation。
actions: {
incrementAsync ({ commit }) {
setTimeout(() => { commit("increment") }, 1000)
}
}
發起action的方法形式和發起mutation一樣,只是換了個名字dispatch。
// 以對象形式分發
store.dispatch({
type: "incrementAsync",
amount: 10
})
action處理異步的正確使用方式
想要使用action處理異步工作很簡單,只需要將異步操作放到action中執行(如上面代碼中的setTimeout)。
要想在異步操作完成后繼續進行相應的流程操作,有兩種方式:
action返回一個 promise。
而dispatch方法的本質也就是返回相應的action的執行結果。所以dispatch也返回一個promise。
store.dispatch("actionA").then(() => {
// ...
})
利用async/await。代碼更加簡潔。
// 假設 getData() 和 getOtherData() 返回的是 Promise
actions: {
async actionA ({ commit }) {
commit("gotData", await getData())
},
async actionB ({ dispatch, commit }) {
await dispatch("actionA") // 等待 actionA 完成 commit("gotOtherData", await getOtherData())
}
}
各個功能與 Vue 組件結合
將state和getter結合進組件需要使用計算屬性:
computed: {
count () { return this.$store.state.count // 或者 return this.$store.getter.count2 }
}
將mutation和action結合進組件需要在methods中調用this.$store.commit()或者this.$store.commit():
methods: {
changeDate () { this.$store.commit("change"); }, changeDateAsync () { this.$store.commit("changeAsync"); }
}
為了簡便起見,Vuex 提供了四個方法用來方便的將這些功能結合進組件。
mapState
mapGetters
mapMutations
mapActions
示例代碼:
import { mapState, mapGetters, mapMutations, mapActions } from "vuex"
// ....
computed: {
localComputed () { / ... / },
...mapState({
// 為了能夠使用 `this` 獲取局部狀態,必須使用常規函數 count(state) { return state.count + this.localCount }
}),
...mapGetters({
getterCount(state, getters) { return state.count + this.localCount }
})
}
methods: {
...mapMutations({
add: "increment" // 將 `this.add()` 映射為`this.$store.commit("increment")` }),
...mapActions({
add: "increment" // 將 `this.add()` 映射為 `this.$store.dispatch("increment")` })
}
如果結合進組件之后不想改變名字,可以直接使用數組的方式。
methods: {
...mapActions([ "increment", // 將 `this.increment()` 映射為 `this.$store.dispatch("increment")` // `mapActions` 也支持載荷: "incrementBy" // 將 `this.incrementBy(amount)` 映射為 `this.$store.dispatch("incrementBy", amount)` ]),
}
將 store分割為模塊。
可以將應用的store分割為小模塊,每個模塊也都擁有所有的東西:state, getters, mutations, actions。
首先創建子模塊的文件:
// initial state
const state = {
added: [],
checkoutStatus: null
}
// getters
const getters = {
checkoutStatus: state => state.checkoutStatus
}
// actions
const actions = {
checkout ({ commit, state }, products) {
}
}
// mutations
const mutations = {
mutation1 (state, { id }) {
}
}
export default {
state,
getters,
actions,
mutations
}
然后在總模塊中引入:
import Vuex from "vuex"
import products from "./modules/products" //引入子模塊
Vue.use(Vuex)
export default new Vuex.Store({
modules: {
products // 添加進模塊中
}
})
其實還存在命名空間的概念,大型應用會使用。需要時查看文檔即可。Vuex的基本使用大致如此。
作者:胡不歸vac
鏈接:https://www.jianshu.com/p/aae...
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/104161.html
摘要:簡單點說,當你使用構造函數,它實際上做了這么幾件事,首先定義給實例定義一些內部屬性,之后就是綁定和的上下文對象永遠是實例上,之后根據傳入的充實內部狀態等等。函數執行的結果是返回一個對象,屬性名對應于傳入的對象或者數組元素。 轉載請注明出處 https://segmentfault.com/a/11... vuex2.0 和 vuex1.x 相比,API改變的還是很多的,但基本思想沒什么...
摘要:中文官網英文官網組織發出一個問題之后,不要暫時的離開電腦,如果沒有把握先不要提問。珍惜每一次提問,感恩每一次反饋,每個人工作還是業余之外抽出的時間有限,充分準備好應有的資源之后再發問,有利于問題能夠高效質量地得到解決。 Vue.js資源分享 更多資源請Star:https://github.com/maidishike... 文章轉自:https://github.com/maid...
摘要:可以譯作運行時過程全面分析和解析,這個全面分析涉及到比較基礎的或者復雜的重要前端概念和中的概念等。注本篇是運行時全解析系列文章的第一篇,首次發表于,友善轉載蟹蟹。附更多內容請參考核心維護者蔣豪群同學的的公開課視頻 Vue Runtime Full Analysis - VueCLI3 Get Start VRFA: (Vue Runtime Full Analysis) 可以譯作vue...
摘要:起初,項目使用的是,其提供的方法用著比較爽,由于項目的很多數據來自豆瓣的,直接上簡單方便,跨域什么的不考慮。跨域問題,上面已經介紹,在不能操控的豆瓣數據上,使用的是。 項目地址 在線演示 不識廬山真面目,只緣身在此山中。 大概一個月前,開源了Vue重構豆瓣移動端的項目,效果還可以,收到了很多小伙伴的反饋,話說是要寫一些文章的,但遲遲沒有動筆,估計小伙伴們等的花都謝了,拖延癥是病,需要治...
摘要:說起,其實早在出現之前,網頁就是在服務端渲染的。沒有涉及流式渲染組件緩存對的服務端渲染有更深一步的認識,實際在生產環境中的應用可能還需要考慮很多因素。選擇的服務端渲染方案,是情理之中的選擇,不是對新技術的盲目追捧,而是一切為了需要。 作者:威威(滬江前端開發工程師)本文原創,轉載請注明作者及出處。 背景 最近, 產品同學一如往常笑嘻嘻的遞來需求文檔, 縱使內心萬般拒絕, 身體倒是很誠實...
閱讀 3403·2023-04-26 02:41
閱讀 2445·2023-04-26 00:14
閱讀 2823·2021-08-11 10:22
閱讀 1275·2019-12-27 11:38
閱讀 3571·2019-08-29 18:34
閱讀 2375·2019-08-29 12:13
閱讀 2951·2019-08-26 18:26
閱讀 1834·2019-08-26 16:49