Vuex 의 이해 Mutations 의 용법 인 스 턴 스
이전 글에서 말 한
getters
은 초보적인 획득 과 간단 한 처리state
안의 데이터(이곳 의 간단 한 처 리 는 state 안의 데 이 터 를 바 꿀 수 없다)를 위 한 것 이다.Vue
의 보 기 는 데이터 에 의 해 작 동 된다.즉,state
안의 데 이 터 는 동태 적 으로 변화 한 것 이다.그러면 어떻게 바 꿀 까?Vuex
에서store
데이터 가 바 뀌 는 유일한 방법 은mutation
이라는 것 을 명심 하 세 요!통속 적 인 이해
mutations
에는 데이터 방법 을 바 꾸 는 집합 이 담 겨 있다.이것 은Veux
디자인 의 중요 한 점 이다.바로 데이터 논리 처리 방법 을 모두mutations
에 넣 어 데이터 와 보 기 를 분리 시 키 는 것 이다.2.mutations 는 어떻게 사용 하나 요?
mutation 구조:각각
mutation
문자열 형식의 이벤트 형식type
과 리 셋 함수handler
가 있 습 니 다.{type:handler()},
는 구독 발표 와 유사 하 다 고 이해 할 수 있 습 니 다.먼저 이 벤트 를 등록 하고 응답 유형 을 터치 할 때 호출handker()
,호출type
할 때 사용store.commit
방법 이 필요 합 니 다.
const store = new Vuex.Store({
state: {
count: 1
},
mutations: {
increment (state) { // ,type:increment,handler state;
//
state.count++}}})
store.commit('increment') // type, handler(state)
부하(payload):간단 한 이 해 는handler(stage)
에 전달 하 는 것handler(stage,pryload)
이다.보통 대상 이 야.
mutations: {
increment (state, n) {
state.count += n}}
store.commit('increment', 10)
mutation-types: , 。
// mutation-types.js
export const SOME_MUTATION = 'SOME_MUTATION'
// store.js
import Vuex from 'vuex'
import { SOME_MUTATION } from './mutation-types'
const store = new Vuex.Store({
state: { ... },
mutations: {
// ES2015
[SOME_MUTATION] (state) {
// mutate state
}
}
})
commt:제출 은 구성 요소 에서 this.$store.commit('xxx')
제출mutation
을 사용 하거나mapMutations
보조 함 수 를 사용 하여 구성 요소 의methods
맵 을store.commit
호출(루트 노드 에 주입store
해 야 합 니 다.
import { mapMutations } from 'vuex'
export default {
methods: {
...mapMutations([
'increment' // this.increment()
this.$store.commit('increment')]),
...mapMutations({
add: 'increment' // this.add()
this.$store.commit('increment')
})}}
3.소스 코드 분석registerMutation
:초기 화mutation
function registerMutation (store, type, handler, path = []) {
//4 ,store Store ,type mutation type,handler,path
const entry = store._mutations[type] || (store._mutations[type] =
[]) // type mutation
entry.push(function wrappedMutationHandler (payload) {
// mutation push , payload
handler(getNestedState(store.state, path), payload)
// getNestedState() state, payload
})
}
commit
:호출mutation
commit (type, payload, options) {
// 3 ,type mutation ,payload ,options
if (isObject(type) && type.type) {
// type object ,
options = payload
payload = type
type = type.type
}
const mutation = { type, payload }
const entry = this._mutations[type]
// type mutation
if (!entry) {
//
console.error(`[vuex] unknown mutation type: ${type}`)
return
}
this._withCommit(() => {
entry.forEach(function commitIterator (handler) {
// type mutation , handle(payload)
// wrappedMutationHandler(handler)
handler(payload)
})
})
if (!options || !options.silent) {
this._subscribers.forEach(sub => sub(mutation, this.state))
// mutation state
}
}
subscribers
:구독store
의mutation
subscribe (fn) {
const subs = this._subscribers
if (subs.indexOf(fn) < 0) {
subs.push(fn)
}
return () => {
const i = subs.indexOf(fn)
if (i > -1) {
subs.splice(i, 1)
}
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Vuex의 템플릿 리터럴 유형TypeScript 4.1은 템플릿 리터럴 유형을 도입했습니다. 언뜻 보기에는 별로 흥미롭게 들리지 않습니다. 다른 유형을 기반으로 하는 리터럴 유형의 조합을 만들 수 있습니다. 그러나이 기능이 매우 유용한 경우가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.