티스토리 뷰
안녕하세요.
이번 올릴 주제는 mixin 을 이용하여 공통으로 사용하는 로직을 여러 component에서 공유하는 방법입니다.
중복을 제거하여 component의 size도 줄이고 코드가 분산되지 않아 유지보수성도 높일 수 있습니다. :)
mixin에 대한 설명은 vuejs.org에 아래와 같이 설명되어 있습니다.
-
전달인자:
- {Object} mixin
-
사용방법:
전역으로 mixin을 적용합니다. 생성된 모든 Vue 인스턴스에 영향을 줍니다. 플러그인 작성자가 컴포넌트에 사용자 정의 동작을 주입하는데 플러그인을 사용할 수 있습니다. 애플리케이션 코드에서는 추천하지 않습니다.
https://kr.vuejs.org/v2/api/#Vue-mixin
솔직히 처음에 보고 무슨 말인지 잘 이해하질 못했었습니다.
그런데 vue 에 대해 여러 포스팅을 참고하다가 아래 글을 보고 눈이 띄여서 mixin을 적용해 보게 되었습니다.
https://woowabros.github.io/experience/2018/06/07/vue-story-of-baminchan.html
제가 mixin을 적용한 방법은 두가지 입니다.
1. 전역 mixin
제가 사용하는 method 중에 모든 component에서 동일하게 사용하는 method가 하나 있습니다.
원래는 각 component 마다 method 부분에 해당 로직을 작성했는데 아래와 같이 처리하여 중복을 제거했습니다.
- main.js
import Vue from 'vue'
import { router } from './router'
import { sync } from 'vuex-router-sync'
import store from './store/store'
sync(store, router)
Vue.mixin({
methods: {
showMessage(msg, type) {
if (msg) this.$message({type: type || 'success', showClose: true, message: msg})
}
}
})
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
위의 Vue.mixin 부분을 보시면 되며 이렇게 함으로써 showMessage라는 method는 component별 정의를 하지 않아도 사용할 수 있게 되었습니다.
2. 로직 재활용
script 의 구조는 거의 유사하지만 화면의 구조는 다른 두개의 component 가 있다고 가정해 보겠습니다.
- Sample.vue
<template>
<v-datatable v-model="items" @changed="change"/>
</template>
<script>
export default {
data () {
return {
items: []
}
},
methods: {
change () {
console.log('items changed')
}
}
}
</script>
- Sample2.vue
<template>
<v-input v-model="items" @changed="change" @input="input"/>
</template>
<script>
export default {
data () {
return {
items: []
}
},
methods: {
change () {
console.log('items changed')
},
input () {
console.log('value input')
}
}
}
</script>
제가 mixin을 모를때 까지는 위와 같은 경우 v-if 를 사용해서 작성하였습니다만 코드가 길어져서 이후 유지보수가 힘들어 지는 문제점이 있었습니다. ( 사실 위에 처럼 코드가 단순하다면 그냥 v-if를 사용하는게 더 좋습니다.)
이제 mixin을 사용해서 코드를 분리해 봅니다.
- sample.js
export default {
data () {
return {
items: []
}
},
methods: {
change () {
console.log('items changed')
}
}
}
- Sample.vue
<template>
<v-datatable v-model="items" @changed="change"/>
</template>
<script>
const js = require('./sample.js')
export default {
mixins: [js.default]
}
</script>
- Sample2.vue
<template>
<v-input v-model="items" @changed="change" @input="input"/>
</template>
<script>
const js = require('./sample.js')
export default {
mixins: [js.default],
methods: {
input () {
console.log('value input')
}
}
}
</script>
이렇게 js 를 분리하고 각 component 에서 mixin으로 사용할 수 있어 공통된 부분은 건드리지 않고 재활용 할 수 있게 되었습니다.
감사합니다.
'dev > vue' 카테고리의 다른 글
Vue 라이브러리 NPM 배포 및 사이즈 줄이기 (0) | 2021.03.05 |
---|---|
vue ag Grid 합계 지정 하기 (0) | 2020.07.28 |
Vue.js를 웹서버 없이 서비스 할때 페이지 변경사항 적용 방법 (2) | 2020.06.09 |
Vue에서 다국어 처리 - DB 로 다국어 관리 (2) | 2020.05.29 |
Vue에서 다국어 처리 - JSON 파일을 이용한 관리 (0) | 2020.05.28 |
- Total
- Today
- Yesterday
- AVD
- vue ios
- ag grid
- 다국어
- v-iterator
- nativescript-vue
- vs code fultter debug
- 긴급재난지원금
- vuex-persistedstate
- vue
- vs code flutter
- dynamic component
- Add AVD
- MariaDB
- 로그
- 에뮬레이터
- vue android
- 갤럭시 에뮬레이터
- Android Studio Emulator
- ec2
- session stroage
- vue mobile
- 경로 초기화
- 한글 like
- Galaxy Emulator
- aws
- i18n
- 플러터 디버그
- Vue 다국어
- ag-grid
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |