๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ปWEB FrontEnd/ํ”„๋ ˆ์ž„์›Œํฌ Vue

์žฌ์‚ฌ์šฉ & ์ปดํฌ์ง€์…˜(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 = {
  created: function () {
    this.hello()
  },
  methods: {
    hello: function () {
      console.log('hello from mixin!')
    }
  }
}

// mixin์„ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ ์ •์˜
var Component = Vue.extend({
  mixins: [myMixin]
})

var component = new Component() // => "hello from mixin!"

 

2. ์˜ต์…˜ ๋ณ‘ํ•ฉ

  • ๋ฏน์Šค์ธ์—์„œ ์„ ์–ธํ•œ ์†์„ฑ์„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋‹ค์‹œ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ์ปดํฌ๋„ŒํŠธ์— ์„ ์–ธ๋œ ๊ฐ’์„ ์šฐ์„ ํ•˜์—ฌ ๋ณ‘ํ•ฉ๋œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด data ์˜ค๋ธŒ์ ํŠธ์˜ ๋‚ด์šฉ์ด ์ƒ์ถฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ์— ์„ ์–ธ๋œ data ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์šฐ์„ ์œผ๋กœ ํ•˜์—ฌ ์žฌ๊ท€์ ์œผ๋กœ ๋ณ‘ํ•ฉ๋œ๋‹ค.
var mixin = {
  data: function () {
    return {
      message: 'hello',
      foo: 'abc'
    }
  }
}

new Vue({
  mixins: [mixin],
  data: function () {
    return {
      message: 'goodbye',
      bar: 'def'
    }
  },
  created: function () {
    console.log(this.$data)
    // => { message: "goodbye", foo: "abc", bar: "def" }
  }
})

๊ฐ™์€ ์ด๋ฆ„์˜ ํ›… ํ•จ์ˆ˜๊ฐ€ ๋ฐฐ์—ด์— ๋ณ‘ํ•ฉ๋˜์–ด ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์ง€๋งŒ, mixin ํ›…์€ ์ปดํฌ๋„ŒํŠธ ์ž์ฒด์˜ ํ›… ์ด์ „์— ํ˜ธ์ถœ๋œ๋‹ค.

var mixin = {
  created: function () {
    console.log('mixin hook called')
  }
}

new Vue({
  mixins: [mixin],
  created: function () {
    console.log('component hook called')
  }
})

// => "mixin hook called"
// => "component hook called"

 

3. ์ „์—ญ Mixin

mixin์€ ์ „์—ญ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, mixin์„ ์ „์—ญ์œผ๋กœ ์ ์šฉํ•˜๋ฉด ์ดํ›„์— ์ƒ์„ฑ๋œ ๋ชจ๋“  Vue ์ธ์Šคํ„ด์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

// `myOption` ์‚ฌ์šฉ์ž ์ •์˜ ์˜ต์…˜์„ ์œ„ํ•œ ํ•ธ๋“ค๋Ÿฌ ์ฃผ์ž…
Vue.mixin({
  created: function () {
    var myOption = this.$options.myOption
    if (myOption) {
      console.log(myOption)
    }
  }
})

new Vue({
  myOption: 'hello!'
})
// => "hello!"