Vue 3: Vuex 또는 Vuex 미만

7845 단어 vuevuexwebdev
저는 최근에 Vue3를 깊이 연구하고 있습니다.많은 사람들이 Vue의 합성 API에서 Vuex를 사용할지 여부를 토론하는 것 같다.
그중의 몇 가지 옵션을 보고 원형을 만든 후에 저는 여러분과 제 의견을 공유하고 싶습니다.이 글에서 나는 서로 다른 전략 (Vuex 포함) 을 되돌아보고 모든 전략의 장단점을 토론할 것이다.

베이스라인


간단한 Vue 응용 프로그램에서 시작하여 Vue CLI의 새 버전입니다.Vue 3을 통해 Vuex 및 라우터를 사용합니다.이 프로젝트를 플레이하려면 Github에서 다음을 찾을 수 있습니다.

https://github.com/shawnwildermuth/VueCompositionBinding


URL에서 데이터를 읽을 수 있는 간단한 코드를 만드는 것이 목표입니다. (무료 RestCountries API 사용) 데이터를 되돌려주는 로컬 복사본을 삭제할 수 있습니다.나는 이 기능을 세 가지 방식으로 실현할 것이다. (간단한 공장으로서 공유 구성 요소로서 마지막은 Vuex에서 그 장단점을 토론할 것이다.)

왜 안 섞지?


우리가 시작하기 전에 나는 왜 직접 혼합기를 사용하지 않습니까?가장 큰 이유는 Vue 3에서 혼합이 지원되지 않거나 합성 API에 더 적합하기 때문입니다.그럴 필요가 없기 때문이다.작성 API의 주요 목표는 작성 어셈블리를 허용하는 것입니다.혼혈은 이런 구도를 허용하는 필수 조건이다.
왜 섞어야 돼요?이것은 모두 이 바늘에 관한 마력이다.옵션 API(Vue 2의 기본값)에서 모든 것이 정상입니다. 왜냐하면 Vue의 일부 마력은 데이터와 API의 다른 부분을 신기한 바늘에 전달하기 때문입니다.예:
export default {
  data: () => {
    return {
      moniker: ""
    };
  },
  methods: {
    setCampFromMoniker() {...},
    onCampChange() {
      this.setCampFromMoniker(this.moniker);
    }
  }
};

그리고 options API의 데이터 부분에서 되돌아온 데이터는 접근할 수 있도록 방법 내의this 바늘에 통합됩니다.mixin을 사용하면 이 포인터에 데이터/메서드를 추가할 수 있는 확장자를 만들 수 있습니다.
export default {
  mixins: [myMixIn],
  data: () => {
    return {
      moniker: ""
    };
  },
  methods: {
    setCampFromMoniker() {...},
    onCampChange() {
      this.setCampFromMoniker(this.moniker, this.someDataFromMixin);
    }
  }
};

조합 API에서 이것은 불필요한 것이다. 왜냐하면 우리는 설정 함수에서 구성 요소를 조합할 수 있기 때문이다.이곳의 비결은 당신이 원하는 모든 것을 가져오고 사용할 수 있다는 것이다. 이 바늘이 닫혀서 바뀌었기 때문에 모두 일을 할 수 있다는 것이다.
export default {
  setup() {

    // Introduce a local variable
    const name = ref("Shawn");

    function save () {
      // Can use the locally scoped variable as it becomes a closure
      alert(`Name: ${name.value}`);
    };

    return {
      name,
      save
    };
  },
};

이것은 기본적으로save 함수로 하여금 명칭 범위 (예를 들어 패키지 닫기) 를 공유하게 함으로써 이루어진 것이며, save 함수만 필요하다면 계속 존재할 것을 보장한다.따라서 우리는 혼합할 필요가 없다. 왜냐하면 우리는 대상을 범위에 도입할 수 있기 때문이다.마법이 없어...그냥 가방 닫아.이것은 우리로 하여금 최초의 토론으로 돌아가게 한다...

공장.


나는 공장이 기능을 구성하는 흔한 모델이라고 생각한다.다음은 간단한 예입니다.
// Factory Pattern
import axios from "axios";
import { ref } from "vue";

export default function () {

  const countries = ref([]);

  async function load() {
    let result = await axios.get("https://restcountries.eu/rest/v2/all");
    countries.value.splice(0, countries.value.length, ...result.data);
  }

  function removeItem(item) {
    let index = countries.value.indexOf(item);
    if (index > -1) {
      countries.value.splice(index, 1);
    }
  }

  return {
    countries,
    load,
    removeItem
  };
}

그리고 다음과 같이 사용합니다.
// Inside Component
import dataFactory from "../factories/data";
import { onMounted, computed } from "vue";

export default {
  setup() {
    let { load, removeItem, countries } = dataFactory();

    onMounted(async () => await load());

    return {
      countries,
      removeItem
    };
  },
};

