๐ปWEB FrontEnd/ํ๋ ์์ํฌ Vue (17) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ ์ฌ์ฌ์ฉ & ์ปดํฌ์ง์ (2) - ์ฌ์ฉ์ ์ง์ ๋๋ ํฐ๋ธ ์ฐธ๊ณ ํ ์ฌ์ดํธ v3.vuejs-korea.org/ko-kr/guide/custom-directive.html 1. ์ฌ์ฉ์ ์ง์ ๋๋ ํฐ๋ธ Vue๋ ์ฝ์ด์ ํฌํจ๋ ๊ธฐ๋ณธ ๋๋ ํฐ๋ธ ์ธํธ ์ธ์๋ ์ฌ์ฉ์ ์ ์ ๋๋ ํฐ๋ธ๋ฅผ ๋ฑ๋กํ ์ ์๋ค. 1) ๋๋ ํฐ๋ธ ๋ฑ๋ก ๋ฐฉ๋ฒ ์ฌ์ฉ์ ์ง์ ๋๋ ํฐ๋ธ๋ฅผ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค. ์ ์ญ์ผ๋ก ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ ๋ก์ปฌ ๊ฒํฌ๋ํธ์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ ์ ์ญ ์ ์ธ Vue ์ธ์คํด์ค ์ ์ธํ๊ธฐ ์ ์ Vue.directive ์ ์ญ ๋ฑ๋ก์ ์์ผ์ค๋ค. // ์ ์ญ ์ฌ์ฉ์ ์ ์ ๋๋ ํฐ๋ธ v-focus ๋ฑ๋ก Vue.directive('focus', { // ๋ฐ์ธ๋ฉ ๋ ์๋ฆฌ๋จผํธ๊ฐ DOM์ ์ฝ์ ๋์์ ๋... inserted: function (el) { // ์๋ฆฌ๋จผํธ์ ํฌ์ปค์ค๋ฅผ ์ค๋๋ค el.focus() } }.. ์ฌ์ฌ์ฉ & ์ปดํฌ์ง์ (1) - ๋ฏน์ค์ธ ๋ฏน์ค์ธ์ ์ด๋ฆ์ด ๋ํ๋ด๊ณ ์๋ ๊ฒ์ฒ๋ผ ์ปดํฌ๋ํธ์ ๋ฌด์ธ๊ฐ๋ฅผ ์์ด ์ํ๋ ๊ฒ์ ๊ตฌํํ๋ ๊ธฐ๋ฅ์ด๋ค. ๋ฏน์ค์ธ์ ๊ตฌํํ๊ณ ๋์์ํค๋ ๊ณผ์ ์ ์์๋๋ก ์ฐ๋ฉด ์๋์ ๊ฐ์ด ์ ๋ฆฌํ ์ ์๋ค. 1. ๋ฏน์ค์ธํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ 2. ์ปดํฌ๋ํธ์ ๊ฐ์ฒด๋ฅผ ๋ฏน์ค์ธํ๊ณ 3. ๋๋จธ์ง ๋ถ๋ถ์ ๊ตฌํํด ์์ฑํ๋ค ์ฐธ๊ณ ํ ์ฌ์ดํธ kr.vuejs.org/v2/guide/mixins.html velog.io/@bluestragglr/Vue.js-Mixin 1. ๊ธฐ์ด Mixins๋ Vue ์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ์ ๋ฐฐํฌํ๋ ์ ์ฐํ ๋ฐฉ๋ฒ์ด๋ค. mixin ๊ฐ์ฒด๋ ๋ชจ๋ ๊ตฌ์ฑ ์์ ์ต์ ์ ํฌํจํ ์ ์๋ค. ์ปดํฌ๋ํธ์ mixin์ ์ฌ์ฉํ๋ฉด ํด๋น mixin์ ๋ชจ๋ ์ต์ ์ด ์ปดํฌ๋ํธ์ ๊ณ ์ ์ต์ ์ “ํผํฉ”๋๋ค. // mixin ๊ฐ์ฒด ์์ฑ var myMixin .. ์ธ๋ผ์ธ ์คํ์ผ ๋ฐ์ธ๋ฉ 1. ๊ฐ์ฒด ๊ตฌ๋ฌธ 1) v-bind ์ธ๋ผ์ธ ์คํ์ผ ๋ฐ์ธ๋ฉ ์ด์ฉ v-bind:style ๊ฐ์ฒด ๊ตฌ๋ฌธ์ ๋งค์ฐ ์ง์ค์ ์ผ๋ก, ๊ฑฐ์ CSS ์ฒ๋ผ ๋ณด์ด์ง๋ง JavaScript ๊ฐ์ฒด์ด๋ค. ์์ฑ ์ด๋ฆ์ camelCase์ kebab-case๋ฅผ ์ฌ์ฉํ ์ ์๋ค. data: { activeColor: 'red', fontSize: 30 } 2) ์คํ์ผ ๊ฐ์ฒด์ ์ง์ ๋ฐ์ธ๋ฉ ํ์ฌ ํ ํ๋ฆฟ์ด ๋ ๊ฐ๊ฒฐํ๋๋ก ๋ง๋๋ ๊ฒ์ด ์ข๋ค. data: { styleObject: { color: 'red', fontSize: '13px' } } 2. ๋ฐฐ์ด ๊ตฌ๋ฌธ v-bind:style์ ๋ํ ๋ฐฐ์ด ๊ตฌ๋ฌธ์ ์ด์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ ์คํ์ผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค. 3. ์๋ ์ ๋์ฌ v-bind:style์ ๋ธ๋ผ์ฐ์ ๋ฒค๋ ์ ๋์ด๊ฐ ํ์ํ CSS ์์ฑ (์: tr.. ํด๋์ค ๋ฐ์ธ๋ฉ v-bind ๋๋ ํฐ๋ธ๋ฅผ ์ฌ์ฉํ ๋ class์ style์ ์ฌ์ฉํด ์ํ๋ ์คํ์ผ๋ง์ ํ ์ ์๋ค. v-bind:class="ํด๋์ค๋ช " v-bind:class="{ ํด๋์ค๋ช : ์กฐ๊ฑด }" ์์ฒ๋ผ v-bind:class๋ ๋ฌธ์์ด๊ณผ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด์ ๋ ๋ค ๋ฐ์ ์ ์๋ค. ๊ฐ์ฒด๋ฅผ ๋ฐ์ ๊ฒฝ์ฐ์๋ ํด๋์ค๋ช ์ ๊ฐ์ฒด์ ์์ฑ ํค์, ํด๋น ํด๋์ค๊ฐ ์ ์ฉ๋์ผ ํ๋ ์กฐ๊ฑด์ด ์์ฑ ๊ฐ์ผ๋ก ๋ค์ด๊ฐ๋ค. 1. ๊ฐ์ฒด ๊ตฌ๋ฌธ 1) v-bind ํด๋์ค ๋ฐ์ธ๋ฉ์ ์ด์ฉํ ํด๋์ค ํ ๊ธ ํด๋์ค๋ฅผ ๋์ ์ผ๋ก ํ ๊ธํ๊ธฐ ์ํด v-bind:class์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ์ ์๋ค. ์๋ ๊ตฌ๋ฌธ์ active ํด๋์ค์ ์กด์ฌ ์ฌ๋ถ๊ฐ ๋ฐ์ดํฐ ์์ฑ isActive์ ์ฐธ ์์ฑ์ ์ํด ๊ฒฐ์ ๋๋ค. 2) ์ฌ๋ฌ ํด๋์ค ํ ๊ธ ์ฌ๋ฌ ํด๋์ค๋ฅผ ํ ๊ธํ๋ ค๋ฉด ์๋ ์ฝ๋์ ๊ฐ์ด ๊ฐ์ฒด์ ํ๋๋ฅผ.. v-model ๋ฐ์ธ๋ฉ ์บกํดํ๊ต๋์ ๊ฒ์๋ฌผ์ ์ฐธ๊ณ ํด ์์ฑ๋ ๋ด์ฉ์ ๋๋ค. 1. v-model v-model ์ง์์๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ชจ๋ธ์ ํผ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ ๋ ์ฌ์ฉ๋๋ค. โป ๋ฐ์ธ๋ฉ ์ง์์ v-bind v-model ์ฃผ๋ก HTML ์์ฑ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉ ์ฃผ๋ก ์ ๋ ฅ๊ณผ ํผ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉ 2. v-model ์ฌ์ฉ๋ฒ 1) v-model ์ฌ์ฉํด ๋ฐ์ธ๋ฉ new Vue({ data: { inputText: '' } }) 2) v-bind์ v-on์ ์ฌ์ฉํด ๋ฐ์ธ๋ฉ new Vue({ data: { inputText: '' }, methods: { updateInput: function(event) { var updatedText = event.target.value; this.inputText = updatedText; } } }) 1๋ฒ ๋ฐฉ๋ฒ๊ณผ 2.. CSR์ SSR์ ์ฅ๋จ์ ์ ๊ธฐ๋ณธ์ผ๋ก ๋ฐฐ์ด ๋ด์ฉ์ ๋๋ค. ๋ชฉ์ฐจ SPA - CSR MPA - SSR ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ SPA์ SSR๋ก ๋๋ ์ ์๋ค. 1. SPA ์ฒซ ์์ฒญ์ ๋ฑ ํ ํ์ด์ง๋ง ๋ถ๋ฌ์ค๊ณ ํ์ด์ง ์ด๋์ ๊ธฐ์กด ํ์ด์ง์ ๋ด๋ถ๋ฅผ ์์ ํด์ ๋ณด์ฌ์ฃผ๋ ๋ฐฉ์ SPA(single page application)์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง(CSR, client side rendering) ๋ฐฉ์์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์๋ช ์ฃผ๊ธฐ ์ค์์ ๋จ ํ ๋ฒ๋ง ๋ฆฌ์์ค๋ฅผ ๋ก๋ฉํ๊ณ , ๊ทธ ํ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ๋๋ง ์๋ฒ์ ํต์ ํ๋ค. ์ฅ์ ์์ฐ์ค๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ ํ์ํ ๋ฆฌ์์ค๋ง ๋ถ๋ถ์ ์ผ๋ก ๋ก๋ฉ ์๋ฒ์ ํ ํ๋ฆฟ ์ฐ์ฐ์ ํด๋ผ์ด์ธํธ๋ก ๋ถ์ฐ ์ปดํฌ๋ํธ๋ณ ๊ฐ๋ฐ ์ฉ์ด ๋ชจ๋ฐ์ผ ์ฑ ๊ฐ๋ฐ์ ์ผ๋์ ๋๋ค๋ฉด ๋์ผํ API๋ฅผ ์ฌ์ฉํ๋๋ก ์ค๊ณ ๊ฐ๋ฅ ๋จ์ JavaScript .. vue์ ๋ฐ์์ฑ reactivity ์ ๊ธฐ๋ณธ์ผ๋ก ๋ฐฐ์ด ๋ด์ฉ์ ๋๋ค. ๋ชฉ์ฐจ 1. ๋ฐ์์ฑ 1-1) vue๊ฐ ๋ณ๊ฒฝ ๋ด์ฉ์ ์ถ์ ํ๋ ๋ฐฉ๋ฒ 1. ๋ฐ์์ฑ vue๊ฐ ๋ฐ์ดํฐ ๋ณํ๋ฅผ ๊ฐ์งํ์ ๋ ์๋์ผ๋ก ํ๋ฉด์ ๋ค์ ๊ฐฑ์ ํ๋ ํน์ฑ ๋ฐ์์ฑ์ ๋ํด ์๋ฉด ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ๋ค์ ์ตํ ์ ์๋ค! ํ๋ ์์ํฌ ๋ด๋ถ์ ์ผ๋ก ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ ๊ฐ์ ๋์ด ๋์ํ๋ ๋ฐฉ๋ฒ ํ๋ฉด์ ๋น ๋ฅด๊ฒ ๊ทธ๋ฆฌ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ์ ๋ถํ๋ฅผ ์ฃผ์ง ์๊ณ ๋์ ์ถ๊ฐ,์ญ์ ํ๋ ๋ฐฉ๋ฒ 1-1) vue๊ฐ ๋ณ๊ฒฝ ๋ด์ฉ์ ์ถ์ ํ๋ ๋ฐฉ๋ฒ Vue ์ธ์คํด์ค์ JavaScript ๊ฐ์ฒด๋ฅผ data ์ต์ ์ผ๋ก ์ ๋ฌํ๋ค. Vue๋ ๋ชจ๋ ์์ฑ์ Object.defineProperty๋ฅผ ์ฌ์ฉํ์ฌ getter/setters๋ก ๋ณํํ๋ค. โป getter / setter ๋ ์ฌ์ฉ์์๊ฒ๋ ๋ณด์ด์ง ์์ผ๋ ์์ฑ์ ์ก์ธ์ค ํ๊ฑฐ๋ ์์ ํ ๋ Vue๊ฐ.. Vuex ์ ๊ธฐ๋ณธ์ผ๋ก ๋ฐฐ์ด ๋ด์ฉ์ ๋๋ค. ๋ชฉ์ฐจ 1. ์ํ ๊ด๋ฆฌ 2. Vuex 3. state 4. Getters & Mutations 5. Actions 6. Vuex ํฌํผ ํจ์ (mapGetters, mapMutations, mapActions ) ์ฐธ๊ณ ํ ์ฌ์ดํธ joshua1988.github.io/web-development/vuejs/vuex-start/ joshua1988.github.io/web-development/vuejs/vuex-getters-mutations/ joshua1988.github.io/web-development/vuejs/vuex-actions-modules/ 1. ์ํ ๊ด๋ฆฌ 1-1) ์ํ ๊ด๋ฆฌ ์ํ ๊ด๋ฆฌ๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ ๊ฐ์ ๋ฐ์ดํฐ ์ ๋ฌ๊ณผ ์ด๋ฒคํธ ํต์ ์ ํ ๊ณณ์์ ๊ด๋ฆฌํ๋ ํจํด์ .. Single File Components ์ฒด๊ณ ์ ๊ธฐ๋ณธ์ผ๋ก ๋ฐฐ์ด ๋ด์ฉ์ ๋๋ค. ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ์๋ฌผ kr.vuejs.org/v2/guide/components.html 1. Single File Components ์ฒด๊ณ .vue ํ์ผ๋ก ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ์ (.vue ํ์ผ 1๊ฐ = ์ปดํฌ๋ํธ 1๊ฐ) 1) .vue ํ์ผ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ ex) "์ปดํฌ๋ํธ๋ช .vue" ํ์ผ {{message}} 2. ์ปดํฌ๋ํธ ์์ฑํ๊ณ ๋ฑ๋กํ๊ธฐ 1) ์ปดํฌ๋ํธ ์์ฑ ํ๋ก์ ํธ ํด๋์ srcํด๋ ๋ฐ์ componentsํด๋ ์์ฑ componentsํด๋ ์์ "์ปดํฌ๋ํธ๋ช .vue"ํ์ผ๋ค์ ์ปดํฌ๋ํธ๋ณ๋ก ์์ฑํด์ค๋ค. .vueํ์ผ ์์ ์ฝ๋๋ ์๋์ ๊ฐ์ด ๋ชจ๋ ์์ฑํด์ค๋ค. header 2) ์ปดํฌ๋ํธ ๋ฑ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ปดํฌ๋ํธ๋ค์ ๋ชจ๋ ์ต์์ ์ปดํฌ๋ํธ์ธ App.vue์ ๋ฑ๋กํด์ผ.. Vue์ template์์ฑ ์ ๊ธฐ๋ณธ์ผ๋ก ๋ฐฐ์ด ๋ด์ฉ์ ๋๋ค. ๋ชฉ์ฐจ 1. ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ(Data Binding) 2. ๋๋ ํฐ๋ธ(Directive) 3. ๊ณ ๊ธ ํ ํ๋ฆฟ ๊ธฐ๋ฒ template์ด๋ ๋ทฐ๋ก ํ๋ฉด์ ์กฐ์ํ๊ธฐ ์ํด ์ ๊ณต๋๋ ๋ฌธ๋ฒ์ด๋ค. template์์ฑ์ HTML, CSS ๋ฑ์ ๋งํฌ์ ์์ฑ๊ณผ ๋ทฐ ์ธ์คํด์ค์์ ์ ์ํ ๋ฐ์ดํฐ ๋ฐ ๋ก์ง๋ค์ ์ฐ๊ฒฐํ์ฌ ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ์์ ๋ณผ ์ ์๋ ํํ์ HTML๋ก ๋ณํํด์ค๋ค. ์ฌ์ฉ์๊ฐ ๋ณผ ์๋ ์์ง๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์ ์ผ๋ก template์์ฑ์์ ์ ์ํ ๋งํฌ์ +๋ทฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ๋ ๊ธฐ๋ฐ์ render()ํจ์๋ก ๋ณํํ๋ค. ๋ณํ๋ reder()ํจ์๋ ์ต์ข ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๊ฒ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ญํ ์ ํ๋ค. - temlate์์ฑ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ 1. ES5 2. ES6 : ์ฑ๊ธ ํ์ผ ์ปดํฌ๋ํธ ์ฒด๊ณ Hello.. ์ด์ 1 2 ๋ค์