Vue: ν† λ‘ : HOCλ₯Ό λ§Œλ“œλŠ” κ°€μž₯ 쒋은 방법

에 λ§Œλ“  2017λ…„ 07μ›” 25일  Β·  40μ½”λ©˜νŠΈ  Β·  좜처: vuejs/vue

버전

2.4.2

μž¬μƒμ‚° 링크

https://jsfiddle.net/o7yvL2jd/

μž¬ν˜„ 단계

vue.js둜 HoCλ₯Ό κ΅¬ν˜„ν•˜λŠ” μ˜¬λ°”λ₯Έ 방법을 μ°Ύκ³  μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ μ ˆν•œ 예λ₯Ό 찾지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.
μ•„λž˜ λ§ν¬λŠ” μ•Œλ €μ§„ HoC κ΅¬ν˜„μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
https://jsfiddle.net/o7yvL2jd/

vue.js둜 HoCλ₯Ό μ–΄λ–»κ²Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?
react.js λ°©μ‹μœΌλ‘œ HoCλ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법을 μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

무엇을 κΈ°λŒ€ν•©λ‹ˆκΉŒ?

λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λœ κ΅¬μ„±μš”μ†Œλ₯Ό λ‹¨μˆœνžˆ λ Œλ”λ§ν•˜λŠ” HoCμž…λ‹ˆλ‹€.
슬둯 및 μ΄λ²€νŠΈκ°€ ν¬ν•¨λœ HoCλŠ” μ •μƒμ μœΌλ‘œ λ Œλ”λ§λ©λ‹ˆλ‹€.

μ‹€μ œλ‘œ 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?

λ Œλ”λ§ν•  μš”μ†Œκ°€ μ—†κ±°λ‚˜ λ Œλ”λ§ μˆœμ„œκ°€ baseComponent와 λ‹€λ¦…λ‹ˆλ‹€.
일뢀 HoC κ΅¬ν˜„μ€ 이벀트 ν•Έλ“€λŸ¬μ—μ„œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

discussion

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ’‹μ•„, κ·Έλž˜μ„œ λ‚˜λŠ” 이것을 더 μ‰½κ²Œ λ§Œλ“œλŠ” 방법을 가지고 λ†€μ•˜λ‹€.

μ—¬κΈ°λ₯Ό λ³΄μ‹­μ‹œμ˜€: https://jsfiddle.net/Linusborg/j3wyz4d6/

APIκ°€ 맀우 λŒ€λž΅μ μΈ 아이디어 μŠ€μΌ€μΉ˜μ΄κΈ° λ•Œλ¬Έμ— λ§Œμ‘±ν•˜μ§€ μ•Šμ§€λ§Œ ν•  수 μžˆμ–΄μ•Ό ν•˜λŠ” λͺ¨λ“  것을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

import { createHOC, createRenderFn, normalizeSlots } from 'vue-hoc'
const Component = {
  props: ['message']
  template: `<p>{{message}}</p>`
}
const HOC = createHOC(Component)

createHOC λŠ” λ‹€μŒμ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  • ꡬ성 μš”μ†Œμ—μ„œ μ†Œν’ˆ 볡사
  • μ μ ˆν•œ 슬둯 해결을 μœ„ν•΄ λΆ€λͺ¨λ‘œλΆ€ν„° $createElement λ₯Ό κ΅ν™˜ν•©λ‹ˆλ‹€.
  • 이름을 μΆ”κ°€ν•˜λ‹€
  • 두 번째 μΈμˆ˜κ°€ μ œκ³΅λ˜μ§€ μ•ŠμœΌλ©΄(μœ„μ˜ μ˜ˆμ™€ 같이) ꡬ성 μš”μ†Œλ₯Ό λ Œλ”λ§ν•˜κ³  μ „λ‹¬ν•©λ‹ˆλ‹€.

    • μ†Œν’ˆ

    • 속성

    • 청취자

    • 일반 슬둯

    • λ²”μœ„ 슬둯

λ¬Όλ‘  κ·Έ μžμ²΄λ‘œλŠ” 그닀지 μœ μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ κ°„λ‹¨ν•œ Component 객체인 두 번째 μΈμˆ˜μ—μ„œ μž¬λ―Έκ°€ λ°œμƒν•©λ‹ˆλ‹€.

λ Œλ”λ§ κΈ°λŠ₯을 직접 μž‘μ„±ν•˜κ³  μ‹Άλ‹€λ©΄ λ‹Ήμ—°νžˆ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. props, attrs λ˜λŠ” listenersλ₯Ό ν™•μž₯ν•˜λ €λŠ” 경우 createRenderFn λ„μš°λ―Έλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μœ„μ—μ„œ μ„€λͺ…ν•œ κΈ°λ³Έ λ Œλ”λ§ κΈ°λŠ₯을 μƒμ„±ν•˜μ§€λ§Œ attrs , props λ˜λŠ” listeners λΆ€λͺ¨λ‘œλΆ€ν„° μ „λ‹¬ν•œ λͺ¨λ“  것을 λ³‘ν•©ν•©λ‹ˆλ‹€.

