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
ãã®ãããžã§ã¯ãã«ãé¢å¿ããå¯ãããã ããããããšãããããŸãã
ãã ããåé¡ã¯äœ¿çšæ³/ãµããŒãã®è³ªåã§ãããåââé¡è¿œè·¡ã·ã¹ãã ã¯ãã°ã¬ããŒããšæ©èœèŠæ±å°çšã«äºçŽãããŠããŸãïŒå¯çš¿ã¬ã€ãã§æŠèª¬ãããŠããŸãïŒã
ãã©ãŒã©ã ã Stack Overflow ããŸãã¯äžåãã£ããã§è³ªåããããšããå§ãããŸããåãã§ãæäŒãããŸãã
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ãäœæããã®ã¯_ãŸã _å€ãã®åªåã§ãã ééããããšãèŠããŠããã¹ãããšããããããããŸãããreactã䜿çšãããšã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ãæã£ãŠãããšããäºå®ã«ãããã®ã§ããããã®ã·ããªãªã§ã¯äžå©ã§ãã ç§ã¯ãã®çš®ã®ãŠãŒã¹ã±ãŒã¹ã§Reactsã®æå°éã®APIãè³è³ããŠããŸã-Vueã¯ãããã«ç°ãªãèšèšç®æšã§èšèšãããŠãããããHOCã¯Reactã»ã©ç°¡åã«ã¯å®çŸã§ããŸããã
ãããããã®åæèšå®ãã©ããããcreateHOC()
ãã«ããŒé¢æ°ãäœæããã®ã¯ããªãç°¡åãªã¯ãã§ãããïŒ
ãŸããããã¯æ¬åœã«æçµç®æšãäœã§ãããã«äŸåããŸãã ç§ãç解ããŠããããšãããHoCã®ç®æšã¯ãå
ã®ã³ã³ããŒãã³ãïŒWrappedComponentïŒãäœããã®æ¹æ³ã§å€æŽïŒè£
食ïŒããŠãå°éå
·ãã¡ãœãããã€ãã³ããªã¹ããŒãªã©ãè¿œå ïŒãŸãã¯æ¿å
¥ïŒããããšã§ãïŒããã¯ã¹ã€ã³ã®ããã«ãå®éã«ã¯ïŒsmile :)ã HOC06
ããªã¢ã³ãã¯ã³ã³ããŒãã³ãå®çŸ©ãå€æŽããã ãã§ãã€ã³ã¹ã¿ã³ã¹åã®æ¹æ³ã¯å€æŽããŸããã
@blocka HOCã®ç®æšã¯ãå€ãã®å Žåãç¶æ ãååŸãïŒããšãã°ãredux / vuexããïŒãã©ãããããã³ã³ããŒãã³ãã®å°éå ·ã«æ³šå ¥ããããšã§ããããã¯ãã¢ãããŒãã§ã¯æ©èœããŸããã
@LinusBorgããã§ãã ç§ã¯ãããçå®ã§ããã«ã¯ããŸãã«ãè¯ãã£ãããšããããŠç§ãæçœãªäœããå¿ããŠããããšãç¥ã£ãŠããŸããã
ããã¯ãVueã§å®éã®ãŠãŒã¹ã±ãŒã¹HoCãå®è£ ããè¯ãäŸã ãšæããŸãïŒ httpsïŒ//github.com/ktsn/vuex-connectã
Vue Hocsã¯çŽ æŽããããã©ã¹ã«ãªããŸãïŒã»ãšãã©ã®å Žåãvueãšreactã®è°è«ã§åãäžããããããïŒã ãããããvue-hoc-creatorããã±ãŒãžãéçºããããã«ãå ¬åŒã®ãªããžããªãäœæã§ããŸããïŒ ããããã°ãå ç¢ã§ãµããŒããããå®è£ ã«åãââçµãããšãã§ããŸã
ãšããã§ãããè¯ãæ¹æ³ããããŸãïŒHOCèªèº«ã®ä»£ããã«èŠªã³ã³ããŒãã³ããã$ createElementã䜿çšããŠãã ãã-ããã«ãããåã¯ã¹ããããæ£ãã解決ããŸãïŒ
ããããã§ãããå
¬åŒããŒã«ãããçç±ã¯ãªãããã§ãã
ãã¹ãŠã®äººããã®ã³ãŒããäœãçŽãç¶ããªãã§ãã ããã
2017幎7æ30æ¥ååŸ4æ33åãThorstenLÃŒnborgnotifications@ github.com
æžããŸããïŒ
ãšããã§ãããè¯ãæ¹æ³ããããŸãïŒèŠªã³ã³ããŒãã³ããã$ 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ã¯éåžžã«å€§ãŸããªã¢ã€ãã¢ã®ã¹ã±ããã§ãããããç§ã¯æºè¶³ããŠããŸããããAPIãå®è¡ã§ããã¯ãã®ããšã¯äœã§ãå®è¡ã§ããŸãã
import { createHOC, createRenderFn, normalizeSlots } from 'vue-hoc'
const Component = {
props: ['message']
template: `<p>{{message}}</p>`
}
const HOC = createHOC(Component)
createHOC
ãåŠçããŸãïŒ
$createElement
ã芪ãã亀æããŠãé©åãªã¹ãããã解決ããŸãããã¡ãããããã ãã§ã¯ããŸã圹ã«ç«ã¡ãŸããã ãããã£ãŠã楜ãã¿ã¯åçŽãªComponentãªããžã§ã¯ãã§ãã2çªç®ã®åŒæ°ã§çºçããŸãã
èªåã§ã¬ã³ããªã³ã°é¢æ°ãäœæãããå Žåã¯ããã¡ããå¯èœã§ãã å°éå
·ãå±æ§ããŸãã¯ãªã¹ããŒãæ¡åŒµãããã ãã®å Žåã¯ã 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ã®ãŠãŒã¹ã±ãŒã¹ãèãåºãããããã®ããªããã£ãã䜿çšããŠãããã解決ããããšã§ãã
絶察ã
ç§ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãïŒç·šéïŒmybadïŒïŒhttpsïŒ//github.com/vuejs/vuejs.org/issues/658ïŒã
ææžåãããŠããªã$ createElement APIã䜿çšããŠããã®ã§ããã©ã°ã€ã³éçºè
ã®ããã«ææžåãã䟡å€ããããŸãã
ãªã³ã¯ãééã£ãŠããŸãïŒ2014幎ã®åé¡ã«æ¬åœã«ãªã³ã¯ãããå Žåãé€ãïŒ
ããããã¯ããæè¡çã«ã¯$ceateElement
APIã¯ãŸã APIããŒãžã«ãããŸããã
@AlexandreBonaventureãã®åé¡ã¯vue0.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, {}), {})
ã2çªç®ã®ããã¯ã¯èŠªã®å°éå
·ã®äŸã«ã¢ã¯ã»ã¹ã§ããŸããïŒçãããç§ã¯ããã®å®è£
ãæžãããšãæ€èšããŠããŸããã
https://github.com/jackmellis/vue-hoc/tree/develop
ãæèŠããèãããã ããããŸããªãå
¬éããäºå®ã§ãã åæ§æã¹ã¿ã€ã«ã®ããã±ãŒãžãæžãããšãèããŠããŸãã
åæ§æã¹ã¿ã€ã«ã®ããã±ãŒãžã¯çŽ æŽãããã§ãããã æ¬åœã«äœãã䜿ãããšãã§ãã
æè¿withStateã®ããã«ã
2017幎8æ19æ¥åææ¥ã®åå5æ50åã Jacknotifications @ github.comã¯æ¬¡ã®ããã«æžããŠããŸãã
çãããç§ã¯ããã®å®è£ ãæžãããšãæ€èšããŠããŸããã
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
ã®äœ¿çšãæšå¥šããŸãïŒãåŠçãããããå®éã«ã¯ããã»ã©è€éãªïŒãŸãã¯æ©èœã¹ã¿ã€ã«ã®ïŒæ§æã¯å¿
èŠãããŸããã
ãåèãŸã§ã«
FWIWïŒ https ïŒ//vuejs.org/v2/api/#extends
extends
ã®åäœã¯ç°ãªããŸãããåæ§ã®çµæãéæããããã«äœ¿çšã§ããŸããããã¯äºå®ã§ãã
@jackmellisãããžã§ã¯ãã¯ç¢ºããªåºç€ãæäŸãããšæãã®ã§ããããéããŸãã äž»ã«ããã¯ã¹ã€ã³/ãšã¯ã¹ãã³ãã«æ¯ã¹ãŠå€§ããªã¡ãªãããèŠãããªããããHOCãã³ã¢ã«äœæããæ¹æ³ãå«ããã€ããã¯ãããŸããã
äž»ãªçç±ã¯ãããã¯ã¹ã€ã³/ãšã¯ã¹ãã³ãã«æ¯ã¹ãŠå€§ããªã¡ãªãããèŠãããªãããã§ãã
@LinusBorgReactã¯ãã§ã«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ã¯éåžžã«å€§ãŸããªã¢ã€ãã¢ã®ã¹ã±ããã§ãããããç§ã¯æºè¶³ããŠããŸããããAPIãå®è¡ã§ããã¯ãã®ããšã¯äœã§ãå®è¡ã§ããŸãã
createHOC
ãåŠçããŸãïŒ$createElement
ã芪ãã亀æããŠãé©åãªã¹ãããã解決ããŸãããã¡ãããããã ãã§ã¯ããŸã圹ã«ç«ã¡ãŸããã ãããã£ãŠã楜ãã¿ã¯åçŽãªComponentãªããžã§ã¯ãã§ãã2çªç®ã®åŒæ°ã§çºçããŸãã
èªåã§ã¬ã³ããªã³ã°é¢æ°ãäœæãããå Žåã¯ããã¡ããå¯èœã§ãã å°éå ·ãå±æ§ããŸãã¯ãªã¹ããŒãæ¡åŒµãããã ãã®å Žåã¯ã
createRenderFn
ãã«ããŒã䜿çšã§ããŸãã äžèšã®ããã©ã«ãã®ãããªã¬ã³ããªã³ã°é¢æ°ãäœæããŸãããæž¡ããattrs
ãprops
ããŸãã¯listeners
ã芪ããã®ãã®ãšããŒãžããŸããç¬èªã®ã¬ã³ããªã³ã°é¢æ°ãäœæããå Žåã¯ã
normalizeSlots
ãã«ããŒã䜿çšããŠããªããžã§ã¯ããthis.$slots
ããé©åãªé åã«å€æããŠæž¡ãããšãã§ããŸããã³ã¡ã³ãã欲ããã£ã:)