Vuex 모듈러(모듈) 예제에 대한 자세한 설명

小云云
풀어 주다: 2018-01-31 13:47:38
원래의
2914명이 탐색했습니다.

이 글은 주로 Vuex 모듈성을 소개합니다. 편집자는 이것이 꽤 좋다고 생각합니다. 이제 여러분과 공유하고 참고할 수 있기를 바랍니다.

1. 모듈화가 필요한 이유

앞서 이야기한 예제는 모두 상태 트리에서 수행됩니다. 프로젝트가 상대적으로 크면 모든 상태가 모여 상대적으로 큰 객체가 나타납니다. , 유지하기가 어렵습니다. 이 문제를 해결하기 위해 Vuex를 사용하면 저장소를 모듈로 나눌 수 있습니다. 각 모듈에는 고유한 상태, 돌연변이, 동작, getter가 있으며 아래에서 모듈을 중첩할 수도 있습니다

const moduleA = {
 state: {....},
 mutations: {....},
 actions: {....},
 getters: {....}
}

const moduleB = {
 state: {....},
 mutations: {....},
 actions: {....},
 getters: {....}
}

const store = new Vuex.Store({
 modules: {
 a: moduleA,
 b: moduleB
 }
})

store.state.a // moduleA的状态
store.state.b // moduleB的状态
로그인 후 복사

2 . 모듈의 로컬 상태

모듈 내부의 변이와 게터, 수신된 첫 번째 매개변수(상태)는 모듈의 로컬 상태 객체인 rootState

const moduleA = {
 state: { count: 0},
 mutations: {
 increment (state) {
  // state是模块的局部状态,也就是上面的state
  state.count++
 }
 },
 getters: {
 doubleCount (state, getters, rootState) {
  // 参数 state为当前局部状态,rootState为根节点状态
  return state.count * 2
 }
 },
 actions: {
 incremtnIfOddRootSum ( { state, commit, rootState } ) {
  // 参数 state为当前局部状态,rootState为根节点状态
  if ((state.cont + rootState.count) % 2 === 1) {
  commit('increment')
  }
 }
 }
}
로그인 후 복사

3입니다(여기에서 읽어보세요. 그렇지 않은 경우도 있습니다). 속이게 됩니다)

위의 모든 예에서 모듈 내부의 액션, 변이, 게터는 전역 네임스페이스에 등록됩니다. moduleB 각각, store.commit('some')을 사용하면 모듈 A와 B가 동시에 응답합니다. 따라서 모듈을 더 독립적이고 재사용 가능하게 만들고 싶다면 네임스페이스 모듈을 네임스페이스 모듈로 만들기 위해 네임스페이스를 추가할 수 있습니다. 모듈이 등록되면 모든 게터, 작업 및 변형은 모듈에 의해 등록된 경로에 따라 자동으로 전체 이름을 호출합니다. 예:

const store = new Vuex.Store({
 modules: {
 account: {
  namespaced: true,
  state: {...}, // 模块内的状态已经是嵌套的,namespaced不会有影响
  getters: {  // 每一条注释为调用方法
  isAdmin () { ... } // getters['account/isAdmin']
  },
  actions: {
  login () {...} // dispatch('account/login')
  },
  mutations: {
  login () {...} // commit('account/login')
  },
  modules: {  // 继承父模块的命名空间
  myPage : {
   state: {...},
   getters: {
   profile () {...}  // getters['account/profile']
   }
  },
  posts: { // 进一步嵌套命名空间
   namespaced: true,
   getters: {
   popular () {...} // getters['account/posts/popular']
   }
  }
  }
 }
 }
})
로그인 후 복사

네임스페이스를 활성화하는 게터 및 작업은 지역화된 게터, 디스패치, 그리고 커밋합니다. 모듈 콘텐츠를 사용할 때 동일한 모듈에 공간 이름 접두사를 추가할 필요가 없으며 네임스페이스 속성을 변경한 후 모듈의 코드를 수정할 필요가 없습니다.