const HOC = createHOC(Component, {
  mounted() { 
    console.log(`lifecycle hooks work, it's simply component options`) 
  },
  render: createRenderFn(Component, {
    props: {
      message: 'Hello from your HOC!'
    }
  }
})

자체 λ Œλ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λ €λ©΄ normalizeSlots λ„μš°λ―Έλ₯Ό μ‚¬μš©ν•˜μ—¬ 개체λ₯Ό this.$slots μ—μ„œ 전달할 μ μ ˆν•œ λ°°μ—΄λ‘œ λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const HOC = createHOC(Component, {
  render(h) {
    return h(Component, {
      props: { message: 'hi from HOC'}, // nothing from parent will be passed on
    }, normalizeSlots(this.$slots))
  }
})

λŒ“κΈ€ μ›ν•©λ‹ˆλ‹€ :)

λͺ¨λ“  40 λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš” @eu81273

이 ν”„λ‘œμ νŠΈμ— 관심을 κ°€μ Έμ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ κ·€ν•˜μ˜ λ¬Έμ œλŠ” μ‚¬μš©/지원 질문이며 문제 μΆ”μ κΈ°λŠ” 버그 λ³΄κ³ μ„œ 및 κΈ°λŠ₯ μš”μ²­ μ „μš©μœΌλ‘œ μ˜ˆμ•½λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€( κΈ°κ³  κ°€μ΄λ“œ 에 μ„€λͺ…λ˜μ–΄ 있음).

포럼 , μŠ€νƒ μ˜€λ²„ν”Œ 둜 λ˜λŠ” λ””μŠ€μ½”λ“œ μ±„νŒ… 에 μ§ˆλ¬Έν•˜κ³  기꺼이 λ„μ™€λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

FWIW, λ‚˜λŠ” 개인적인 κ΄€μ‹¬μ—μ„œ μ‚΄νŽ΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€. 이것은 100%의 κ²½μš°μ— μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€.

const HOC = WrappedComponent => ({
  props: typeof WrappedComponent === 'function' // accept both a construtor and an options object
    ? WrappedComponent.options.props 
    : WrappedComponent.props,
  render (h) {
    // reduce all slots to a single array again.
    const slots = Object.keys(this.$slots).reduce((arr, key) => arr.concat(this.$slots[key]), []);
    return h(WrappedComponent, {
      attrs: this.$attrs,
      props: this.$props,
      on: this.$listeners,
    }, slots);
 }
});

μ†”λ£¨μ…˜μ— κ°€μž₯ 가깝기 λ•Œλ¬Έμ— κ·€ν•˜μ˜ μ˜ˆμ—μ„œ HOC04λ₯Ό νŽΈμ§‘ν–ˆμŠ΅λ‹ˆλ‹€.

https://jsfiddle.net/Linusborg/o7yvL2jd/22/

νŽΈμ§‘: μ—¬μ „νžˆ 슬둯 문제, 쑰사 쀑...

λ‚˜λŠ” 그것을 ν•΄κ²°ν–ˆμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€ : https://jsfiddle.net/BogdanL/ucpz8ph4/. μŠ¬λ‘―μ€ 이제 ν•˜λ“œμ½”λ”©λ˜μ—ˆμ§€λ§Œ ν•΄κ²°ν•˜κΈ°κ°€ 쉽지 μ•ŠμŠ΅λ‹ˆλ‹€.

μ†”λ£¨μ…˜μ΄ @lbogdan의 방법을 λ”°λ₯΄λŠ” 것 κ°™μ§€λ§Œ createElementλŠ” scopedSlots λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” κ²ƒμ²˜λŸΌ μŠ¬λ‘―μ„ κ°€μ Έμ˜€λŠ” 방법이 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ HoCλ₯Ό λ§Œλ“œλŠ” 것은 _μ—¬μ „νžˆ_ λ§Žμ€ λ…Έλ ₯μž…λ‹ˆλ‹€. λ¦¬μ•‘νŠΈλ₯Ό μ‚¬μš©ν•˜λ©΄ WrappedComponentλ₯Ό μ†Œν’ˆμœΌλ‘œ λ Œλ”λ§ν•˜κΈ°λ§Œ ν•˜λ©΄ λ˜μ§€λ§Œ κΈ°μ–΅ν•΄μ•Ό ν•  사항이 많이 μžˆμŠ΅λ‹ˆλ‹€.

방금 μ•„μ£Ό κ°„λ‹¨ν•œ 해결책을 생각해 λƒˆμŠ΅λ‹ˆλ‹€... 여기에 빠진 것이 있으면 μ•Œλ €μ£Όμ‹­μ‹œμ˜€.

const HOC06 = WrappedComponent => Vue.extend({
   mounted () {
      console.log('mounted 6')
   },
   ...WrappedComponent
})

@LinusBorg 및 @lbogdan μ—μ„œ μ œκ³΅ν•œ 예제λ₯Ό 기반으둜 슬둯이 μžˆλŠ” ꡬ성 μš”μ†Œλ₯Ό μ²˜λ¦¬ν•  수 μžˆλŠ” κ°€μž₯ μ΅œμ†Œν•œμ˜ HoC κ΅¬ν˜„μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

const HoC = WrappedComponent => ({
    props: typeof WrappedComponent === 'function' 
        ? WrappedComponent.options.props 
        : WrappedComponent.props,
    render (h) {
        const slots = this.$slots;
        const scopedSlots = {};
        Object.keys(slots).map(key => (scopedSlots[key] = () => slots[key]));

        return h(WrappedComponent, {
            attrs: this.$attrs,
            props: this.$props,
            on: this.$listeners,
            scopedSlots,
        });
     }
});

