Vue: рдЪрд░реНрдЪрд╛: рдПрдЪрдУрд╕реА рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдЬреБрд▓ре░ 2017  ┬╖  40рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: vuejs/vue

рд╕рдВрд╕реНрдХрд░рдг

2.4.2

рдкреНрд░рдЬрдирди рд▓рд┐рдВрдХ

https://jsfiddle.net/o7yvL2jd/

рдкреНрд░рдЬрдирди рдХреЗ рдЪрд░рдг

рдореИрдВ vue.js рдХреЗ рд╕рд╛рде HoC рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдЦреЛрдЬ рд░рд╣рд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдХреЛрдИ рдЙрдкрдпреБрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ред
рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд▓рд┐рдВрдХ рдПрдЪрдУрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред
https://jsfiddle.net/o7yvL2jd/

рдореИрдВ рдХреИрд╕реЗ vue.js рдХреЗ рд╕рд╛рде HoC рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреИрд╕реЗ React.js рддрд░реАрдХреЗ рд╕реЗ HoC рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдХреНрдпрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ?

рд╡реЗ рдПрдЪрдУрд╕реА рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред
рд╕реНрд▓реЙрдЯ рдФрд░ рдИрд╡реЗрдВрдЯ рд╡рд╛рд▓реЗ HoCs рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд░реЗрдВрдбрд░ рд╣реЛрдВрдЧреЗред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ?

рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рддрддреНрд╡ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИ, рдпрд╛ рдкреНрд░рд╕реНрддреБрдд рдХреНрд░рдо рдмреЗрд╕рдХрдВрдкреЛрдиреЗрдВрдЯ рд╕реЗ рднрд┐рдиреНрди рд╣реИред
рдХреБрдЫ рдПрдЪрдУрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рд╛ред

рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ: 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 рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рдХрд░реЗрдВред
  • рдПрдХ рдирд╛рдо рдЬреЛрдбрд╝реЗрдВ
  • рдпрджрд┐ рдХреЛрдИ рджреВрд╕рд░рд╛ рддрд░реНрдХ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ), рдпрд╣ рдШрдЯрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ:

    • рд░рдВрдЧрдордВрдЪ рдХреА рд╕рд╛рдордЧреНрд░реА

    • attrs

    • рд╢реНрд░реЛрддрд╛рдУрдВ

    • рд╕рд╛рдорд╛рдиреНрдп рд╕реНрд▓реЙрдЯ

    • рд╕реНрдХреЛрдкреНрдб рд╕реНрд▓реЙрдЯ

рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рдмрд┐рд▓реНрдХреБрд▓ред рддреЛ рдордЬрд╝рд╛ рджреВрд╕рд░реЗ рддрд░реНрдХ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдШрдЯрдХ рд╡рд╕реНрддреБ рд╣реИред

рдпрджрд┐ рдЖрдк рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдкреНрд░реЙрдкреНрд╕, рдЕрдЯрд░реНрд╕ рдпрд╛ рд╢реНрд░реЛрддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк 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))
  }
})

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЪрд╛рд╣рддрд╛ рдерд╛ :)

рд╕рднреА 40 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдирдорд╕реНрддреЗ @ 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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдЗрд╕рд╕реЗ рдмрдЪреНрдЪреЗ рдХреЛ рд╕реНрд▓реЙрдЯ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ:

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

рдкреНрдпрд╛рд░рд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрдкрдХрд░рдг рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдЕрдзрд┐рдХ рдХрд╛рд░рдг рддреЛ рд╣рдо
рд╕рднреА рдЗрд╕ рдХреЛрдб рдХрд╛ рдкреБрди: рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рди рдХрд░реЗрдВред

