2.4.2
https://jsfiddle.net/o7yvL2jd/
рдореИрдВ vue.js рдХреЗ рд╕рд╛рде HoC рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдЦреЛрдЬ рд░рд╣рд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдХреЛрдИ рдЙрдкрдпреБрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ред
рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд▓рд┐рдВрдХ рдПрдЪрдУрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред
https://jsfiddle.net/o7yvL2jd/
рдореИрдВ рдХреИрд╕реЗ vue.js рдХреЗ рд╕рд╛рде HoC рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреИрд╕реЗ React.js рддрд░реАрдХреЗ рд╕реЗ HoC рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╡реЗ рдПрдЪрдУрд╕реА рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред
рд╕реНрд▓реЙрдЯ рдФрд░ рдИрд╡реЗрдВрдЯ рд╡рд╛рд▓реЗ HoCs рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд░реЗрдВрдбрд░ рд╣реЛрдВрдЧреЗред
рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рддрддреНрд╡ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИ, рдпрд╛ рдкреНрд░рд╕реНрддреБрдд рдХреНрд░рдо рдмреЗрд╕рдХрдВрдкреЛрдиреЗрдВрдЯ рд╕реЗ рднрд┐рдиреНрди рд╣реИред
рдХреБрдЫ рдПрдЪрдУрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдирдорд╕реНрддреЗ @ eu81273
рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрдкрдХреА рд░реБрдЪрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдПрдХ рдЙрдкрдпреЛрдЧ/рд╕рдорд░реНрдерди рдкреНрд░рд╢реНрди рд╣реИ, рдФрд░ рд╕рдорд╕реНрдпрд╛ рдЯреНрд░реИрдХрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдФрд░ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рд╣рдорд╛рд░реА рдпреЛрдЧрджрд╛рди рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
рд╣рдо рдЖрдкрдХреЛ рдЗрд╕реЗ рдлрд╝реЛрд░рдо , рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдпрд╛ рд╣рдорд╛рд░реА рдХрд▓рд╣ рдЪреИрдЯ рдкрд░ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдиреЗ рдореЗрдВ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛ рд░рд╣реА рд╣реИред
рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореИрдВрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реБрдЪрд┐ рд╕реЗ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реА - рдпрд╣ 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 рдореЗрдВ рд╕реНрд▓реЙрдЯ рд▓реЗрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдпрд╣ рд╕реНрдХреЛрдкреНрдб рд╕реНрд▓реЙрдЯ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдЪрдУрд╕реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИ, рдЬрдмрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдЖрдк рдХреЗрд╡рд▓ рд░реИрдкреНрдбрдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ рдкреНрд░реЛрдк рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред
рдореИрдВрдиреЗ рдмрд╕ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ ... рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ:
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 рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реИред
@рдпреВ81273
const HOC06 = WrappedComponent => Vue.extend({
mounted () {
console.log('mounted 6')
},
...WrappedComponent
})
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рд╣реЛ рдЧрдИ рд╣реИ, рдирд╣реАрдВ? рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ WrappedComponent рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрд▓реЙрдЯреНрд╕, рдЗрд╡реЗрдВрдЯреНрд╕ рдпрд╛ рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
vue.js рдХреЗ рд╕рд╛рде рдПрдХ HoC рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реИред
рд╕реНрд▓реЙрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рд┐рд░реНрдл рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ Vue рдореЗрдВ React рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ API рд╣реИ, рдЬреЛ рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рдиреБрдХрд╕рд╛рди рд╣реИред рдореИрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдиреНрдпреВрдирддрдо рдПрдкреАрдЖрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ - Vue рдХреЛ рдХреЗрд╡рд▓ рдереЛрдбрд╝реЗ рдЕрд▓рдЧ рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рде рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП HOCs рдЖрд╕рд╛рдиреА рд╕реЗ React рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ createHOC()
рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯрдЕрдк рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рд╣реИ рдирд╛?
рдЦреИрд░, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп рдХреНрдпрд╛ рд╣реИред рдЬреЛ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдПрдЪрдУрд╕реА рдХрд╛ рд▓рдХреНрд╖реНрдп рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдореВрд▓ рдШрдЯрдХ (рд▓рдкреЗрдЯрд╛ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ) рдХреЛ рдкреНрд░реЛрдк, рд╡рд┐рдзрд┐рдпреЛрдВ, рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛рдУрдВ рдЗрддреНрдпрд╛рджрд┐ рдХреЛ рдЬреЛрдбрд╝рдиреЗ (рдпрд╛ рдЗрдВрдЬреЗрдХреНрдЯ) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рдирд╛ (рд╕рдЬрд╛рдирд╛) рд╣реИ (рдПрдХ рдорд┐рд╢реНрд░рдг рдХреА рддрд░рд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ: рдореБрд╕реНрдХрд╛рди:)ред HOC06
рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рдШрдЯрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ, рдпрд╣ рдЙрд╕ рддрд░реАрдХреЗ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
@blocka рдПрдЪрдУрд╕реА рдХрд╛ рд▓рдХреНрд╖реНрдп рдЕрдХреНрд╕рд░ рд░рд╛рдЬреНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП redux/vuex рд╕реЗ) рдФрд░ рдЗрд╕реЗ рд▓рд┐рдкрдЯреЗ рдШрдЯрдХ рдХреЗ рдкреНрд░реЛрдк рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ - рдЬреЛ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
@LinusBorg рд╕рд╣реАред рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╕рдЪ рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдерд╛ рдФрд░ рдореИрдВ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рднреВрд▓ рд░рд╣рд╛ рдерд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ Vue рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ HoC рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ: https://github.com/ktsn/vuex-connectред
Vue Hocs рдПрдХ рдмрдврд╝рд┐рдпрд╛ рдкреНрд▓рд╕ рд╣реЛрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдХрд┐рд╕реА рднреА Vue рдмрдирд╛рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрд╣рд╕ рдореЗрдВ рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рд╢рд╛рдпрдж рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реЗрдкреЛ рдПрдХ vue-hoc-creator рдкреИрдХреЗрдЬ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЗрд╕ рддрд░рд╣ рд╣рдо рдПрдХ рдордЬрдмреВрдд, рд╕рдорд░реНрдерд┐рдд, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рдорд┐рд▓рд╛: рдПрдЪрдУрд╕реА рдХреЗ рдмрдЬрд╛рдп рдореВрд▓ рдШрдЯрдХ рд╕реЗ $ createElement рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдЗрд╕рд╕реЗ рдмрдЪреНрдЪреЗ рдХреЛ рд╕реНрд▓реЙрдЯ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ:
рдкреНрдпрд╛рд░рд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрдкрдХрд░рдг рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдЕрдзрд┐рдХ рдХрд╛рд░рдг рддреЛ рд╣рдо
рд╕рднреА рдЗрд╕ рдХреЛрдб рдХрд╛ рдкреБрди: рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рди рдХрд░реЗрдВред
рд░рд╡рд┐рд╡рд╛рд░, 30 рдЬреБрд▓рд╛рдИ, 2017 рдХреЛ рд╢рд╛рдо 4:33 рдмрдЬреЗ, рдереЛрд░рд╕реНрдЯрди рд▓реБрдирдмреЛрд░реНрдЧ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:
рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рдорд┐рд▓рд╛: рдореВрд▓ рдШрдЯрдХ рд╕реЗ $ createElement рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдПрдЪрдУрд╕реА рдХреЗ рдмрдЬрд╛рдп - рдпрд╣ рдмрдЪреНрдЪреЗ рдХреЛ рд╕реНрд▓реЙрдЯреНрд╕ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ: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/
рдореИрдВ рдПрдкреАрдЖрдИ рд╕реЗ рдЦреБрд╢ рдирд╣реАрдВ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдореЛрдЯрд╛ рд╡рд┐рдЪрд╛рд░ рд╕реНрдХреЗрдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рдЬреЛ рдЗрд╕реЗ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
import { createHOC, createRenderFn, normalizeSlots } from 'vue-hoc'
const Component = {
props: ['message']
template: `<p>{{message}}</p>`
}
const HOC = createHOC(Component)
createHOC
рдирд┐рдореНрди рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛:
$createElement
рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рдХрд░реЗрдВредрдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рдмрд┐рд▓реНрдХреБрд▓ред рддреЛ рдордЬрд╝рд╛ рджреВрд╕рд░реЗ рддрд░реНрдХ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдШрдЯрдХ рд╡рд╕реНрддреБ рд╣реИред
рдпрджрд┐ рдЖрдк рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдкреНрд░реЙрдкреНрд╕, рдЕрдЯрд░реНрд╕ рдпрд╛ рд╢реНрд░реЛрддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк 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!'
}
}
})
рдпрджрд┐ рдЖрдк рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ this.$slots
рд╕реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП normalizeSlots
рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
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 рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛!
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдПрдЪрдУрд╕реА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдФрд░ рдЗрди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред
рдмрд┐рд▓реНрдХреБрд▓ред
рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ (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 ред
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдХрд┐ рдпрд╣ this.$createElement
рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП vuejs/vuejs.org/issues/658 рдкрд░ рдПрдХ рдЦреБрд▓рд╛ рдореБрджреНрджрд╛ рд╣реИ
@LinusBorg рд▓реЗрдХрд┐рди рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд╣реА рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ render()
рдлрд╝рдВрдХреНрд╢рди рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣реИ рдирд╛?
рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реАред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд╣рд░ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИред
рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл рдПрдХ рдирд╛рдЯрдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реЗрдкреЛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдиреЛрдЯреНрд╕ рдХреА рдПрдХ рдЬреЛрдбрд╝реА:
withDefaultProps(withProps(component, {}), {})
рджреВрд╕рд░реЗ рд╣реЙрдХ рдХреЗ рдкрд╛рд╕ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдкреНрд░реЙрдкреНрд╕ рдЙрджрд╛рд╣рд░рдг рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИрд╣реЗ рджреЛрд╕реНрддреЛрдВ, рдореИрдВ рдЗрд╕рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
https://github.com/jackmellis/vue-hoc/tree/develop
рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдПрдХ рд░реАрдХрдВрдкреЛрдЬрд╝-рд╕реНрдЯрд╛рдЗрд▓ рдкреИрдХреЗрдЬ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВред
рдПрдХ рд░реАрдХрдВрдкреЛрдЬрд╝ рд╕реНрдЯрд╛рдЗрд▓ рдкреИрдХреЗрдЬ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддрд╛ рдерд╛
рд╣рд╛рд▓ рд╣реА рдореЗрдВ withState рдХреА рддрд░рд╣ред
рд╢рдирд┐рд╡рд╛рд░, 19 рдЕрдЧрд╕реНрдд, 2017 рдХреЛ рд╕реБрдмрд╣ 5:50 рдмрдЬреЗ, рдЬреИрдХ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @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
рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, $#$2 renderComponentWith
#$ рдЬреИрд╕рд╛ рдХреБрдЫ рдЕрдзрд┐рдХ рд╕рд╛рд░реНрдердХ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдЗрд╕реЗ рдХреБрдЫ рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рддреЗ рд╣реИрдВ:
render(h) {
return h('DIV', {staticClass: 'some-styling' }, renderComponentWith({ props: {... }┬а}))
}
createHOC
рдШрдЯрдХ-рдкрд╣рд▓реЗ рдЧреИрд░-рдХрд░реА рд╣реИ, рдФрд░ рдлрд┐рд░ рдПрдХ рдХрд░реАрдмреА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ createHOCc
ред рд░рд┐рдПрдХреНрдЯ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ Vue рдХреЗ рд╡рд┐рдкрд░реАрдд рдмрд╣реБрдд рдХрд╛рд░реНрдпрд╛рддреНрдордХ-рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рдЬреЛ OOP рдврд╛рдВрдЪреЗ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдХреА Vue рдХреЗ рдЕрдиреБрд░реВрдк рд░рд╣рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИредcreateRenderFn
рд╕реЗ рдХрд╛рдлреА рдЦреБрд╢ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдареАрдХ рдпрд╣реА рдХрд░ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╕рд╛рде рд░рдЦрддрд╛ рд╣реВрдВ, рдЙрддрдирд╛ рд╣реА рдХрдо рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЗрд╕рдХрд╛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛:const hoc = createHOC(
Component,
{
created(){
/* ... */
}
},
{
props: (props) => ({
...props,
someProp: 'foo'
})
}
);
рд╢рд╛рдпрдж рдореИрдВ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВ?
рд╢рд╛рдпрдж рдореИрдВ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВ?
рдирд╣реАрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реИрдВ, рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдЙрд╕реА рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛ рд░рд╣реЗ рдереЗ рдЬрдм рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЕрдВрддрд┐рдо рдЙрддреНрддрд░ рдХреЗ рдмрд╛рдж рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╕реЛрдЪрд╛ред
рдЕрдкрдиреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреАрдУрд╕реА рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рд▓реЛрдЧ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдШрдЯрдХ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рд░реНрдХрдЕрдк рдЬреЛрдбрд╝ рд╕рдХреЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдм рдПрдЪрдУрд╕реА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдпреВрдЖрдИ рднреА рд▓рд╛рдПрдЧрд╛ ...
рд╣рд╛рдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЖрдк рдПрдЪрдУрд╕реА рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдмрд╛рд╣рд░ рдЪрд▓реЗ рдЧрдП рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд╕рдПрдлрд╕реА рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВрдиреЗ рдЕрднреА - рдЕрднреА npm рдкрд░
рдореИрдВ vue-compose рдкрд░ рднреА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рддреНрд╡рд░рд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг-рд╕рддреНрд░-рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рд╕реЗ рднреА рджреВрд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреБрдирд░реНрд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рдорд╛рди рд╣реИ, Vue рдмрд╣реБрдд рд╕рд╛рд░реА рдЪрддреБрд░ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ (рдЬреИрд╕реЗ рдХреИрд╢рд┐рдВрдЧ рдХрдВрдкреНрдпреВрдЯреЗрд╢рдВрд╕ рдФрд░ рдпрд╣ this
рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ) рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдЯрд┐рд▓ (рдпрд╛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ-рд╢реИрд▓реА) рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ: https://vuejs.org/v2/api/#extends
extends
рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╕рдЪ рд╣реИред
рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджреВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @jackmellis рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рдареЛрд╕ рдЖрдзрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рд╣рдо рдПрдЪрдУрд╕реА рдХреЛ рдХреЛрд░ рдореЗрдВ рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдореБрдЦреНрдпрддрдГ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдорд┐рдХреНрд╕рд┐рдиреНрд╕ / рдПрдХреНрд╕рдЯреЗрдВрдбреНрд╕ рдкрд░ рдХреЛрдИ рдмрдбрд╝рд╛ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред
рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдорд┐рдХреНрд╕рд┐рдиреНрд╕ / рдПрдХреНрд╕рдЯреЗрдВрдбреНрд╕ рдкрд░ рдХреЛрдИ рдмрдбрд╝рд╛ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред
@LinusBorg React рдиреЗ рдкрд╣рд▓реЗ рд╣реА mixin
рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ, HOC рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓рд╛рдн рд▓рд╛рддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдиреЗ рд▓рд╛рднреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рд╣реИ:
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Vue рдЯреАрдо рдХреЛ рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ HoC рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП .... рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Vue рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдЪрдУрд╕реА рдЗрддрдиреА рдмреЗрд╣рддрд░ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрдиреБрдмрдВрдз" рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдШрд░реНрд╖ рдПрдЪрдУрд╕реА рдХреЗ рд╕рд╛рде рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд┐рдПрдХреНрдЯ-рд░рд╛рдЙрдЯрд░ рдХреЗ рдЕрдиреБрд░рдХреНрд╖рдХ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рд╡рд╛рд░реНрддрд╛ рджреЗрдЦреЗрдВ: https://www.youtube.com/watch?v=BcVAq3YFiuc
рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ рдмреБрд░реЗ рд╣реИрдВ, рд╡реЗ рдХрдИ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИрдВред рд╡реЗ рд╕рд┐рд░реНрдл рдЬрд╛рджреВ рдХреА рдЧреЛрд▓реА рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рдирдХреА рдЙрдиреНрд╣реЗрдВ рд░рд┐рдПрдХреНрдЯ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдкреНрд░рд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдирдХреЗ рдЕрдкрдиреЗ рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХреА рдЪрд░реНрдЪрд╛ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ, Vue рдореЗрдВ HoCs рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЙрддрдирд╛ рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ React рдореЗрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Vue рдХрд╛ API рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╡реНрдпрд╛рдкрдХ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдПрдЬ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрд╛ рдЬрд╛рдирд╛ рд╣реИред
рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ Vue рдореЗрдВ рдХреБрдЫ рднреА рддреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ - HoC's рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИрдВред
666
рд╕рдмрд╕реЗ рдиреНрдпреВрдирддрдо рдПрдЪрдУрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛ рд╕реНрд▓реЙрдЯ рдХреЗ рд╕рд╛рде рдШрдЯрдХреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рд╣реИ:
function hoc(WrappedComponent) {
return {
render(h) {
return h(WrappedComponent, {
on: this.$listeners,
attrs:this.$attrs,
scopedSlots: this.$scopedSlots,
});
},
};
}
рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрддреНрддрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ,
рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрд╛
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рд╛ред
рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ: https://jsfiddle.net/Linusborg/j3wyz4d6/
рдореИрдВ рдПрдкреАрдЖрдИ рд╕реЗ рдЦреБрд╢ рдирд╣реАрдВ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдореЛрдЯрд╛ рд╡рд┐рдЪрд╛рд░ рд╕реНрдХреЗрдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рдЬреЛ рдЗрд╕реЗ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
createHOC
рдирд┐рдореНрди рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛:$createElement
рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рдХрд░реЗрдВредрдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рдмрд┐рд▓реНрдХреБрд▓ред рддреЛ рдордЬрд╝рд╛ рджреВрд╕рд░реЗ рддрд░реНрдХ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдШрдЯрдХ рд╡рд╕реНрддреБ рд╣реИред
рдпрджрд┐ рдЖрдк рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдкреНрд░реЙрдкреНрд╕, рдЕрдЯрд░реНрд╕ рдпрд╛ рд╢реНрд░реЛрддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк
createRenderFn
рд╣реЗрд▓реНрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреА рддрд░рд╣ рдПрдХ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдЧрд╛ рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреАattrs
,props
рдпрд╛listeners
рдХреЛ рдЖрдк рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗредрдпрджрд┐ рдЖрдк рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ
this.$slots
рд╕реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдПnormalizeSlots
рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЪрд╛рд╣рддрд╛ рдерд╛ :)