@blockaκ°€ μ–ΈκΈ‰ν–ˆλ“―μ΄ vue.js 둜 HoCλ₯Ό λ§Œλ“œλŠ” 것은 μ—¬μ „νžˆ β€‹β€‹λ§Žμ€ λ…Έλ ₯μž…λ‹ˆλ‹€.

@eu81273

const HOC06 = WrappedComponent => Vue.extend({
   mounted () {
      console.log('mounted 6')
   },
   ...WrappedComponent
})

이것은 λ‹Ήμ‹ μ˜ ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•œ 것 κ°™μŠ΅λ‹ˆλ‹€, κ·Έλ ‡μ£ ? λ¬Όλ‘  WrappedComponentκ°€ μƒμ„±μžμΈμ§€ 객체인지에 따라 μ‘°μ •ν•΄μ•Ό ν•˜μ§€λ§Œ 슬둯, 이벀트 λ˜λŠ” μ†Œν’ˆμ„ 전달할 ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€.

vue.js둜 HoCλ₯Ό λ§Œλ“œλŠ” 것은 μ—¬μ „νžˆ β€‹β€‹λ§Žμ€ λ…Έλ ₯μž…λ‹ˆλ‹€.

슬둯 문제λ₯Ό μ œμ™Έν•˜κ³  이것은 Vue κ°€ React보닀 더 λ³΅μž‘ν•œ APIλ₯Ό 가지고 μžˆλ‹€λŠ” 사싀 λ•Œλ¬Έμ΄λ©°, 이 μ‹œλ‚˜λ¦¬μ˜€μ—μ„œλŠ” λ‹¨μ μž…λ‹ˆλ‹€. μ €λŠ” μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ μ‚¬μš© μ‚¬λ‘€μ—μ„œ React μ΅œμ†Œ APIλ₯Ό μ‘΄κ²½ν•©λ‹ˆλ‹€. VueλŠ” μ•½κ°„ λ‹€λ₯Έ λ””μžμΈ λͺ©ν‘œλ‘œ μ„€κ³„λ˜μ—ˆμœΌλ―€λ‘œ HOCλŠ” Reactμ—μ„œμ²˜λŸΌ μ‰½κ²Œ λ‚˜μ˜€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 이 초기 섀정을 λž˜ν•‘ν•˜λŠ” createHOC() λ„μš°λ―Έ ν•¨μˆ˜λ₯Ό λ§Œλ“œλŠ” 것은 맀우 간단해야 ν•©λ‹ˆλ‹€. 그렇지 μ•Šλ‚˜μš”?

κΈ€μŽ„, 그것은 μ΅œμ’… λͺ©ν‘œκ°€ 무엇인지에 달렀 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ μ΄ν•΄ν•˜λŠ” 바에 λ”°λ₯΄λ©΄ HoC의 λͺ©ν‘œλŠ” μ›λž˜ ꡬ성 μš”μ†Œ(WrappedComponent)λ₯Ό λ³€κ²½(μž₯식)ν•˜μ—¬ μ†Œν’ˆ, λ©”μ„œλ“œ, 이벀트 λ¦¬μŠ€λ„ˆ 등을 μΆ”κ°€(λ˜λŠ” μ£Όμž…)ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. HOC06 λ³€ν˜•μ€ ꡬ성 μš”μ†Œ μ •μ˜λ§Œ λ³€κ²½ν•˜λ©° μΈμŠ€ν„΄μŠ€ν™”λ˜λŠ” 방식은 λ³€κ²½ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@blocka HOC 의 λͺ©ν‘œλŠ” μ’…μ’… μƒνƒœ(예: redux/vuexμ—μ„œ)λ₯Ό 가져와 λž˜ν•‘λœ ꡬ성 μš”μ†Œμ˜ μ†Œν’ˆμ— μ£Όμž…ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” κ·€ν•˜μ˜ μ ‘κ·Ό λ°©μ‹μ—μ„œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@LinusBorg λ§žμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 그것이 μ‚¬μ‹€μ΄κΈ°μ—λŠ” λ„ˆλ¬΄ μ’‹κ³  λ‚΄κ°€ λͺ…λ°±ν•œ 것을 잊고 μžˆλ‹€λŠ” 것을 μ•Œκ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것이 Vueμ—μ„œ μ‹€μ œ μ‚¬μš© 사둀 HoCλ₯Ό κ΅¬ν˜„ν•˜λŠ” 쒋은 예라고 μƒκ°ν•©λ‹ˆλ‹€: https://github.com/ktsn/vuex-connect.

Vue HocsλŠ” ꡉμž₯ν•œ ν”ŒλŸ¬μŠ€κ°€ 될 κ²ƒμž…λ‹ˆλ‹€(거의 항상 λͺ¨λ“  vue λŒ€ λ°˜μ‘ ν† λ‘ μ—μ„œ 제기되기 λ•Œλ¬Έμ—). vue-hoc-creator νŒ¨ν‚€μ§€λ₯Ό κ°œλ°œν•˜κΈ° μœ„ν•΄ 곡식 리포지토리λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆκΉŒ? κ·Έλ ‡κ²Œ ν•˜λ©΄ κ°•λ ₯ν•˜κ³  μ§€μ›λ˜λŠ” κ΅¬ν˜„ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Btw, 더 λ‚˜μ€ 방법이 μžˆμŠ΅λ‹ˆλ‹€. HOC 자체 λŒ€μ‹  μƒμœ„ ꡬ성 μš”μ†Œμ˜ $createElementλ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. μ΄λ ‡κ²Œ ν•˜λ©΄ μžμ‹μ΄ μŠ¬λ‘―μ„ μ˜¬λ°”λ₯΄κ²Œ ν•΄κ²°ν•˜κ²Œ λ©λ‹ˆλ‹€.