рд░рд╡рд┐рд╡рд╛рд░, 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 рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рдХрд░реЗрдВред
  • рдПрдХ рдирд╛рдо рдЬреЛрдбрд╝реЗрдВ
  • рдпрджрд┐ рдХреЛрдИ рджреВрд╕рд░рд╛ рддрд░реНрдХ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ), рдпрд╣ рдШрдЯрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ:

    • рд░рдВрдЧрдордВрдЪ рдХреА рд╕рд╛рдордЧреНрд░реА

    • attrs

    • рд╢реНрд░реЛрддрд╛рдУрдВ

    • рд╕рд╛рдорд╛рдиреНрдп рд╕реНрд▓реЙрдЯ

    • рд╕реНрдХреЛрдкреНрдб рд╕реНрд▓реЙрдЯ

рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рдмрд┐рд▓реНрдХреБрд▓ред рддреЛ рдордЬрд╝рд╛ рджреВрд╕рд░реЗ рддрд░реНрдХ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдШрдЯрдХ рд╡рд╕реНрддреБ рд╣реИред

рдпрджрд┐ рдЖрдк рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдкреНрд░реЙрдкреНрд╕, рдЕрдЯрд░реНрд╕ рдпрд╛ рд╢реНрд░реЛрддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк 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() рдлрд╝рдВрдХреНрд╢рди рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣реИ рдирд╛?

рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реАред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд╣рд░ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИред

рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл рдПрдХ рдирд╛рдЯрдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реЗрдкреЛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдиреЛрдЯреНрд╕ рдХреА рдПрдХ рдЬреЛрдбрд╝реА:

  • createRenderFn рдХреЛ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ attrs/props/рд╢реНрд░реЛрддрд╛ рдХрд╛рд░реНрдп рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВ, рдпрд╣ рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкреНрд░реЙрдкреНрд╕ рдЖрджрд┐ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
  • рдХрдВрдкреЛрдЬрд╝рд┐рдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП рдХрдВрдкреЛрдиреЗрдВрдЯ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЕрдЧрд░ рдкреВрд░реА createHOC рдореЗрдердб рдХрд░реА рд╣реЛ рддреЛ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдХрдИ рд╣реЙрдХ рдХреНрд░рд┐рдПрдЯрд░реНрд╕ рдХреЛ рдПрдХ рд╕рд╛рде рдЪреЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдХреНрдпреЛрдВрдХрд┐ рд╣реЙрдХ рдХреЛ рдорд┐рдХреНрд╕рд┐рди рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк 2 рд╣реЙрдХреНрд╕ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛рдиреА 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 рдХреЗ рдЕрдиреБрд░реВрдк рд░рд╣рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
  • рдореИрдВрдиреЗ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рдХреБрдЫ рдХреЛрдб рдЬреЛрдбрд╝рд╛ рд╣реИред рдкреВрд░реЗ рд╣реЙрдХ рдХреЛ рдПрдХ рдорд┐рдХреНрд╕рд┐рди рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╣реЙрдХ рдФрд░ рдСрдкреНрд╢рдВрд╕ рдХреЛ рдСрдкреНрд╢рдВрд╕рдорд░реНрдЬ рд╕реНрдЯреНрд░реИрдЯреЗрдЬреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд░реНрдЬ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ optionsMergeStrategies рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡реАрдПрдо рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рддрддреНрдХрд╛рд▓рддрд╛ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд┐рд▓рдп рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рд╡реАрдПрдо рдирд╣реАрдВ рд╣реИред
  • рдореИрдВ 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,
      });
    },
  };
}

рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрддреНрддрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ,

  • рдкреНрд░реЙрдкреНрд╕ рдХреЙрдиреНрдлрд┐рдЧ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕рд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред$attrs to child
  • рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрд▓реЙрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ред$scopedSlots рдореЗрдВ v2.6.0+ . рдХреЗ рдмрд╛рдж рд╕реЗ рд╕реНрд▓реЙрдЯ рд╣реИрдВ

рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрд╛

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

paceband picture paceband  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bdedardel picture bdedardel  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

guan6 picture guan6  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

robertleeplummerjr picture robertleeplummerjr  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fergaldoyle picture fergaldoyle  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