웹 프론트엔드 JS 튜토리얼 Vue.js 2.0에 대한 Vuex 2.0 업데이트해야 할 지식 기반

Vue.js 2.0에 대한 Vuex 2.0 업데이트해야 할 지식 기반

Dec 03, 2016 pm 01:22 PM
vue.js

애플리케이션 구조

사실 Vuex는 코드 구조를 구성하는 방법에 제한이 없습니다. 반대로 일련의 상위 수준 원칙을 시행합니다.

1. level 상태는 매장 내에서 중앙 집중화됩니다.

2. 상태를 변경하는 유일한 방법은 동기 트랜잭션인 mutation을 제출하는 것입니다.

3. 비동기 로직은 실제로 캡슐화되어야 합니다.

이러한 규칙을 따르는 한 프로젝트 구성 방법은 귀하에게 달려 있습니다. 스토어 파일이 매우 크다면 액션, 뮤테이션, 게터 파일로 분할하세요.

약간 더 복잡한 애플리케이션의 경우 모듈을 사용해야 할 수도 있습니다. 다음은 간단한 프로젝트 구조입니다:

├── index.html
├── main.js
├── api
│ └── ... # 여기에서 API 실행 요청
├── 구성요소
│ ├── App.vue
│ └── ...
└── store
├── index.js
├── actions.js ├── actions.js ├── mutations.js # 루트 변이
└── 모듈
├── cart.js # 장바구니 모듈
└── products .js # 제품 모듈

자세한 내용은 장바구니 예시를 참조하세요.

모듈

단일 상태 트리를 사용하기 때문에 애플리케이션의 모든 상태가 하나의 큰 개체에 포함됩니다. 그러나 애플리케이션의 규모가 계속해서 커지면서 이 스토어는 매우 비대해졌습니다.

이 문제를 해결하기 위해 Vuex에서는 스토어를 모듈로 나눌 수 있습니다. 각 모듈에는 자체 상태, 변이, 작업 및 getter가 포함되어 있으며 중첩된 모듈도 포함되어 있습니다.

const moduleA = {
 state: { ... },
 mutations: { ... },
 actions: { ... },
 getters: { ... }
}
 
const moduleB = {
 state: { ... },
 mutations: { ... },
 actions: { ... }
}
 
const store = new Vuex.Store({
 modules: {
 a: moduleA,
 b: moduleB
 }
})
 
store.state.a // -> moduleA's state
store.state.b // -> moduleB's state
로그인 후 복사

모듈 로컬 상태

모듈의 mutations 및 getters 메소드가 전달하는 첫 번째 매개변수는 모듈의 로컬 상태입니다.

const moduleA = {
 state: { count: 0 },
 mutations: {
 increment: (state) {
  // state 是模块本地的状态。
  state.count++
 }
 },
 
 getters: {
 doubleCount (state) {
  return state.count * 2
 }
 }
}
로그인 후 복사

마찬가지로 모듈의 작업에서 context.state는 로컬 상태를 노출하고 context.rootState는 루트 상태를 노출합니다.

const moduleA = {
 // ...
 actions: {
 incrementIfOdd ({ state, commit }) {
  if (state.count % 2 === 1) {
  commit('increment')
  }
 }
 }
}
로그인 후 복사

모듈의 getter에서는 루트 상태도 세 번째 매개변수로 노출됩니다.

const moduleA = {
 // ...
 getters: {
 sumWithRootCount (state, getters, rootState) {
  return state.count + rootState.count
 }
 }
}
로그인 후 복사

네임스페이스

모듈 내의 액션, 변이 및 게터는 여전히 전역 네임스페이스에 등록되어 있습니다. 여러 모듈이 동일한 돌연변이/작업 유형에 응답할 수 있습니다. 이름 충돌을 방지하기 위해 모듈 이름에 접두사 또는 접미사를 추가하여 네임스페이스를 설정할 수 있습니다. Vuex 모듈이 재사용 가능하고 실행 환경을 알 수 없는 경우 이 작업을 수행해야 합니다. 거리, 할일 모듈을 생성하고 싶습니다:

// types.js
 
// 定义 getter、 action 和 mutation 的常量名称
// 并且在模块名称上加上 `todos` 前缀
export const DONE_COUNT = 'todos/DONE_COUNT'
export const FETCH_ALL = 'todos/FETCH_ALL'
export const TOGGLE_DONE = 'todos/TOGGLE_DONE'
// modules/todos.js
import * as types from '../types'
 
// 用带前缀的名称来定义 getters, actions and mutations
const todosModule = {
 state: { todos: [] },
 
 getters: {
 [types.DONE_COUNT] (state) {
  // ...
 }
 },
 
 actions: {
 [types.FETCH_ALL] (context, payload) {
  // ...
 }
 },
 
 mutations: {
 [types.TOGGLE_DONE] (state, payload) {
  // ...
 }
 }
}
로그인 후 복사