https://jsfiddle.net/o7yvL2jd/23/

κ·€μ—½κΈ΄ ν•˜μ§€λ§Œ 곡식 도ꡬ가 μžˆμ–΄μ•Ό ν•˜λŠ” 더 큰 μ΄μœ λŠ”
이 μ½”λ“œλ₯Ό 계속 재발λͺ…ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€.

2017λ…„ 7μ›” 30일 μΌμš”μΌ μ˜€ν›„ 4μ‹œ 33λΆ„, Thorsten LΓΌnborg [email protected]
썼닀:

Btw, 더 λ‚˜μ€ 방법이 μžˆμŠ΅λ‹ˆλ‹€. μƒμœ„ ꡬ성 μš”μ†Œμ—μ„œ $createElement μ‚¬μš©
HOC 자체 λŒ€μ‹  - 이것은 μžμ‹μ΄ μŠ¬λ‘―μ„ μ˜¬λ°”λ₯΄κ²Œ ν•΄κ²°ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

https://jsfiddle.net/o7yvL2jd/23/

β€”
당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ³  GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/vuejs/vue/issues/6201#issuecomment-318927628 λ˜λŠ” μŒμ†Œκ±°
μŠ€λ ˆλ“œ
https://github.com/notifications/unsubscribe-auth/AACoury4Fix2jsX_lyTsS6CYOiHJaOuVks5sTOiugaJpZM4Oh0Ij
.

아직 곡식적인 해결책을 내놓지 λͺ»ν•΄ μ£„μ†‘ν•©λ‹ˆλ‹€. κ·Έλž˜λ„ κ·€μ—½λ‹€κ³  μƒκ°ν•˜λ‹ˆ λ‹€ν–‰μž…λ‹ˆλ‹€.

λ‚΄ μ†”λ£¨μ…˜λ„ μ™„λ²½ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•΄κ²°ν•΄μ•Ό ν•  λ‹€λ₯Έ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 즉, λ²”μœ„ 지정 슬둯이 λ‚΄ μ΅œμ‹  트릭으둜 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

νŽΈμ§‘: 였, μ‹ κ²½ 쓰지 λ§ˆμ„Έμš”. μž‘λ™ν•©λ‹ˆλ‹€.

곡식 μ†”λ£¨μ…˜μ€ μ•„λ§ˆλ„ μ™„λ£Œλ  κ²ƒμž…λ‹ˆλ‹€. 적어도 μ €λŠ” κ·Έλ ‡κ²Œ μ˜ˆμƒν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ² μ €ν•˜κ²Œ μƒκ°ν•˜κ³  ν…ŒμŠ€νŠΈν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ’‹μ•„, κ·Έλž˜μ„œ λ‚˜λŠ” 이것을 더 μ‰½κ²Œ λ§Œλ“œλŠ” 방법을 가지고 λ†€μ•˜λ‹€.

μ—¬κΈ°λ₯Ό λ³΄μ‹­μ‹œμ˜€: https://jsfiddle.net/Linusborg/j3wyz4d6/

APIκ°€ 맀우 λŒ€λž΅μ μΈ 아이디어 μŠ€μΌ€μΉ˜μ΄κΈ° λ•Œλ¬Έμ— λ§Œμ‘±ν•˜μ§€ μ•Šμ§€λ§Œ ν•  수 μžˆμ–΄μ•Ό ν•˜λŠ” λͺ¨λ“  것을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

import { createHOC, createRenderFn, normalizeSlots } from 'vue-hoc'
const Component = {
  props: ['message']
  template: `<p>{{message}}</p>`
}
const HOC = createHOC(Component)

createHOC λŠ” λ‹€μŒμ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  • ꡬ성 μš”μ†Œμ—μ„œ μ†Œν’ˆ 볡사
  • μ μ ˆν•œ 슬둯 해결을 μœ„ν•΄ λΆ€λͺ¨λ‘œλΆ€ν„° $createElement λ₯Ό κ΅ν™˜ν•©λ‹ˆλ‹€.
  • 이름을 μΆ”κ°€ν•˜λ‹€
  • 두 번째 μΈμˆ˜κ°€ μ œκ³΅λ˜μ§€ μ•ŠμœΌλ©΄(μœ„μ˜ μ˜ˆμ™€ 같이) ꡬ성 μš”μ†Œλ₯Ό λ Œλ”λ§ν•˜κ³  μ „λ‹¬ν•©λ‹ˆλ‹€.

    • μ†Œν’ˆ

    • 속성

    • 청취자

    • 일반 슬둯

    • λ²”μœ„ 슬둯

λ¬Όλ‘  κ·Έ μžμ²΄λ‘œλŠ” 그닀지 μœ μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ κ°„λ‹¨ν•œ Component 객체인 두 번째 μΈμˆ˜μ—μ„œ μž¬λ―Έκ°€ λ°œμƒν•©λ‹ˆλ‹€.

