- 플러그인은 일반적으로 Vue에 전역 수준의 기능을 추가하는 self-contained 코드입니다. 객체 또는함수를 install()메소드를 통해 제공합니다.
- 플러그인은 $를 붙여서 생성합니다.
// plugins/i18n.js
export default {
install: (app, options) => {
// 플러그인 코드는 여기에
}
}
실습을 통해 플러그인에 대해 조금 더 자세히 알아보도록 하겠습니다.
먼저, src디렉토리 안에 plugins라는 폴더를 만들어줍니다.
export default {
install(app) { //🐥(1)
//app은 현재 vue프로젝트를 의미합니다.
//전역속성에 등록 //🐥(2)
app.config.globalProperties.$heropy =( msg = 'Heropy') => {
return `Hello ${msg}!!`
}
}
}
install
을 할 때첫번 째 매개변수로 vue.js가 어떤 객체 데이터를 넣어주게 됩니다. 예제에서는 명시적으로 App으로 받도록 하겠습니다.
App을 통해 들어오는 데이터는 main.js에서 createApp을 통해 반환되는 현재 우리의 Vue프로젝트를 의미합니다. 즉 우리의 현재 vue프로젝트를 plugin에 연결을 해주는 것입니다.
vue.js공식문서-애플리케이션 설정 중 전역속성들 (globalProperties)을 참고해 공부를 하는 것을 권장드립니다.
아래와 같이 config.globalProperties
를 통해 내 프로젝트에서 글로벌하게 쓸 속성을 등록 할 수 있습니다.
export default {
install(app) {
app.config.globalProperties.$heropy <= 123456
}
}
플러그인을 연결한 후 우리 프로젝트에 정상적으로 등록되었는지 App.vue에서 created를 통해 한번 확인해볼 수 있습니다.
<template>
App.vue
</template>
<script>
export default {
created() {
console.log(this.$heropy)
}
}
</script>
⭐보통 vue.js플러그인은 앞에 $를 붙여 구분지을 수 있도록 해줍니다.
import { createApp } from 'vue'
import heropy from './plugins/heropy'
import App from './App.vue'
createApp(App)
//use메소드를 통해 생성한 파일을 연결해줍니다
.use(heropy)
.mount('#app')
<template>
App.vue
</template>
<script>
export default {
data() {
return {
heropy: ''
}
},
created() {//$와 함께 사용
console.log(this.$heropy)
}
}
</script>
Vue vs Vuex 비교
- State: 반응형 data라고 생각(상태)
- Getters : computed라고 생각
- Mutations, Actions: methods
vuex는 개발에서도 사용을 하기 때문에 일반의존성으로 설치를 해줍니다.
설치
$ npm install vuex@next
연결
import { createStore } from 'vuex'
// Create a new store instance.
const store = createStore({
state () {
return {
count: 0
}
},
mutations: {
increment (state) {
state.count++
}
}
})
store이라는 디렉토리를 만들어 그 안에서 store을 관리해보도록 하겠습니다.
import {createStore} from 'vuex'
export default createStore({
})
import { createApp } from 'vue'
import store from './store'
import App from './App.vue'
createApp(App)
.use(store)
.mount('#app')
⭐vue컴포넌트에서 store접근 방법
- store쪽의 데이터에 접근하기 위해서는 computed를 사용해야합니다.
- computed에서
this.$store.commit(mutations에 정의된 함수)
를 이용해 store에 접근할 수 있습니다.- ✨단, mutaions를 바로 사용하는 것보다 컴포넌트에서 사용을 할 actions을 따로 만들어 사용하게 하는 것이 좋습니다. 즉, mutation는 내부에서만 사용하는 것이 좋습니다
- 컴포넌트에서 actions에 접근하기 위해 dispatch메소드를 사용할 수 있습니다.
this.$store.dispatch(actions에 정의된 함수)
- mutation안에 정의된 함수의 인수로 state와 payload를 넘길 수 있습니다.
- const { state, getters, commit, dispatch } = context
⭐store의 mutations
- store쪽의 데이터를 변화시켜주기 위해서는 mutations를 이용해야합니다.
- 또한 mutation에서는 this가 아니라 state라는 객체를 매개변수로 받아 접근을 할 수 있습니다.
App.vue<template> {{ heropy }} <button @click="increase"> Increase </button> </template>
<script> export default { computed: { heropy() { return this.$store.state.count } }, methods: { increase() { //⭐vue컴포넌트에서 commit을 통해 mutations에 바로 접근하는 것은 권장하지 않습니다. // this.$store.commit('increase') //⭐ actions를 따로 만들어 dispatch를 이용해 접근하는 것을 권장합니다. this.$store.dispatch('increase') } } } </script>
index.js
import { createStore } from 'vuex'
export default createStore({
state() {
return {
count: 0
}
},
mutations: {
//만약, 인수가 있는 함수를 받는 경우 payload를 이용해 받을 수 있습니다.
increase(state, payload) {
state.count+=1
}
},
actions: {
increase(/*context*/ {commit}) {
// const { state, getters, commit, dispatch} = context
commit('increase')
}
}
})
⭐Core Concepts
- state(data), Getter(computed)는 반응형데이터로 속성처럼 사용하면 됩니다.
- Mutations와 Actions(methods)는 함수로 호출을 해주어야합니다.(함수호출은 commit과 dispatch로 할 수 있습니다.)
- commit (Mutations)
- dispatch (Actions)
$ npm info vuex
vite공식문서
['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json']
의 경우 확장자명 생략이 가능합니다.
- vue는 확장자명을 명시하는 것을 권장합니다.