рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЖрдкрдХреЗ Vue рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ, рдкреНрд░рджрд░реНрд╢рди рдЧрддрд┐ рдмрдврд╝рд╛рдиреЗ рдФрд░ рдмрдВрдбрд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдиреМ рд╕реБрдЭрд╛рд╡ рджрд┐рдП рдЧрдП рд╣реИрдВред
рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ
рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд░рд▓, рдЫреЛрдЯрд╛ рдШрдЯрдХ рд╣реИред рд╡рд╣ рдЬреЛ рдХреБрдЫ рднреА рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЯреИрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:
<template> <div> <div v-if="value"></div> <section v-else></section> </div> </template> <script> export default { props: ['value'] } </script>
рдЗрд╕ рдШрдЯрдХ рдХреЛ
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рдХрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдп рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдЗрд╕рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ:
<template functional> <div> <div v-if="props.value"></div> <section v-else></section> </div> </template> <script> export default { props: ['value'] } </script>
Vue v3.0 рдореЗрдВ рдХреМрди рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгрдмрд╛рд▓ рдШрдЯрдХреЛрдВ рдореЗрдВ рдЕрд▓рдЧрд╛рд╡
рдПрдХ рдШрдЯрдХ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
<template> <div :style="{ opacity: number / 300 }"> <div>{{ heavy() }}</div> </div> </template> <script> export default { props: ['number'], methods: { heavy () { } } } </script>
рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ Vue рд╣рд░ рдмрд╛рд░ рдШрдЯрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рднрд╛рд░реА () рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛, рдЕрд░реНрдерд╛рдд, рд╣рд░ рдмрд╛рд░ рдЬрдм рдкреНрд░реЙрдореНрдкреНрд╕ рдореВрд▓реНрдп рдмрджрд▓рддрд╛ рд╣реИред
рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдШрдЯрдХ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╣рдо рднрд╛рд░реА рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдмрд╛рд▓ рдШрдЯрдХ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ:
<template> <div :style="{ opacity: number / 300 }"> <ChildComp/> </div> </template> <script> export default { props: ['number'], components: { ChildComp: { methods: { heavy () { } }, render (h) { return h('div', this.heavy()) } } } } </script>
рдХреНрдпреЛрдВ? Vue рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдШрдЯрдХреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрднрд░ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рдореВрд▓ рдШрдЯрдХ рдореЗрдВ рд░рдВрдЧ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдмрдЪреНрдЪреЗ рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рднрд╛рд░реА () рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм рдмрдЪреНрдЪреЗ рдХреЗ рдШрдЯрдХ рдХреЗ рдореВрд▓ рдШрдЯрдХ рдореЗрдВ рдбреЗрдЯрд╛ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЕрдиреНрдпрдерд╛, рдмрдЪреНрдЪреЗ рдХреЛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред
рдЧреЗрдЯреНрдЯрд░ рд▓реЛрдХрд▓ рдХреИрд╢
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШрдЯрдХ рдореЗрдВ рджреВрд╕рд░реА рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рд╣реИ:
<template> <div :style="{ opacity: start / 300 }">{{ result }}</div> </template> <script> export default { props: ['start'], computed: { base () { return 42 }, result () { let result = this.start for (let i = 0; i < 1000; i++) { result += this.base } return result } } } </script>
рдпрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдзрд╛рд░ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд▓реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рд╣рд░ рдмрд╛рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, Vue рдХреБрдЫ рддрд░реНрдХ рдЪрд▓рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рдХреИрд╕реЗ рдФрд░ рдХрд┐рди рдбреЗрдЯрд╛ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЙрд▓ рд╣реИрдВ, рддреЛ рдЗрди рдЫреЛрдЯреЗ рдУрд╡рд░рд╣реЗрдбреНрд╕ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдПрдХ рдмрд╛рд░ рдЖрдзрд╛рд░ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдФрд░ рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╡реИрд░рд┐рдПрдмрд▓ рдкрд░ рдорд╛рди рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП:
<template> <div :style="{ opacity: start / 300 }">{{ result }}</div> </template> <script> export default { props: ['start'], computed: { base () { return 42 }, result () { const base = this.base </script>
рд╡реА-рд╢реЛ рдХреЗ рд╕рд╛рде рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдбреЛрдо
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
<template functional> <div> <div v-if="props.value"> <Heavy :n="10000"/> </div> <section v-else> <Heavy :n="10000"/> </section> </div> </template>
рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЖрд╡рд░рдг рдШрдЯрдХ рд╣реИ рдЬреЛ рдХреБрдЫ рдмрд╛рд▓ рдШрдЯрдХреЛрдВ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП v-if рдФрд░ v- рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡реА-рдЗрдл рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд░ рдмрд╛рд░, рдЬрдм рдПрдХ рд░рд╛рдЬреНрдп рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдмрдЪреНрдЪрд╛ рдШрдЯрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдирд╖реНрдЯ) рд╣реБрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рднреА рдиреЛрдбреНрд╕ рдХреЛ DOM рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛), рдФрд░ рджреВрд╕рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдлрд┐рд░ рд╕реЗ рдорд╛рдЙрдВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рдпреЗ рдШрдЯрдХ "рднрд╛рд░реА" рд╣реИрдВ, рддреЛ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреЗ рд╕рдордп рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рдЯрдХрд╛ рд╣реБрдЖ рдорд┐рд▓реЗрдЧрд╛ред
рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рд╕рдорд╛рдзрд╛рди - рд╡реА-рд╢реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
<template functional> <div> <div v-show="props.value"> <Heavy :n="10000"/> </div> <section v-show="!props.value"> <Heavy :n="10000"/> </section> </div> </template>
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ,
рджреЛрдиреЛрдВ рдмрдЪреНрдЪреЗ рдШрдЯрдХ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рддреБрд░рдВрдд рдорд╛рдЙрдВрдЯ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдПрдХ рд╕рд╛рде рдореМрдЬреВрдж рд╣реЛрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, Vue рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп рдШрдЯрдХреЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡рд╣ рдЬреЛ рдХреБрдЫ рднреА рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рдХреЛ рдЫрд┐рдкрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реАрдПрд╕рдПрд╕ рдХреЗ рд╕рд╛рде рджреВрд╕рд░рд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рддреЛ рд░рд╛рдЬреНрдп рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рддреЗрдЬ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕рд╕реЗ рдЙрдЪреНрдЪ рдореЗрдореЛрд░реА рд▓рд╛рдЧрдд рд╣реЛрдЧреАред
рдЙрдкрдпреЛрдЧ <рд░рдЦрдиреЗ-рдЬреАрд╡рд┐рдд>
рддреЛ, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдШрдЯрдХ рдПрдХ
рд░рд╛рдЙрдЯрд░ рдХреЗ рдКрдкрд░ рдПрдХ рдЖрд╡рд░рдг рдШрдЯрдХ рд╣реИред
<template> <div id="app"> <router-view/> </div> </template>
рд╕рдорд╕реНрдпрд╛ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИ - рдЖрдкрдХреЗ рд░рд╛рдЙрдЯрд░ рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХреЗ рджреМрд░рд╛рди рдмрдирд╛рдпрд╛, рдорд╛рдЙрдВрдЯ рдФрд░ рдирд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдФрд░ рдпрд╣рд╛рдБ рд╕рдорд╛рдзрд╛рди рд╕рдорд╛рди рд╣реИ - Vue рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдХреИрд╢ рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдШрдЯрдХреЛрдВ рдХреЛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╢реЗрд╖ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд
<рд░рдЦ-рдЬреАрд╡рд┐рдд> рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
<template> <div id="app"> <keep-alive> <router-view/> </keep-alive> </div> </template>
рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рд╕реЗ рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ Vue "рдЬреАрд╡рд┐рдд" рдЕрдзрд┐рдХ рдШрдЯрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рднреА рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реЛрдЪ-рд╕рдордЭрдХрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рд╣реИред рдирд┐рдпрдореЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╢рд╛рдорд┐рд▓ рдФрд░ рдмрд╣рд┐рд╖реНрдХреГрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рди рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреМрди рд╕рд╛ рдирд╣реАрдВ:
<template> <div id="app"> <keep-alive include="home,some-popular-page"> <router-view/> </keep-alive> </div> </template>
рдЖрд╕реНрдердЧрд┐рдд рдкреНрд░рддрд┐рдкрд╛рджрди
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдПрдХ рдШрдЯрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдмрд╣реБрдд рднрд╛рд░реА рдмрд╛рд▓ рдШрдЯрдХ рд╣реИрдВ:
<template> <div> <h3>I'm an heavy page</h3> <Heavy v-for="n in 10" :key="n"/> <Heavy class="super-heavy" :n="9999999"/> </div> </template>
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдШрдЯрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рд╣реИред рдФрд░ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рддрдм рддрдХ рдХреБрдЫ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг, рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ рдмрдЪреНрдЪреЗ рджреЛрдиреЛрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдП рд╣реЛрдВред рдФрд░ рдЕрдЧрд░ рд╕рд╣рд╛рдпрдХ рдХрдВрдкрдирд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХреНрдд рд╕реНрдХреНрд░реАрди рдореЗрдВ рдЕрдВрддрд░рд╛рд▓ рдорд┐рд▓реЗрдЧрд╛ред
рдЖрдк рдмрд╛рд▓ рдШрдЯрдХреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдореЗрдВ рджреЗрд░реА рдХрд░рдХреЗ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
<template> <div> <h3>I'm an heavy page</h3> <template v-if="defer(2)"> <Heavy v-for="n in 10" :key="n"/> </template> <Heavy v-if="defer(3)" class="super-heavy" :n="9999999"/> </div> </template> <script> import Defer from '@/mixins/Defer' export default { mixins: [ Defer() ] } </script>
рдпрд╣рд╛рдБ, defer (n) рдлрд╝рдВрдХреНрд╢рди рдЧрд▓рдд n рдлрд╝реНрд░реЗрдо рджреЗрддрд╛ рд╣реИред рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдЪ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рднрд╛рдЧ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХрдИ рдлрд╝реНрд░реЗрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЦреАрдВрдЪрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдорд┐рд▓рддреА рд╣реИред
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдпрджрд┐ v-if рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдЧрд▓рдд рд╣реИ, рддреЛ Vue рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рднрд╛рдЧ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред
рдПрдиреАрдореЗрд╢рди рдХреЗ рдкрд╣рд▓реЗ рдлреНрд░реЗрдо рдореЗрдВ рд╣рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:
<template> <div> <h3>I'm an heavy page</h3> <template v-if="false"> <Heavy v-for="n in 10" :key="n"/> </template> <Heavy v-if="false" class="super-heavy" :n="9999999"/> </div> </template>
Vue рдмрд╕ рд╣реЗрдбрд░ рдХреЛ рдорд╛рдЙрдВрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдлреНрд░реЗрдо рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдбреЗрдлрд░ (2) рд╕рдЪ рд▓реМрдЯрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛
<template> <div> <h3>I'm an heavy page</h3> <template v-if="true"> <Heavy v-for="n in 10" :key="n"/> </template> <Heavy v-if="false" class="super-heavy" :n="9999999"/> </div> </template>
Vue 10 рдмрд╛рд▓ рдШрдЯрдХ рдмрдирд╛рдПрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдорд╛рдЙрдВрдЯ рдХрд░реЗрдЧрд╛ред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕ рдкрд░ defer (3) рд╕рд╣реА рд▓реМрдЯреЗрдЧрд╛ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдПрдХ рднрд╛рд░реА рдШрдЯрдХ рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдЙрдВрдЯ рдХрд┐рдП рдЧрдП рднрд╛рдЧреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдорд┐рд▓рддреА рд╣реИ, рдЬреЛ рдХрд┐ рдпреВрдПрдХреНрд╕ рдореЗрдВ рдмрд╣реБрдд рд╕реБрдзрд╛рд░ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рд╣реИрдВрдЧ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦреЗрдЧрд╛ред
рдорд┐рдХреНрд╕рд░ рдбрд┐рдлрд░ рдХреЛрдб:
export default function (count = 10) { return { data () { return { displayPriority: 0 } }, mounted () { this.runDisplayPriority() }, methods: { runDisplayPriority () { const step = () => { requestAnimationFrame(() => { this.displayPriority++ if (this.displayPriority < count) { step() } }) } step() }, defer (priority) { return this.displayPriority >= priority } } } }
рдЖрд▓рд╕реА рдШрдЯрдХ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ
рдЕрдм рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдмрд╛рд▓ рдШрдЯрдХреЛрдВ рдХреЗ рдЖрдпрд╛рдд рдХреА:
import Heavy from 'Heavy.js' export default { components: { Heavy } }
рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЖрдпрд╛рдд рдореЗрдВ, рдмрдЪреНрдЪрд╛ рдШрдЯрдХ рддреБрд░рдВрдд рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрдпрд╛рдд рд╡рд┐рд╡рд░рдг рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред рдпрд╛, рдпрджрд┐ рдЖрдк рдХрд▓реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ рдмрдЪреНрдЪрд╛ рдШрдЯрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрдВрдбрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдкрдХрд╛ рдмрдЪреНрдЪрд╛ рдШрдЯрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдпрд╣ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:
const Heavy = () => import('Heavy.js') export default { components: { Heavy } }
рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рд╣реА рдЪрд╛рд╣рд┐рдП Vue рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдШрдЯрдХ рдХреЛ рд╕реНрд╡рдпрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдЧрд╛ рдФрд░ рддреИрдпрд╛рд░ рд╣реЛрддреЗ рд╣реА рдЙрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдЖрдк рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдХрд▓реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ Heavy.js рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рджреМрд░рд╛рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╡рдЬрди рдХрдо рдХрд░ рджреЗрдВрдЧреЗ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЧрддрд┐ рдмрдврд╝рд╛ рджреЗрдВрдЧреЗред
рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рджреГрд╢реНрдп
рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдЪреВрдВрдХрд┐ рдЖрдкрдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк
рд╣рдореЗрд╢рд╛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
const Home = () => import('Home.js') const About = () => import('About.js') const Contacts = () => import('Contacts.js') new VueRouter({ routes: [ { path: '/', component: Home }, { path: '/about', component: About }, { path: '/contacts', component: Contacts }, ] })
рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЗрд╡рд▓ рддрднреА рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рд░реНрдЧ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдЧрд╛ред рдФрд░ рдкрд╣рд▓реЗ рдирд╣реАрдВред
рдЧрддрд┐рд╢реАрд▓ рдШрдЯрдХ
рдЗрд╕реА рддрд░рд╣, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
<template> <div> <component :is="componentToShow"/> </div> </template> <script> export default { props: ['value'], computed: { componentToShow() { if (this.value) { return () => import('TrueComponent.js') } return () => import('FalseComponent.js') } } } </script>
рдлрд┐рд░, рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЗрд╡рд▓ рддрднреА рд▓реЛрдб рд╣реЛрдЧрд╛ рдЬрдм рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
Vuex рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рдмрдбрд╝реЗ рдХрд╛рдореЛрдВ рд╕реЗ рдмрдЪреЗрдВ
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рднрдВрдбрд╛рд░рдг рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рд░рдгреА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
fetchItems ({ commit }, { items }) { commit('clearItems') commit('addItems', items)
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИред рд╕рднреА рдЖрд╡рд╛рдЧрдорди рд╕рдордХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдмрдбрд╝реЗ рд╕рд░рдгреА рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЖрдкрдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХрд╛рд░реНрдп рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реБрджреНрдз рдХрд░реЗрдЧрд╛ред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕рд░рдгреА рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдПрдХ рдирдпрд╛ рдлреНрд░реЗрдо рдЦреАрдВрдЪрдиреЗ рдХрд╛ рд╕рдордп рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ:
fetchItems ({ commit }, { items, splitCount }) { commit('clearItems') const queue = new JobQueue() splitArray(items, splitCount).forEach( chunk => queue.addJob(done => {
рдЖрдк рдЬрд┐рд╕ рдЫреЛрдЯреА рдкрд╛рд░реНрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЖрдкрдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЙрддрдирд╛ рд╣реА рд╕реНрдореВрде рд░рд╣реЗрдЧрд╛ рдФрд░ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рдХреБрд▓ рд╕рдордп рд▓рдВрдмрд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд╛рдЙрдирд▓реЛрдб рд╕рдВрдХреЗрддрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдЬреЛ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рдЙрдирдХреЗ рдЕрдиреБрднрд╡ рдореЗрдВ рднреА рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рдХрд░реЗрдЧрд╛ред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
рдФрд░ рдЖрдЬ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдгред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдп рд╣реИ: рд╣рдо рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╕реНрддрд░ рдХреЗ рдЭреБрдВрдб рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░рдг рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝реА рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
const data = items.map( item => ({ id: uid++, data: item,
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ Vue рд╕рднреА рдиреЗрд╕реНрдЯреЗрдб рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдкреАрдЫреЗ рд▓реЗ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛ рджреЗрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рд╣реИ, рддреЛ рдпрд╣ рдорд╣рдВрдЧрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - рдЕрдирд╛рд╡рд╢реНрдпрдХред
рдпрджрд┐ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХрдИ рд╕реНрддрд░реЛрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ Vue рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХреЗ рдПрдХ рд╕рдореВрд╣ рд╕реЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
const data = items.map( item => optimizeItem(item) ) function optimizeItem (item) { const itemData = { id: uid++, vote: 0 } Object.defineProperty(itemData, 'data', {