동적 모듈 등록

스토어를 사용하여 스토어에서 생성할 수 있습니다. .registerModule 메소드 그런 다음 모듈을 등록합니다:

store.registerModule('myModule', {
 // ...
})
로그인 후 복사

모듈의 store.state.myModule이 모듈의 상태로 노출됩니다.

다른 Vue 플러그인은 애플리케이션 스토어에 모듈을 부착한 후 동적 등록을 통해 Vuex의 상태 관리 기능을 사용할 수 있습니다. 예를 들어, vuex-router-sync 라이브러리는 동적으로 등록된 모듈에서 애플리케이션의 라우팅 상태를 관리하여 vue-router와 vuex를 통합합니다.

store.unregisterModule(moduleName)을 사용하여 동적으로 등록된 모듈을 제거할 수도 있습니다. 그러나 이 방법을 사용하여 정적 모듈(즉, 저장소가 생성될 때 선언된 모듈)을 제거할 수는 없습니다.

플러그인

Vuex 매장은 각 변이에 대한 후크를 노출하는 플러그인 옵션을 받습니다. Vuex 플러그인은 sotre를 유일한 매개변수로 받아들이는 간단한 방법입니다:

const myPlugin = store => {
 // 当 store 在被初始化完成时被调用
 store.subscribe((mutation, state) => {
 // mutation 之后被调用
 // mutation 的格式为 {type, payload}。
 })
}
로그인 후 복사

다음과 같이 사용합니다:

const store = new Vuex.Store({
 // ...
 plugins: [myPlugin]
})
로그인 후 복사

플러그인 내에서 변형 제출

플러그인은 상태를 직접 수정할 수 없습니다. 구성 요소와 마찬가지로 변형에 의해서만 트리거될 수 있습니다.

변이를 제출하면 플러그인을 사용하여 데이터 소스를 스토어에 동기화할 수 있습니다. 예를 들어, websocket 데이터 소스를 저장소에 동기화하기 위해(이는 사용법을 설명하기 위한 예시일 뿐이며 실제로는 createPlugin 메소드에 복잡한 작업을 완료하기 위한 더 많은 옵션이 추가됩니다).

export default function createWebSocketPlugin (socket) {
 return store => {
 socket.on('data', data => {
  store.commit('receiveData', data)
 })
 store.subscribe(mutation => {
  if (mutation.type === 'UPDATE_DATA') {
  socket.emit('update', mutation.payload)
  }
 })
 }
}
로그인 후 복사

const plugin = createWebSocketPlugin(socket)
 
const store = new Vuex.Store({
 state,
 mutations,
 plugins: [plugin]
})
로그인 후 복사

상태 스냅샷 생성

때때로 플러그인이 상태를 가져오려고 합니다. " 스냅샷" 및 상태는 변경 전후에 변경됩니다. 이러한 기능을 구현하려면 상태 개체의 전체 복사본이 필요합니다.

const myPluginWithSnapshot = store => {
 let prevState = _.cloneDeep(store.state)
 store.subscribe((mutation, state) => {
 let nextState = _.cloneDeep(state)
 
 // 对比 prevState 和 nextState...
 
 // 保存状态,用于下一次 mutation
 prevState = nextState
 })
}
로그인 후 복사

** 상태 스냅샷을 생성하는 플러그인은 개발 단계에서 Webpack 또는 Browserify를 사용하여 빌드 도구에서 처리하도록 하세요.

const store = new Vuex.Store({
 // ...
 plugins: process.env.NODE_ENV !== 'production'
 ? [myPluginWithSnapshot]
 : []
})
로그인 후 복사

플러그인은 기본적으로 활성화됩니다. . 프로덕션으로 배송하려면 Webpack의 DefinePlugin 또는 Browserify의 enify를 사용하여 process.env.NODE_ENV !== 'production'을 false로 변환해야 합니다.

내장 로거 플러그인

如果你正在使用 vue-devtools,你可能不需要。

Vuex 带来一个日志插件用于一般的调试:

import createLogger from 'vuex/dist/logger'
 
const store = new Vuex.Store({
 plugins: [createLogger()]
})
로그인 후 복사

createLogger 方法有几个配置项:

const logger = createLogger({
 collapsed: false, // 自动展开记录 mutation
 transformer (state) {
 // 在记录之前前进行转换
 // 例如,只返回指定的子树
 return state.subTree
 },
 mutationTransformer (mutation) {
 // mutation 格式 { type, payload }
 // 我们可以按照想要的方式进行格式化
 return mutation.type
 }
})
로그인 후 복사

日志插件还可以直接通过

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