λ Œλ”λ§ κΈ°λŠ₯을 직접 μž‘μ„±ν•˜κ³  μ‹Άλ‹€λ©΄ λ‹Ήμ—°νžˆ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. props, attrs λ˜λŠ” listenersλ₯Ό ν™•μž₯ν•˜λ €λŠ” 경우 createRenderFn λ„μš°λ―Έλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μœ„μ—μ„œ μ„€λͺ…ν•œ κΈ°λ³Έ λ Œλ”λ§ κΈ°λŠ₯을 μƒμ„±ν•˜μ§€λ§Œ attrs , props λ˜λŠ” listeners λΆ€λͺ¨λ‘œλΆ€ν„° μ „λ‹¬ν•œ λͺ¨λ“  것을 λ³‘ν•©ν•©λ‹ˆλ‹€.

const HOC = createHOC(Component, {
  mounted() { 
    console.log(`lifecycle hooks work, it's simply component options`) 
  },
  render: createRenderFn(Component, {
    props: {
      message: 'Hello from your HOC!'
    }
  }
})

자체 λ Œλ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λ €λ©΄ normalizeSlots λ„μš°λ―Έλ₯Ό μ‚¬μš©ν•˜μ—¬ 개체λ₯Ό this.$slots μ—μ„œ 전달할 μ μ ˆν•œ λ°°μ—΄λ‘œ λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const HOC = createHOC(Component, {
  render(h) {
    return h(Component, {
      props: { message: 'hi from HOC'}, // nothing from parent will be passed on
    }, normalizeSlots(this.$slots))
  }
})

λŒ“κΈ€ μ›ν•©λ‹ˆλ‹€ :)

@LinusBorg μ•„μ£Ό μ’‹μ•„μš”!

λ‚΄κ°€ 도움이 될 것이라고 μƒκ°ν•˜λŠ” 것은 μ‹€μ œ HoC μ‚¬μš© 사둀λ₯Ό μ œμ‹œν•˜κ³  μ΄λŸ¬ν•œ κΈ°λ³Έ μš”μ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ „μ μœΌλ‘œ.

