Vuex 상태 기기 의 빠 른 이해 와 인 스 턴 스 응용

19369 단어 vuex상태 기
1.속 식 개념:
1.구성 요소 간 에 데 이 터 를 공유 하 는 방식:
보통 다음 과 같은 몇 가지 방식 이 있다.
  • 부모 가 자식 에 게 전 하 는 값:v-bind 속성 바 인 딩;
  • 자식 이 부모 에 게 전 하 는 값:v-on 이벤트 바 인 딩;
  • 형제 구성 요소 간 공유 데이터:EventBus;2.vuex 는 무엇 입 니까?
    4.567917.공식 적 인 말 에 따 르 면 Vuex 는 Vue.js 응용 프로그램 을 위 한 상태 관리 모델 이다.이 는 중앙 식 저장 관리 에 응 용 된 모든 구성 요소 의 상 태 를 사용 하고 해당 하 는 규칙 으로 상 태 를 예측 가능 한 방식 으로 변화 시 킵 니 다.Vuex 도 Vue 의 공식 디 버 깅 도구 devtools extension(opens new window)에 통합 되 어 0 설정 의 time-travel 디 버 깅,상태 스냅 샷 가 져 오기 내 보 내기 등 고급 디 버 깅 기능 을 제공 합 니 다
  • 쉽게 말 하면 Vuex 는 구성 요소 의 전체 상태(데이터)관 리 를 실현 하 는 체제 로 구성 요소 간 데이터 공 유 를 편리 하 게 실현 할 수 있다
  • 3.vuex 장점 사용:
    4.567917.vuex 에서 공 유 된 데 이 터 를 집중 적 으로 관리 하여 개발 과 후기 유지 하기 쉽다4.567917.구성 요소 간 의 데이터 공 유 를 효율적으로 실현 하고 개발 효율 을 높 일 수 있다4.567917.vuex 에 저 장 된 데 이 터 는 모두 응답 식 으로 데이터 와 페이지 의 동기 화 를 실시 간 으로 유지 할 수 있 습 니 다4.567917.비 부자 구성 요소 의 메시지 전달 을 해결 했다(데 이 터 를 state 에 저장)
  • AJAX 요청 횟수 를 줄 였 고 메모리 에 있 는 state 에서 직접 가 져 올 수 있 는 상황 도 있 습 니 다.
  • 일반 상황 에서 구성 요소 간 에 공 유 된 데이터 만 vuex 에 저장 할 필요 가 있 습 니 다.구성 요소 의 개인 데 이 터 는 필요 없습니다.구성 요소 자체 의 data 에 저장 하면 됩 니 다.물론 vuex 에 모두 존재 하고 싶다 면 가능 합 니 다.
    2.기본 사용:
    1.의존 패키지 설치:
    
    npm install vuex --save
    
    2.의존 패키지 가 져 오기:
    
    import Vue from 'vue'
    import Vuex from 'vuex'
    
    Vue.use(Vuex)
    
    3.store 대상 만 들 기:
    
    import Vue from 'vue'
    import Vuex from 'vuex'
    
    Vue.use(Vuex)
    
    const store = new Vuex.Store({
    //state             
      state: {
        count: 0
      }
    })
    
    4.store 대상 을 vue 인 스 턴 스 에 마 운 트 하기:
    
    new Vue({
      el: '#app',
      store
    })
    
    이 때 모든 구성 요 소 는 store 에서 데 이 터 를 가 져 올 수 있 습 니 다.
    3.프로젝트 생 성:
    다음은 vue 프로젝트 프로 세 스 를 만 들 기 위해 다음 사례 가 있 습 니 다.
    (1)cmd 창 을 열 고 vue ui 를 입력 하여 vue 의 시각 화 패 널 을 엽 니 다.

    (2)새 항목 경로 선택:

    (3)이름:

    (4)수 동 으로 설정 을 선택 하고 vue 2 버 전 을 사용 합 니 다.


    (5)생 성:

    (6)다음 단계:

    (7)생 성 에 성공 하여 해당 디 렉 터 리 에서 vscode 를 열 고 프로 그래 밍 을 시작 합 니 다.

    (8)실행 항목:

    4.전 제 를 설명 한다.
    전제(주의):
    『8195』는 카운터 의 작은 사례 를 쓰 고 사례 에서 개념 을 결합 하면 vuex 를 더욱 빨리 시작 할 수 있 습 니 다.그래서 다음 핵심 개념 중의 코드 부분 은 이 작은 사례 를 바탕 으로 보 여 주 는 것 이다.목표:두 개의 하위 구성 요 소 를 작성 합 니 다.하나의 공공 count 값 이 있 습 니 다.부모 구성 요소 중 하 나 는 클릭 후 count 값 을 1 로 줄 이 고 한 구성 요 소 는 클릭 후 count 값 을 1 로 증가 합 니 다.
    부모 구성 요소 App.vue 초기 코드:
    
    <template>
      <div id="app">
           <my-add></my-add>
           <p>--------------------</p>
           <my-reduce></my-reduce>
      </div>
    </template>
    
    <script>
    //     
    import Add from './components/Add.vue'
    import Reduce from './components/Reduce.vue'
    export default {
      name: 'App',
      data() {
        return {
          
        }
      },
      components: {
        'my-add': Add,
        'my-reduce': Reduce
      }
    
    }
    </script>
    
    하위 구성 요소 add.vue 초기 코드:
    
    <template>
        <div>
            <p>count  :</p>
               <button>+1</button>
        </div>
     
    </template>
    <script>
      export default{
          data() {
              return {
                  
              }
          },
      }
    </script>
    
    하위 구성 요소 Reduce.vue 초기 코드:
    
    <template>
        <div>
             <p>count  :</p>
               <button>-1</button>
        </div>
    </template>
    <script>
      export default{
          data() {
              return {
                  
              }
          },
      }
    </script>
    
    store 대상 초기 코드:
    
    import Vue from 'vue'
    import Vuex from 'vuex'
    
    Vue.use(Vuex)
    
    export default new Vuex.Store({
      state: {
        count: 0
      }
    })
    
    초기 효과:

    5.핵심 개념:
    1.state:
      공식 적 인 말 에 따 르 면 다음 과 같다.Vuex 는 단일 상태 트 리 를 사용 합 니 다.네,한 대상 으로 모든 응용 등급 상 태 를 포함 합 니 다.이로써'유일한 데이터 원본(SSOT)'으로 존재 한다.이것 은 모든 응용 프로그램 이 하나의 store 인 스 턴 스 만 포함 한 다 는 것 을 의미한다.
      쉽게 말 하면 State 가 유일한 공공 데이터 소스 를 제공 하고 모든 공 유 된 데 이 터 는 Store 의 State 에 통일 적 으로 저장 해 야 합 니 다.
    1.1 구성 요소 에서 state 에 접근 하 는 첫 번 째 방법:
    구성 요소 에 다음 명령 을 직접 입력 하 십시오:
    this.$store.state.인 용 된 데이터 이름
    add.vue 하위 구성 요소 에서 참조:
    
    <template>
        <div>
            <p>count  :{{this.$store.state.count}}</p>
               <button>+1</button>
        </div> 
    </template>
    //              ,     
    
    효 과 를 보면 count 의 값 이 0 으로 표 시 됩 니 다:

    1.2 구성 요소 에서 state 에 접근 하 는 두 번 째 방식:
    (1)vuex 에서 필요 에 따라 mapState 함 수 를 가 져 옵 니 다.
    
    import { mapState } from 'vuex'
    
    (2)방금 가 져 온 mapState 함 수 를 통 해 현재 구성 요소 에 필요 한 전역 데 이 터 를 현재 구성 요소 의 coptute d 계산 속성 으로 표시 합 니 다.
    
    computed: {
       ...mapState([count])
    }
    
    작은 지식:coptute d 는 자신 이 정의 한 변 수 를 감시 하 는 데 사 용 됩 니 다.이 변 수 는 data 에서 설명 하지 않 고 coptute d 에서 직접 정의 한 다음 에 페이지 에서 양 방향 데이터 바 인 딩 을 하여 결 과 를 보 여주 거나 다른 처리 로 사용 할 수 있 습 니 다.
    Reduce.vue 하위 구성 요소 에서 참조:
    
    <template>
        <div>
             <p>count  :{{count}}</p>
               <button>-1</button>
        </div>
    </template>
    <script>
    import {mapState} from 'vuex'
      export default{
          data() {
              return {
                  
              }
          },
          computed: {
             ...mapState(['count'])
          }
      }
    </script>
    
    효 과 를 보면 count 의 값 이 0 으로 표 시 됩 니 다:

    2. mutation:
      공식 적 으로 Vuex 의 store 상 태 를 변경 하 는 유일한 방법 은 mutation 을 제출 하 는 것 입 니 다.Vuex 의 mutation 은 이벤트 와 매우 유사 합 니 다.모든 mutation 에는 문자열 의 이벤트 형식(type)과 반전 함수(handler)가 있 습 니 다.이 반전 함 수 는 우리 가 실제 상태 변경 을 하 는 곳 이 며,state 를 첫 번 째 매개 변수 로 받 아들 일 것 입 니 다.
      쉽게 말 하면 Mutation 이 Store 의 데 이 터 를 변경 하 는 데 사용 하 는 것 입 니 다.
    ① mutation 을 통 해서 만 Store 데 이 터 를 변경 할 수 있 으 며 Store 의 데 이 터 를 직접 조작 할 수 없습니다.
    ② 이러한 방식 을 통 해 조작 이 다소 번 거 롭 지만 모든 데이터 의 변 화 를 집중 적 으로 모니터링 할 수 있다.
    예 를 들 어 count 값 이 1 을 추가 하 는 작업 을 실현 하려 면 먼저 motations 에서 1 을 추가 하 는 함 수 를 정의 합 니 다.그리고 하위 구성 요 소 를 사용 하려 면 이 구성 요 소 는 mutation 을 직접 도입 하고 해당 하 는 함 수 를 호출 하면 됩 니 다.
    다음 과 같이 add.vue 서브 구성 요 소 는 1 기능 을 추가 합 니 다.
    먼저 상태 기 에 있 는 mutations 에서 자체 증 가 를 실현 할 수 있 는 함수 add 를 정의 합 니 다.
    
    export default new Vuex.Store({
      state: {
        count: 0
      },
      mutations: {
        //   1  
        add(state){
          state.count++
        }
      }
    })
    
    2.1 mutation 을 촉발 하 는 첫 번 째 방법:
    add.vue 하위 구성 요소 에서 단추 바 인 딩 클릭 이벤트 와 mutation 을 실행 합 니 다.
    
    <template>
        <div>
            <p>count  :{{this.$store.state.count}}</p>
               <button @click="btnAdd">+1</button>
        </div>
     
    </template>
    <script>
      export default{
          data() {
              return {
                  
              }
          },
          methods: {
              btnAdd() {
                  //      mutation   ,  add  
                  this.$store.commit('add')
              }
          }
      }
    </script>
    
    효 과 를 보고 클릭 증가:

    2.2 mutation 을 촉발 하고 매개 변 수 를 전달 합 니 다:
    물론 구성 요소 에서 mutation 의 함 수 를 호출 할 때 도 인 자 를 전달 할 수 있 습 니 다.
    예 를 들 어 자체 증가 함수 가 있 지만 호출 할 때 들 어 오 는 매개 변 수 를 얼마나 늘 리 는 지 볼 수 있 습 니 다.
    
    export default new Vuex.Store({
      state: {
        count: 0
      },
      mutations: {
        //     ,      state,         
        //    n    
        addN(state,n){
          state.count+= n
        }
      }
    })
    
    대응 하 는 구성 요소 호출 시 인자 입력:
    
      methods: {
              btnAdd2() {
                  //   mutation   ,  addN  
                  //    ,   6 
                  this.$store.commit('addN',6)
              }
          }
    
    2.1 mutation 을 촉발 하 는 두 번 째 방식:
    (1)vuex 에서 필요 에 따라 mapMutations 함 수 를 가 져 옵 니 다.
    
    import { mapMutations } from 'vuex'
    
    (2)방금 가 져 온 mapMutations 함 수 를 통 해 필요 한 mutations 함 수 를 현재 구성 요소 의 methods 방법 으로 표시 합 니 다.
    
    methods: {
       ...mapMutations(['add','addN'])
    }
    
    실전,Reduce.vue 구성 요소 의 클릭 자체 감소 1 의 기능 요구 실현:
    상태 기 자동 감소 함수 추가:
    
    export default new Vuex.Store({
      state: {
        count: 0
      },
      mutations: {
        //   1  
        add(state){
          state.count++
        },
        //   1   
        sub(state){
          state.count--
        }
      }
    })
    
    Reduce.vue 구성 요소 가 단 추 를 누 르 면 자동 으로 1 을 줄 입 니 다.
    
    <template>
        <div>
             <p>count  :{{count}}</p>
               <button @click="btnSub">-1</button>
        </div>
    </template>
    <script>
    //  
    import {mapState,mapMutations} from 'vuex'
      export default{
          data() {
              return {
                  
              }
          },
          computed: {
             ...mapState(['count'])
          },
          methods: {
              //   mutation  sub  
              ...mapMutations(['sub']),
              //    ,  sub  
              btnSub(){
                 this.sub()
              }
          }
      }
    </script>
    
    효과 보기:

    3.Action:
      이로써 네 번 째 큰 점 에서 의 사례 는 이미 완성 되 었 고 자체 증가 와 자체 감 소 를 실현 했다.지금 은 사례 를 개선 하고 자 한다.버튼 을 클릭 한 지 1 초 후에 증가 와 자체 감 소 를 해 야 한다.어떻게 실현 해 야 합 니까?상태 기 에 있 는 mutation 의 함 수 는 1 초 타 이 머 를 추가 하 는 것 입 니까?이것 은 분명 안 됩 니 다.mutation 에 서 는 비동기 작업 을 지원 하지 않 기 때문에 어떻게 합 니까?당당,Action 이 반 짝 이 며 등장 합 니 다.
      Action 은 임의의 비동기 작업 을 포함 할 수 있 기 때문에 비동기 작업 을 처리 하 는 데 사 용 됩 니 다.
      Action 은 상 태 를 직접 변경 하 는 것 이 아니 라 mutation 을 제출 합 니 다.state 의 데 이 터 를 직접 수정 할 수 없고 mutation 만 수정 할 수 있다 는 것 을 기억 하 세 요.비동기 조작 을 통 해 데 이 터 를 변경 할 경우 뮤 테 이 션 대신 액 션 을 통 해 야 하지만 액 션 에 서 는 뮤 테 이 션 을 촉발 하 는 방식 으로 간접 적 으로 데 이 터 를 변경 해 야 한 다 는 것 이다.
    먼저 상태 기 에서 Action 을 정의 합 니 다:
    
    export default new Vuex.Store({
      state: {
        count: 0
      },
      mutations: {
        //   1  
        add(state){
          state.count++
        },
        //   1   
        sub(state){
          state.count--
        }
      },
      //   action,   addAsync    1    mutation  add  
       actions: {
        addAsync(context) {
          setTimeout(()=>{
          //     context.commit()  mutation  
             context.commit('add')
        },1000)
      }  
     }
    })
    
    Action 함 수 는 store 인 스 턴 스 와 같은 방법 과 속성 을 가 진 context 대상 을 받 아들 이기 때문에 context.comit 를 호출 하여 mutation 을 제출 할 수 있 습 니 다.
    3.1 Action 을 실행 하 는 첫 번 째 방법:
    구성 요소 add.vue 코드 를 변경 하고 Action 을 도입 하여 비동기 자동 증가 작업 을 실현 합 니 다.
    
    <template>
        <div>
            <p>count  :{{this.$store.state.count}}</p>
               <button @click="btnAdd">+1</button>
        </div>
     
    </template>
    <script>
      export default{
          data() {
              return {
                  
              }
          },
          methods: {
              btnAdd() {
                  //      Action   ,  addAsync  
                  //    dispatch      action  
                  this.$store.dispatch('addAsync')
              }
          }
      }
    </script>
    
    효 과 를 보고 1 초 후 증가:

    3.2 Action 비동기 작업 을 촉발 하고 매개 변 수 를 전달 합 니 다:
    물론 구성 요소 에서 action 의 함 수 를 호출 할 때 도 인 자 를 전달 할 수 있 습 니 다.
    예 를 들 어 1 초 를 클릭 한 후에 실 행 된 자체 증가 함수 가 있 지만 호출 할 때 들 어 오 는 매개 변 수 를 얼마나 늘 리 는 지 볼 수 있 습 니 다.
    정의:
    
    export default new Vuex.Store({
      state: {
        count: 0
      },
      mutations: {
       //     ,      state,         
        //    n    
        addN(state,n){
          state.count+= n
        }
      },
       actions: {
        //     n,  n    mutation  addN  
        addNAsync(context,n) {
          setTimeout(()=>{
             context.commit('addN',n)
        },1000)
      }  
     }
    })
    
    대응 하 는 구성 요소 호출 시 인자 입력:
    
      methods: {
              btnAdd2() {
                  //   dispatch  
                  //   action    ,  6  ,    6
                  this.$store.dispatch('addNAsync',6)
              }
          }
    
    3.3 Action 을 촉발 하 는 두 번 째 방법:
    (1)vuex 에서 필요 에 따라 mapActions 함 수 를 가 져 옵 니 다.
    
    import { mapActions } from 'vuex'
    
    (2)방금 가 져 온 mapActions 함 수 를 통 해 필요 한 actions 함 수 를 현재 구성 요소 로 표시 하 는 methods 방법:
    
    methods: {
       ...mapActions(['add','addN'])
    }
    
    실전,Reduce.vue 구성 요소 의 클릭 1 초 후 1 감소 기능 요구:
    actions 의 subAsync 를 1 초 후 자감 함수 로 정의 합 니 다:
    
    export default new Vuex.Store({
      state: {
        count: 0
      },
      mutations: {
        //   1  
        add(state){
          state.count++
        },
        //   1   
        sub(state){
          state.count--
        }
      },
       actions: {
        addAsync(context) {
          setTimeout(()=>{
             context.commit('add')
        },1000)
      },
       subAsync(context) {
          setTimeout(()=>{
             context.commit('sub')
        },1000)
      }    
     }
    })
    
    
    Reduce.vue 코드 변경,기능 구현:
    
    <template>
        <div>
             <p>count  :{{count}}</p>
               <button @click="btnSub">-1</button>
        </div>
    </template>
    <script>
    //  
    import {mapState,mapActions} from 'vuex'
      export default{
          data() {
              return {
                  
              }
          },
          computed: {
             ...mapState(['count'])
          },
          methods: {
              //   Action    
              ...mapActions(['subAsync']),
              //    ,  subAsync  
              btnSub(){
                 this.subAsync()
              }
          }
      }
    </script>
    
    효과 보기:

    4. Getter:
    『8195』Getter 는 Store 의 데 이 터 를 가공 처리 하여 새로운 데 이 터 를 만 드 는 데 사 용 됩 니 다.그리고 주의해 야 할 것 은 state 의 데 이 터 를 수정 하지 않 는 다 는 것 이다.
    ① Getter 는 Store 에 있 는 데 이 터 를 가공 처리 한 후에 새로운 데 이 터 를 형성 할 수 있 으 며 Vue 와 같은 계산 속성 을 가진다.
    ② 스토어 에서 데이터 가 바 뀌 면 Getter 의 데이터 도 달라 진다.
    현재 count+1 을 되 돌려 주 는 getter 함수 가 있 습 니 다:
    
    export default new Vuex.Store({
      state: {
        count: 0
      },
     getters: {
        showNum(state){
          return`  count  1 :${state.count+1}`
        }
      }
    })
    
    4.1 getters 를 촉발 하 는 첫 번 째 방식:
    
    this.$store.getters.  
    
    App.vue 구성 요소 에 표시:
    
    <template>
      <div id="app">
           <my-add></my-add>
           <p>--------------------</p>
           <my-reduce></my-reduce>
           <p>--------------------</p>
           <h3>{{this.$store.getters.showNum}}</h3>
      </div>
    </template>
    
    효과:

    4.2 getters 를 촉발 하 는 두 번 째 방식:
    (1)vuex 에서 필요 에 따라 mapGetters 함 수 를 가 져 옵 니 다.
    
    import { mapGetters } from 'vuex'
    
    (2)방금 가 져 온 mapGetters 함 수 를 통 해 현재 구성 요소 에 필요 한 전역 데 이 터 를 현재 구성 요소 의 computed 계산 속성 으로 표시 합 니 다.
    
    computed: {
       ...mapGetters(['showNum'])
    }
    
    아니면 App.vue 에서 사용 하 시 겠 습 니까?
    
    <template>
      <div id="app">
           <my-add></my-add>
           <p>--------------------</p>
           <my-reduce></my-reduce>
           <p>--------------------</p>
           <h3>{{showNum}}</h3>
      </div>
    </template>
    
    <script>
    //     
    import Add from './components/Add.vue'
    import Reduce from './components/Reduce.vue'
    //    mapGetters  
    import {mapGetters} from 'vuex'
    export default {
      name: 'App',
      data() {
        return {
          
        }
      },
      components: {
        'my-add': Add,
        'my-reduce': Reduce
      },
      //    getter
      computed: {
        ...mapGetters(['showNum'])
      }
    
    }
    </script>
    
    보 세 요.같은 효과:

    6.총화:
    Vuex 상태 기 에 대한 빠 른 이해 와 인 스 턴 스 애플 리 케 이 션 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Vuex 상태 기 애플 리 케 이 션 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 희 를 많이 사랑 해 주세요!

    좋은 웹페이지 즐겨찾기