v-model과 Vuex 스토어를 우아하게 사용하는 방법
v-model 및 vuex 스토어를 사용할 수 있는 깨끗한 방법을 찾습니다.
Vuex는 여러 도우미 방법을 제공하지만 v-model과 함께 사용할 경우 다소 번거롭습니다.
현재 v-model과 모듈화된 스토어를 사용하는 방법은 다음과 같습니다.
computed: {
type: {
get() {
return this.$store.state.mymodule.type;
},
set(newValue) {
this.$store.dispatch('mymodule/setType', newValue)
}
}
이것은 효과가 있지만, 나는 보일러 플레이트 코드를 피하기 위해 vuex 도우미의 이익을 얻는 것이 더 낫다는 것을 알았다.$store, 모듈명 등)
네, 먼저 모듈 이름을 삭제하겠습니다.Vuex는 뛰어난 create Namesched를 제공합니다.모듈화된 도우미를 반환하는 도우미.
사용방법:
import { createNamespacedHelpers } from 'vuex'
const { mapState, mapActions } = createNamespacedHelpers('some/nested/module')
이것으로 모듈 전용의 mapState 및 mapActions 함수가 깨끗해졌습니다.
computed: {
...mapState(['type']) // No need here to specify module name :)
}
꽤 멋진데, mapState는 기능밖에 없기 때문에 데이터를 갱신하기 위한 디스패치 기능을 설정할 수 없습니다.
v-model을 사용하는 경우 도우미를 사용할 수 없습니다.mapState를 사용할 수 없기 때문에 createNamesched를 사용할 수 없습니다.도우미.
그래서 : Vuex 도우미 기능과 v-model의 장점을 어떻게 함께 사용할 수 있을까요?
그럴수는 없어요.helper를 v-model과 결합하는 우아한 방법은 없습니다.하지만 v-model은 통사적인 설탕일 뿐이므로 아마도 가장 읽기 쉬운 방법은 도우미를 사용하는 것이다.
computed: {
...mapGetters('path/to/module', ['type'])
},
methods: {
...mapActions('path/to/module', ['setType'])
}
v-model 제외
<input :value="type" @input="setType">
내가 마침내 가장 읽을 수 있는 방법은 다음과 같습니다.
import { createNamespacedHelpers } from 'vuex'
const { mapState, mapActions } = createNamespacedHelpers('some/nested/module')
다음과 같이 사용됩니다.
computed: {
...mapGetters(['type'])
},
methods: {
...mapActions(['setType'])
}
v-model이 없으면
<input :value="type" @input="setType($event.target.value)">
이거 먹어봐.
// in some utils/vuex.js file
export const mapSetter = (state, setters = {}) => (
Object.keys(state).reduce((acc, stateName) => {
acc[stateName] = {
get: state[stateName],
};
// check if setter exists
if (setters[stateName]) {
acc[stateName].set = setters[stateName];
}
return acc;
}, {})
);
컴포넌트 내.vue 파일
import { mapSetter } from 'path/to/utils/vuex.js';
...
export default {
name: 'ComponentName',
computed: {
...mapSetter(
mapState({
result: ({ ITEMS }) => ITEMS.result,
total: ({ ITEMS }) => ITEMS.total,
current: ({ ITEMS }) => ITEMS.page,
limit: ({ ITEMS }) => ITEMS.limit,
}),
{
limit(payload) {
this.$store.dispatch({ type: TYPES.SET_LIMIT, payload });
},
},
)
},
}
이제 v-model 바인딩이 작동합니다.
언급URL : https://stackoverflow.com/questions/54439712/how-to-elegantly-use-v-model-and-vuex-store
'programing' 카테고리의 다른 글
vuex 또는 redux의 코드에 영향을 미치는 UI 측을 배치할 위치를 지정하십시오. (0) | 2022.07.12 |
---|---|
Vuex에서 Vuetify 탐색 드로어가 표시되지 않음 (0) | 2022.07.12 |
C에서 바이트 배열을 16진수 문자열로 변환하려면 어떻게 해야 합니까? (0) | 2022.07.11 |
Vue __ob_ 속성이 개체에 있고 json 구문 분석 오류를 생성합니다. (0) | 2022.07.09 |
[Vue warn] :방향 교차 바인딩 해제 후크 오류: "TypeError: 정의되지 않은 속성 'observer'를 읽을 수 없습니다" (0) | 2022.07.09 |