이 문제λ₯Ό μ–ΈκΈ‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€(EDIT(mybad): https://github.com/vuejs/vuejs.org/issues/658).
λ¬Έμ„œν™”λ˜μ§€ μ•Šμ€ $createElement APIλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμœΌλ―€λ‘œ ν”ŒλŸ¬κ·ΈμΈ 개발자λ₯Ό μœ„ν•΄ λ¬Έμ„œν™”ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

κ·€ν•˜μ˜ 링크가 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€(2014λ…„μ˜ λ¬Έμ œμ— μ •λ§λ‘œ λ§ν¬ν•˜κ³  싢지 μ•Šμ€ 경우).

κ·ΈλŸ¬λ‚˜ 예, 기술적으둜 $ceateElement APIλŠ” μ—¬μ „νžˆ API νŽ˜μ΄μ§€μ— μ—†μŠ΅λ‹ˆλ‹€.

@AlexandreBonaventure κ·Έ λ¬Έμ œλŠ” vue 0.x μΌλΆ€ν„°μž…λ‹ˆλ‹€. :웃닀:
λ˜ν•œ createElement λŠ” https://vuejs.org/v2/guide/render-function.html#createElement -Arguments에 λ¬Έμ„œν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

이 ν•¨μˆ˜λŠ” render ν•¨μˆ˜μ˜ 인수둜 λ¬Έμ„œν™”λ˜μ–΄ μžˆμ§€λ§Œ this.$createElement λ₯Ό 톡해 μ‚¬μš©ν•  수 μžˆλŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. vuejs/vuejs.org/issues/658에 이에 λŒ€ν•œ λ―Έν•΄κ²° λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

@LinusBorg ν•˜μ§€λ§Œ 기본적으둜 render() ν•¨μˆ˜λ‘œ λ³΄λ‚΄λŠ” 것과 같은 ν•¨μˆ˜μ£ ?

μ •ν™•νžˆ λ™μΌν•©λ‹ˆλ‹€. 이 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό 톡해 λ Œλ”λ§ κΈ°λŠ₯ μ™ΈλΆ€μ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 것이 λͺ…ν™•ν•˜κ²Œ λ¬Έμ„œν™”λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” μœ„μ˜ 예λ₯Ό 가지고 놀고 있으며 더 λ³΅μž‘ν•œ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ μ‚¬μš©ν•  λ•Œ λͺ‡ 가지 λ¬Έμ œκ°€ μžˆμœΌλ―€λ‘œ 곡식 μ €μž₯μ†Œκ°€ ν•„μš”ν•©λ‹ˆλ‹€. λͺ‡ 가지 λ©”λͺ¨:

  • createRenderFn은 attrs/props/listenersκ°€ ν•¨μˆ˜μΈμ§€ ν™•μΈν•˜κ³  평가해야 ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ κΈ°μ‘΄ propsλ₯Ό 기반으둜 props 등을 λ™μ μœΌλ‘œ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ꡬ성 κ°€λŠ₯성을 μœ„ν•΄ componentλŠ” 두 번째 λ§€κ°œλ³€μˆ˜μ—¬μ•Ό ν•˜λ©° 전체 createHOC λ©”μ„œλ“œκ°€ 컀리링된 경우 μ—¬λŸ¬ μž„μ‹œ μž‘μ„±μžλ₯Ό μ‰½κ²Œ μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • hoc이 믹슀인으둜 μΆ”κ°€λ˜κΈ° λ•Œλ¬Έμ— 2개의 hoc을 ν•¨κ»˜ μ—°κ²°ν•˜λ €κ³  ν•˜λ©΄(예: withDefaultProps(withProps(component, {}), {}) 두 번째 hoc은 λΆ€λͺ¨μ˜ props 예제 에 μ•‘μ„ΈμŠ€ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„, μ €λŠ” μ΄κ²ƒμ˜ κ΅¬ν˜„μ„ μž‘μ„±ν•˜λŠ” 방법을 μ°Ύκ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
https://github.com/jackmellis/vue-hoc/tree/develop
μ–΄λ–»κ²Œ μƒκ°ν•˜λŠ”μ§€ μ•Œλ €μ£Όμ‹œλ©΄ 곧 κ²Œμ‹œν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” λ˜ν•œ recompose μŠ€νƒ€μΌμ˜ νŒ¨ν‚€μ§€λ₯Ό μž‘μ„±ν•˜λŠ” 것에 λŒ€ν•΄ μƒκ°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μž¬κ΅¬μ„± μŠ€νƒ€μΌ νŒ¨ν‚€μ§€κ°€ μ’‹μŠ΅λ‹ˆλ‹€. 정말 λ­”κ°€λ₯Ό μ‚¬μš©ν•  수 μžˆμ—ˆλ‹€
졜근 withState처럼.

2017λ…„ 8μ›” 19일 ν† μš”μΌ μ˜€μ „ 5μ‹œ 50뢄에 Jack [email protected] 은 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„, μ €λŠ” μ΄κ²ƒμ˜ κ΅¬ν˜„μ„ μž‘μ„±ν•˜λŠ” 방법을 μ°Ύκ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
https://github.com/jackmellis/vue-hoc/tree/develop
μ–΄λ–»κ²Œ μƒκ°ν•˜λŠ”μ§€ μ•Œλ €μ£Όμ‹œλ©΄ 곧 κ²Œμ‹œν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” λ˜ν•œ ν•΄μš”
μž¬κ΅¬μ„± μŠ€νƒ€μΌ νŒ¨ν‚€μ§€λ₯Ό μž‘μ„±ν•˜λŠ” 것에 λŒ€ν•΄ μƒκ°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

β€”
당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ³  GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/vuejs/vue/issues/6201#issuecomment-323513287 λ˜λŠ” μŒμ†Œκ±°
μŠ€λ ˆλ“œ
https://github.com/notifications/unsubscribe-auth/AACoumQWQMgpVeIvzJ3Ti8A4kLBD04Hhks5sZq_zgaJpZM4Oh0Ij
.

@jackmellis 이 일을 주도해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ :)

이전에 μ œκ³΅ν•œ ν”Όλ“œλ°±μ— λŒ€ν•œ λͺ‡ 가지 생각:

  • λ‚˜λŠ” 카레 버전이 쒋은 점이며 μ–΄λ–€ λ©΄μ—μ„œ "κΈ°λ³Έ"이어야 ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 그것이 HOCκ°€ 일반적으둜 μˆ˜ν–‰λ˜λŠ” 방식이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 그렇지 μ•ŠμŠ΅λ‹ˆκΉŒ?
  • 믹슀인 λ¬Έμ œμ— λŒ€ν•œ 쒋은 점. 이것을 μ™„ν™”ν•˜λŠ” 방법을 이미 μ•Œκ³  μžˆμŠ΅λ‹ˆκΉŒ? μ§€κΈˆμ€ μ—†μ§€λ§Œ Vue.config.optionsMergeStrategies λ₯Ό μ‚¬μš©ν•˜μ—¬ λ§Œλ“  컀리 λ³€ν˜• μ‘°ν•©μ—μ„œ μ™„ν™”ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 직감이 μžˆμŠ΅λ‹ˆλ‹€.

넀이밍도 κ³ λ―Όν–ˆλ‹€. μ €λŠ” createRenderFn κ°€ λ§ˆμŒμ— 듀지 μ•ŠμŠ΅λ‹ˆλ‹€. renderComponentWith 와 같은 것은 λ‹€λ₯Έ λ…Έλ“œμ— ν¬ν•¨μ‹œν‚€λŠ” μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ 더 의미 있고 더 ν•©λ¦¬μ μž…λ‹ˆλ‹€.

render(h) {
  return h('DIV', {staticClass: 'some-styling' }, renderComponentWith({ props: {... }Β }))
}

  • κ²°κ΅­ λ‚˜λŠ” λ‘˜ λ‹€ μ„ νƒν–ˆλ‹€. λ”°λΌμ„œ createHOC λŠ” ꡬ성 μš”μ†Œ μš°μ„  λΉ„ 컀리이고 컀리 λ³€ν˜• createHOCc 이 μžˆμŠ΅λ‹ˆλ‹€. React μƒνƒœκ³„λŠ” OOP ν”„λ ˆμž„μ›Œν¬μ²˜λŸΌ μž‘λ™ν•˜λŠ” Vue와 달리 맀우 κΈ°λŠ₯ μ€‘μ‹¬μ μž…λ‹ˆλ‹€. λ”°λΌμ„œ Vue의 λ‚˜λ¨Έμ§€ λΆ€λΆ„κ³Ό 일관성을 μœ μ§€ν•˜λ©΄μ„œλ„ μ—¬μ „νžˆ κΈ°λŠ₯적 λŒ€μ•ˆμ„ μ œκ³΅ν•˜λŠ” 것이 κ°€μž₯ μ’‹λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.
  • λ‚˜λŠ” 이것을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ λͺ‡ 가지 μ½”λ“œλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. 전체 μž„μ‹œλ₯Ό 믹슀인으둜 μ‚¬μš©ν•˜λŠ” λŒ€μ‹  optionsMergeStrategiesλ₯Ό μ‚¬μš©ν•˜μ—¬ μž„μ‹œμ™€ μ˜΅μ…˜μ„ μˆ˜λ™μœΌλ‘œ λ³‘ν•©ν•©λ‹ˆλ‹€. μœ μΌν•œ λ¬Έμ œλŠ” optionsMergeStrategiesκ°€ λ§ˆμ§€λ§‰ λ§€κ°œλ³€μˆ˜λ‘œ vm을 μ˜ˆμƒν•˜μ§€λ§Œ μΈμŠ€ν„΄μŠ€ν™” 전에 병합을 μˆ˜ν–‰ν•˜λ―€λ‘œ vm이 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
  • μ €λŠ” createRenderFn 에 맀우 λ§Œμ‘±ν•©λ‹ˆλ‹€. 그것이 λ°”λ‘œ 그것이 ν•˜λŠ” 일이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ 이것을 ν•©μΉ μˆ˜λ‘ μ‚¬λžŒλ“€μ΄ μ§μ ‘μ μœΌλ‘œ μ‚¬μš©ν•˜μ§€ μ•Šμ„ 것이라고 μƒκ°ν•©λ‹ˆλ‹€. 일반적인 μ‚¬μš©λ²•μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
const hoc = createHOC(
  Component,
  {
    created(){
      /* ... */
    }
  },
  {
    props: (props) => ({
      ...props,
      someProp: 'foo'
    })
  }
);

μ•„λ§ˆλ„ λ‚΄κ°€ λ‹Ήμ‹ μ˜ 예λ₯Ό 잘 μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆκΉŒ?

μ•„λ§ˆλ„ λ‚΄κ°€ λ‹Ήμ‹ μ˜ 예λ₯Ό 잘 μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆκΉŒ?

μ•„λ‹ˆμš”, 당신이 μ˜¬λ°”λ₯Έ 길을 κ°€κ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ§ˆμ§€λ§‰ λ‹΅λ³€ 이후에 그것에 λŒ€ν•΄ 더 μƒκ°ν–ˆμ„ λ•Œ λ‚΄ 생각이 λΉ„μŠ·ν•œ λ°©ν–₯으둜 κ°€κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

초기 POCμ—μ„œ μ‚¬λžŒλ“€μ΄ λ Œλ”λ§λœ ꡬ성 μš”μ†Œ μ£Όμœ„μ— μΆ”κ°€ λ§ˆν¬μ—…μ„ μΆ”κ°€ν•  수 μžˆλ„λ‘ ν¬ν•¨ν–ˆμ§€λ§Œ UI도 κ°€μ Έμ˜€κΈ° λ•Œλ¬Έμ— 더 이상 HOCκ°€ μ•„λ‹ˆλΌλŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€...

예, κ·€ν•˜κ°€ μΆ”κ°€ μ½˜ν…μΈ λ₯Ό λ Œλ”λ§ν•˜λ €κ³  μ‹œλ„ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. HOC μ˜μ—­μ„ 벗어났고 이λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ SFCλ₯Ό 생성할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

방금 npm에 vue-hoc λ₯Ό κ²Œμ‹œν–ˆμŠ΅λ‹ˆλ‹€!

λ‚˜λŠ” λ˜ν•œ vue-compose 에 λŒ€ν•œ μž‘μ—…μ„ ν•˜κ³  μžˆλŠ”λ° μ΄λŠ” λΉ λ₯Έ λ¬Έμ„œν™” μ„Έμ…˜μ΄ μ€€λΉ„λ˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œλ„ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. μž¬κ΅¬μ„±κ³Ό μœ μ‚¬ν•˜μ§€λ§Œ VueλŠ” 계산 캐싱과 같은 λ§Žμ€ μ˜λ¦¬ν•œ μž‘μ—…μ„ μ²˜λ¦¬ν•˜κ³  this μ‚¬μš©μ„ ꢌμž₯ν•˜λ―€λ‘œ μ‹€μ œλ‘œ λ³΅μž‘ν•œ(λ˜λŠ” κΈ°λŠ₯적 μŠ€νƒ€μΌ) ꡬ문이 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

extends λŠ” λ‹€λ₯΄κ²Œ μž‘λ™ν•˜μ§€λ§Œ μœ μ‚¬ν•œ κ²°κ³Όλ₯Ό μ–»λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μ‹€μž…λ‹ˆλ‹€.

@jackmellis ν”„λ‘œμ νŠΈκ°€ κ²¬κ³ ν•œ ν† λŒ€λ₯Ό μ œκ³΅ν•œλ‹€κ³  μƒκ°ν•˜κΈ° λ•Œλ¬Έμ— 이 글을 λ‹«κ² μŠ΅λ‹ˆλ‹€. HOCλ₯Ό 코어에 μƒμ„±ν•˜λŠ” 방법을 포함할 생각은 μ—†μŠ΅λ‹ˆλ‹€. 주둜 mixins/Extends에 λΉ„ν•΄ 큰 이점이 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

주둜 mixins/Extends에 λΉ„ν•΄ 큰 이점을 보지 λͺ»ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

@LinusBorg ReactλŠ” 이미 mixin λ₯Ό ν¬κΈ°ν–ˆμœΌλ©° HOCλŠ” λ§Žμ€ 이점을 μ œκ³΅ν•©λ‹ˆλ‹€.

이 κΈ°μ‚¬μ—μ„œλŠ” λ‹€μŒκ³Ό 같은 이점을 λΆ„μ„ν–ˆμŠ΅λ‹ˆλ‹€.

  • ꡬ성 μš”μ†Œμ™€ ν•΄λ‹Ή 믹슀인 κ°„μ˜ 계약은 μ•”μ‹œμ μž…λ‹ˆλ‹€.
  • 단일 ꡬ성 μš”μ†Œμ—μ„œ 더 λ§Žμ€ λ―ΉμŠ€μΈμ„ μ‚¬μš©ν•˜λ©΄ μΆ©λŒν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€.
  • λ―ΉμŠ€μΈμ€ ꡬ성 μš”μ†Œμ— 더 λ§Žμ€ μƒνƒœλ₯Ό μΆ”κ°€ν•˜λŠ” κ²½ν–₯이 μžˆμ§€λ§Œ 더 적은 것을 μœ„ν•΄ λ…Έλ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • ....

Vue νŒ€μ€ HoC 지원을 더 μ‹ μ€‘ν•˜κ²Œ κ³ λ €ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.... μ‰½μ§€λŠ” μ•Šμ§€λ§Œ(VueλŠ” 이런 μ‹μœΌλ‘œ μ„€κ³„λ˜μ§€ μ•Šμ€ 것 κ°™μŠ΅λ‹ˆλ‹€).

λ‚˜λŠ” HoCκ°€ κ·Έλ ‡κ²Œ μš°μ›”ν•œ κ°œλ…μΈμ§€ ν™•μ‹ ν•˜μ§€ λͺ»ν•œλ‹€. 예λ₯Ό λ“€μ–΄ "μ•”μ‹œμ  계약" 잠재적 μΆ©λŒμ€ HoCμ—μ„œλ„ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이에 λŒ€ν•œ React-router κ΄€λ¦¬μžμ˜ 이 강연을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. https://www.youtube.com/watch?v=BcVAq3YFiuc

κ·Έλ ‡λ‹€κ³  그듀이 λ‚˜μ˜λ‹€κ³  μƒκ°ν•˜μ§€λ„ μ•Šκ³  λ§Žμ€ μƒν™©μ—μ„œ μœ μš©ν•©λ‹ˆλ‹€. 그듀은 React μ„Έκ³„μ—μ„œμ²˜λŸΌ μΉ­μ°¬λ°›λŠ” λ§ˆλ²•μ˜ μ΄μ•Œμ΄ μ•„λ‹ˆμ§€λ§Œ λ‚˜λ¦„μ˜ 단점이 μžˆμŠ΅λ‹ˆλ‹€.

μœ„μ˜ λ…Όμ˜μ—μ„œ λΆ„λͺ…νžˆ μ•Œ 수 μžˆλ“―μ΄ Vue의 API와 κΈ°λŠ₯이 더 κ΄‘λ²”μœ„ν•˜κ³  더 λ§Žμ€ 엣지 μΌ€μ΄μŠ€λ₯Ό μ²˜λ¦¬ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— Vueμ—μ„œ HoCλ₯Ό κ΅¬ν˜„ν•˜λŠ” 것은 Reactμ—μ„œλ§ŒνΌ κ°„λ‹¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

Vueμ—μ„œ 아무 것도 깨뜨릴 ν•„μš”κ°€ μ—†λŠ” ν•œ 이것을 κ°œμ„ ν•˜λŠ” 방법에 λŒ€ν•΄ ν™•μ‹€νžˆ 말할 수 μžˆμŠ΅λ‹ˆλ‹€. HoCλŠ” 제 생각에 큰 λ³€ν™”λ₯Ό μΌμœΌν‚¬ κ°€μΉ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€.

666

슬둯이 μžˆλŠ” ꡬ성 μš”μ†Œλ₯Ό μ²˜λ¦¬ν•  수 μžˆλŠ” κ°€μž₯ μ΅œμ†Œν•œμ˜ HoC κ΅¬ν˜„μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

function hoc(WrappedComponent) {
  return {
    render(h) {
      return h(WrappedComponent, {
        on: this.$listeners,
        attrs:this.$attrs,
        scopedSlots: this.$scopedSlots,
      });
    },
  };
}

μœ„μ˜ λ‹΅λ³€κ³Ό λΉ„κ΅ν•˜μ—¬,

  • μ†Œν’ˆ ꡬ성은 ν•„μš”ν•˜μ§€ μ•ŠμœΌλ©° this.$attrsμ—μ„œ μžμ‹μœΌλ‘œ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μΆ”κ°€ μŠ¬λ‘―μ€ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. this.$scopedSlotsμ—λŠ” v2.6.0+ 이후 의 슬둯이 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” ν™•μΈν•˜κΈ° μœ„ν•΄ 예 λ₯Ό 썼닀

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