데이터 공장을 호출함으로써 우리는 요소를 생성하고 ("let"성명 참조) 우리의 범위에 도입하고 있습니다.만약 이 공장들이 필요할 때 우리의 논리적 중용 가능한 부분을 구성할 수 있다면, 우리는 약간의 부분이 있을 것이다.
공장은 위대하지만, 모든 상황에서, 그것들은 새로운 실례를 만들어 낼 것이다.이것은 당신이 원하는 것일 수도 있지만, 크로스 보기로 데이터를 공유하는 것은 매우 번거로울 수도 있습니다.코드를 얻고 실행하면 Factory Component의 두 가지 단독 사례를 사용하면 데이터를 공유하지 않습니다.

인스턴스 공유


또 다른 선택은 코드를 공유해야 할 때 공유 실례를 사용하는 것이다.예:
// Shared
import axios from "axios";
import { ref } from "vue";

export let countries = ref([]);

export async function load() {
  if (countries.value.length === 0) {
    let result = await axios.get("https://restcountries.eu/rest/v2/all");
    countries.value.splice(0, countries.value.length, ...result.data);
  }
};

export function removeItem(item) {
  let index = countries.value.indexOf(item);
  if (index > -1) {
    countries.value.splice(index, 1);
  }
}

export default {
  countries, 
  load,
  removeItem
};

가져올 때 되돌아오는 실례를 만들고 있습니다. 공장처럼 만들지 않습니다.공유해야 할 데이터가 하나 이상 있을 때 효과가 좋습니다.이 방법을 사용하는 것은 공장 방법과 유사합니다.
// Shared
import { load, removeItem, countries } from "../shared/data";
import { onMounted } from "vue";

export default {
  setup() {

    onMounted(async () => await load());

    return {
      countries,
      removeItem
    };
  },
};

이것은 응용 프로그램의 작은 분리 부분에 적용되는 Vuex의 간단한 버전입니다.그러나 내가 보기에 그것은 결코 Vuex를 완전히 대체할 수 없다.

Vuex 회사


문제는 Vuex가 몇 가지 서비스를 제공했다는 것이다...녀석들이 필요할지도 몰라.사실, 나는 Vuex를 전문적으로 사용하여 상태의 모든 변화(예를 들어 돌연변이)가 고의로 발생한 것을 확보한다.Vuex를 위해 엄격한 능력을 사용하는 것이 공유 상태의 관건입니다.
Vue에서 간단한 응용 프로그램을 만들 때 Vuex가 과도하게 사용될 수 있습니다.예를 들어, 매우 간단한 예제에서 Vuex는 다음과 같습니다.
import { createStore } from 'vuex'
import axios from "axios";

export default createStore({
  state: {
    countries: []
  },
  mutations: {
    setCountries: (state, items) => state.countries.splice(0, state.countries.length, ...items),
    removeItem: (state, item) => {
      let index = state.countries.indexOf(item);
      if (index > -1) {
        state.countries.splice(index, 1);
      }
    },
  },
  actions: {
    load: async ({commit}) => {
      let result = await axios.get("https://restcountries.eu/rest/v2/all")
      commit("setCountries", result.data);
    }
  }
})

불러오기와 단독 돌연변이는 하나의 동작을 필요로 하는데, 이것은 확실히 코드의 복잡성을 증가시켰다.의심의 여지가 없다단, 목표가 데이터 공유일 뿐이라면 공유 구성 요소가 더 좋습니다.그러나 응용 프로그램이 증가함에 따라 (귀속이 더욱 복잡해짐) Vuex의 엄격성은 가치가 있다고 생각합니다.다행히도 작성 API에서 Vuex를 사용하는 것이 더 간단합니다(추가 도움말 없음).
import store from "../store";
import { onMounted, computed } from "vue";

export default {
  setup() {

    const countries = computed(() => store.state.countries);
    onMounted(() => store.dispatch("load"));

    const removeItem = (item) => store.commit("removeItem", item); 

    return {
      countries,
      removeItem
    };
  },
};

상태를 사용하려면 일반적으로 계산 값에 포장해야 한다(그림 참조).동작과 돌연변이를 호출하는 것은 그것을 포장해야 한다는 것을 의미한다. (비록 일반적인 모델이나 조수 라이브러리가 그것들을 간소화할 수 있다고 생각하지만)하지만 실제로는 코드가 많지 않다.이것은 응용 프로그램 수준 (또는 모듈 수준) 상태를 처리하는 데 도움을 주기 위한 것이 아닙니다.나는 이 점을 할 수 있는 유일한 방법이 있다고 생각하지 않지만, Vuex 아기와 목욕물을 함께 버리지 마세요.
만약 네가 여기서 나의 논리를 폭로할 수 있다면, 어서 오세요.만약 내가 틀렸다면, 나는 매우 기쁠 것이다.

      This work by [Shawn Wildermuth](http://wildermuth.com) is licensed under a [Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License](http://creativecommons.org/licenses/by-nc-nd/3.0/).  
      Based on a work at [wildermuth.com](http://wildermuth.com).
이 글을 좋아하신다면 Shawn 강의 Pluralsight 를 참조하십시오.

좋은 웹페이지 즐겨찾기