4. 네임스페이스 모듈에서 전역 콘텐츠(전역 자산)에 액세스합니다.

전역 상태 및 getter를 사용하려면 rootState 및 rootGetter가 세 번째 및 네 번째 매개변수로 getter에 전달되고 액션을 배포하거나 액션을 입력할 때 전역 네임스페이스에 변형을 제출해야 하는 경우 디스패치 또는 커밋할 세 번째 매개변수로 { root: true }를 전달하면 됩니다.

modules: {
 foo: {
 namespaced: true,
 getters: {
  // 在这个被命名的模块里,getters被局部化了
  // 你可以使用getter的第四个参数来调用 'rootGetters'
  someGetter (state, getters, rootSate, rootGetters) {
  getters.someOtherGetter // -> 局部的getter, ‘foo/someOtherGetter'
  rootGetters.someOtherGetter // -> 全局getter, 'someOtherGetter'
  }
 },
 actions: {
  // 在这个模块里,dispatch和commit也被局部化了
  // 他们可以接受root属性以访问跟dispatch和commit
  smoeActino ({dispatch, commit, getters, rootGetters }) {
  getters.someGetter // 'foo/someGetter'
  rootGetters.someGetter // 'someGetter'
  dispatch('someOtherAction')  // 'foo/someOtherAction'
  dispatch('someOtherAction', null, {root: true}) // => ‘someOtherAction'
  commit('someMutation') // 'foo/someMutation'
  commit('someMutation', null, { root: true }) // someMutation
  }
 }
 }
}
로그인 후 복사

5. 네임스페이스를 사용한 바인딩 함수

앞서 언급했듯이 네임스페이스를 가져온 후 호출 시 네임스페이스를 작성해야 하지만 이는 더욱 번거로우며, 특히 여러 수준의 중첩이 포함될 경우(물론 개발에서는 중첩하지 마십시오.) )

일반적인 작성 방법을 살펴보겠습니다

computed: {
 ...mapState({
 a: state => state.some.nested.module.a,
 b: state => state.some.nested.module.b
 }),
 methods: {
 ...mapActions([
  'some/nested/module/foo',
  'some/nested/module/bar'
 ])
 }
}
로그인 후 복사

이 경우 위 함수의 첫 번째 매개변수로 모듈의 네임스페이스를 전달하면 이 모듈이 자동으로 바인딩됩니다. 컨텍스트로 사용됩니다. 단순화된 쓰기는

computed: {
 ...mapStates('some/nested/module', {
 a: state => state.a,
 b: state => state.b
 })
},
methods: {
 ...mapActions('some/nested/module',[
 'foo',
 'bar'
 ])
}
로그인 후 복사

6. 모듈 재사용

때로는 모듈의 여러 인스턴스를 만들 수 있습니다. 예:

  • 여러 상점을 만들고 모듈을 공유합니다.

  • 한 상점에 ​​동일한 모듈을 여러 번 등록합니다. 모듈

모듈의 상태를 선언하기 위해 순수 객체를 사용한다면, 이 상태 객체는 참조를 통해 공유되어 데이터가 서로 오염될 수 있습니다.
사실 Vue 컴포넌트의 데이터도 같은 문제가 있어서 해결 방법도 같습니다. 모듈 상태를 선언하는 함수를 사용하세요. (2.3.0+에서 지원)

const MyModule = {
 state () {
 return {
  foo: 'far'
 }
 }
}
로그인 후 복사

7. 요약

내용은 동일합니다. 모듈은 여기까지입니다. 이번에는 모듈이 나타나는 이유, 사용 방법, 전역 및 로컬 네임스페이스 모듈 네임스페이스, 전역 콘텐츠에 대한 로컬 액세스, 네임스페이스와 맵 함수의 바인딩 기능 및 모듈 재사용에 대해 주로 설명합니다. ㅋㅋㅋ

간단한 Vuex 및 모듈화 배우기

위 내용은 Vuex 모듈러(모듈) 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