vue-cropper를 사용하여 vue 프로젝트에서 이미지 자르기 vue-cropper를 사용하여 vue 프로젝트에서 이미지 자르기 Oct 31, 2022 pm 07:16 PM

Vue 프로젝트에서 이미지를 자르는 방법은 무엇입니까? 다음 글에서는 vue-cropper를 사용하여 이미지를 자르는 방법을 소개하겠습니다. 도움이 되길 바랍니다!

vue3의 반응성()에 대해 자세히 이야기해 봅시다. vue3의 반응성()에 대해 자세히 이야기해 봅시다. Jan 06, 2023 pm 09:21 PM

서문: vue3 개발에서 반응형은 반응형 데이터를 구현하는 방법을 제공합니다. 일상적인 개발에서 자주 사용되는 API입니다. 이 기사에서 저자는 내부 작동 메커니즘을 탐구합니다.

실용적인 전투: vue 파일을 지원하여 정의로 이동하는 플러그인을 vscode에서 개발합니다. 실용적인 전투: vue 파일을 지원하여 정의로 이동하는 플러그인을 vscode에서 개발합니다. Nov 16, 2022 pm 08:43 PM

vscode 자체는 Vue 파일 구성 요소를 지원하여 정의로 이동하지만 지원은 매우 약합니다. vue-cli 구성에 따라 다양한 유연한 사용법을 작성할 수 있어 생산 효율성을 향상시킬 수 있습니다. 그러나 vscode 자체에서 제공하는 기능이 파일 정의로 점프하는 것을 지원하지 못하게 하는 것은 이러한 유연한 쓰기 방법입니다. 이러한 유연한 작성 방법과 호환되고 작업 효율성을 높이기 위해 Vue 파일을 지원하는 vscode 플러그인을 작성하여 정의로 이동했습니다.

Vue 프로젝트에 Ace 코드 편집기를 통합하는 방법에 대한 자세한 그래픽 설명 Vue 프로젝트에 Ace 코드 편집기를 통합하는 방법에 대한 자세한 그래픽 설명 Apr 24, 2023 am 10:52 AM

Ace는 JavaScript로 작성된 내장형 코드 편집기입니다. Sublime, Vim 및 TextMate와 같은 기본 편집기의 기능 및 성능과 일치합니다. 모든 웹페이지와 JavaScript 애플리케이션에 쉽게 삽입할 수 있습니다. Ace는 Cloud9 IDE의 메인 편집자로 유지되며 Mozilla Skywriter(Bespin) 프로젝트의 후속 버전입니다.

Vue3에서 단위 테스트를 작성하는 방법 살펴보기 Vue3에서 단위 테스트를 작성하는 방법 살펴보기 Apr 25, 2023 pm 07:41 PM

Vue.js는 오늘날 프런트엔드 개발에서 매우 인기 있는 프레임워크가 되었습니다. Vue.js가 계속 발전함에 따라 단위 테스트는 점점 더 중요해지고 있습니다. 오늘은 Vue.js 3에서 단위 테스트를 작성하는 방법을 살펴보고 몇 가지 모범 사례와 일반적인 문제 및 솔루션을 제공하겠습니다.

vue에서 구성 요소화와 모듈화의 차이점은 무엇입니까 vue에서 구성 요소화와 모듈화의 차이점은 무엇입니까 Dec 15, 2022 pm 12:54 PM

구성요소화와 모듈화의 차이점: 모듈화는 코드 논리의 관점에서 구분되며, 코드 계층 개발을 용이하게 하고 각 기능 모듈의 기능이 일관되게 유지되도록 합니다. 컴포넌트화는 UI 인터페이스 관점에서 계획하는 것으로 프런트엔드의 컴포넌트화는 UI 컴포넌트의 재사용을 용이하게 합니다.

Vue3 동적 구성 요소에서 예외를 처리하는 방법에 대한 간략한 분석 Vue3 동적 구성 요소에서 예외를 처리하는 방법에 대한 간략한 분석 Dec 02, 2022 pm 09:11 PM

Vue3 동적 구성 요소에서 예외를 처리하는 방법은 무엇입니까? 다음 기사에서는 Vue3 동적 구성 요소 예외 처리 방법에 대해 설명합니다. 이것이 모든 사람에게 도움이 되기를 바랍니다.

vite가 .env 파일을 구문 분석하는 방법에 대한 심층 토론 vite가 .env 파일을 구문 분석하는 방법에 대한 심층 토론 Jan 24, 2023 am 05:30 AM

Vue 프레임워크를 사용하여 프런트엔드 프로젝트를 개발할 때 배포 시 여러 환경을 배포하게 되는데, 개발 환경, 테스트 환경, 온라인 환경에서 호출되는 인터페이스 도메인 이름이 다른 경우가 많습니다. 어떻게 구별할 수 있나요? 그것은 환경 변수와 패턴을 사용하는 것입니다.

See all articles