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 ꡬνμ μ΄λ²€νΈ νΈλ€λ¬μμ μλνμ§ μμ΅λλ€.
μλ νμΈμ @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λ₯Ό μ¬μ©νμμμ€. μ΄λ κ² νλ©΄ μμμ΄ μ¬λ‘―μ μ¬λ°λ₯΄κ² ν΄κ²°νκ² λ©λλ€.
κ·μ½κΈ΄ νμ§λ§ 곡μ λκ΅¬κ° μμ΄μΌ νλ λ ν° μ΄μ λ
μ΄ μ½λλ₯Ό κ³μ μ¬λ°λͺ
νμ§ λ§μμμ€.
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()
ν¨μλ‘ λ³΄λ΄λ κ²κ³Ό κ°μ ν¨μμ£ ?
μ νν λμΌν©λλ€. μ΄ μΈμ€ν΄μ€ λ©μλλ₯Ό ν΅ν΄ λ λλ§ κΈ°λ₯ μΈλΆμμλ μ¬μ©ν μ μλ€λ κ²μ΄ λͺ ννκ² λ¬Έμνλμ§ μμμ΅λλ€.
λλ μμ μλ₯Ό κ°μ§κ³ λκ³ μμΌλ©° λ 볡μ‘ν μλ리μ€μμ μ¬μ©ν λ λͺ κ°μ§ λ¬Έμ κ° μμΌλ―λ‘ κ³΅μ μ μ₯μκ° νμν©λλ€. λͺ κ°μ§ λ©λͺ¨:
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 μ΄ μΌμ μ£Όλν΄ μ£Όμ μ κ°μ¬ν©λλ€ :)
μ΄μ μ μ 곡ν νΌλλ°±μ λν λͺ κ°μ§ μκ°:
Vue.config.optionsMergeStrategies
λ₯Ό μ¬μ©νμ¬ λ§λ 컀리 λ³ν μ‘°ν©μμ μνν μ μμ΄μΌ νλ€λ μ§κ°μ΄ μμ΅λλ€.λ€μ΄λ°λ κ³ λ―Όνλ€. μ λ createRenderFn
κ° λ§μμ λ€μ§ μμ΅λλ€. renderComponentWith
μ κ°μ κ²μ λ€λ₯Έ λ
Έλμ ν¬ν¨μν€λ μλ리μ€μμ λ μλ―Έ μκ³ λ ν©λ¦¬μ μ
λλ€.
render(h) {
return h('DIV', {staticClass: 'some-styling' }, renderComponentWith({ props: {... }Β }))
}
createHOC
λ κ΅¬μ± μμ μ°μ λΉ μ»€λ¦¬μ΄κ³ 컀리 λ³ν createHOCc
μ΄ μμ΅λλ€. React μνκ³λ OOP νλ μμν¬μ²λΌ μλνλ Vueμ λ¬λ¦¬ λ§€μ° κΈ°λ₯ μ€μ¬μ μ
λλ€. λ°λΌμ Vueμ λλ¨Έμ§ λΆλΆκ³Ό μΌκ΄μ±μ μ μ§νλ©΄μλ μ¬μ ν κΈ°λ₯μ λμμ μ 곡νλ κ²μ΄ κ°μ₯ μ’λ€κ³ μκ°ν©λλ€.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,
});
},
};
}
μμ λ΅λ³κ³Ό λΉκ΅νμ¬,
λλ νμΈνκΈ° μν΄ μ λ₯Ό μΌλ€
κ°μ₯ μ μ©ν λκΈ
μ’μ, κ·Έλμ λλ μ΄κ²μ λ μ½κ² λ§λλ λ°©λ²μ κ°μ§κ³ λμλ€.
μ¬κΈ°λ₯Ό 보μμμ€: https://jsfiddle.net/Linusborg/j3wyz4d6/
APIκ° λ§€μ° λλ΅μ μΈ μμ΄λμ΄ μ€μΌμΉμ΄κΈ° λλ¬Έμ λ§μ‘±νμ§ μμ§λ§ ν μ μμ΄μΌ νλ λͺ¨λ κ²μ ν μ μμ΅λλ€.
createHOC
λ λ€μμ μ²λ¦¬ν©λλ€.$createElement
λ₯Ό κ΅νν©λλ€.λ¬Όλ‘ κ·Έ μ체λ‘λ κ·Έλ€μ§ μ μ©νμ§ μμ΅λλ€. λ°λΌμ κ°λ¨ν Component κ°μ²΄μΈ λ λ²μ§Έ μΈμμμ μ¬λ―Έκ° λ°μν©λλ€.
λ λλ§ κΈ°λ₯μ μ§μ μμ±νκ³ μΆλ€λ©΄ λΉμ°ν ν μ μμ΅λλ€. props, attrs λλ listenersλ₯Ό νμ₯νλ €λ κ²½μ°
createRenderFn
λμ°λ―Έλ₯Ό μ¬μ©ν μ μμ΅λλ€. μμμ μ€λͺ ν κΈ°λ³Έ λ λλ§ κΈ°λ₯μ μμ±νμ§λ§attrs
,props
λλlisteners
λΆλͺ¨λ‘λΆν° μ λ¬ν λͺ¨λ κ²μ λ³ν©ν©λλ€.μ체 λ λ ν¨μλ₯Ό μμ±νλ €λ©΄
normalizeSlots
λμ°λ―Έλ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Όthis.$slots
μμ μ λ¬ν μ μ ν λ°°μ΄λ‘ λ³νν μ μμ΅λλ€.λκΈ μν©λλ€ :)