рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!
рдмрд╣реБрдд рдЬрд▓реНрдж, Vue.js рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - 2.6ред рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдЖрдкрдХреЛ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдорд┐рд▓реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдирдпрд╛ рд╕реНрд▓реЙрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕, Vue.observable () рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рд╢рд╛рдорд┐рд▓ рд╣реИ!
1. рд╕реНрдХреЛрдк рд╕реНрд▓реЙрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕
рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдирдпрд╛ рд╡реА-рд╕реНрд▓реЙрдЯ рдирд┐рд░реНрджреЗрд╢рди рд╕рдВрдпреЛрдЬрди рд╕реНрд▓реЙрдЯ рдФрд░ рд╕реНрд▓реЙрдЯ-рдЧреБрдВрдЬрд╛рдЗрд╢
- рдирд╛рдорд╛рдВрдХрд┐рдд рд╕реНрдХреЛрдк рд╕реНрд▓реЙрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрдХрдЯ
рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╣реИ:рд╕рдВрд╕реНрдХрд░рдг Vue@2.5.22 рдореЗрдВ рд╕реНрдХреЛрдк рдХрд┐рдП рдЧрдП рд╕реНрд▓реЙрдЯ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдереЗ:
<template> <TestComponent> <div slot-scope="{ message }"> {{ `Default slot with message: ${message}` }} </div> <div slot="text" slot-scope="{ text }"> {{ `Named slot with text: ${text}` }} </div> </TestComponent> </template>
рдЕрдм рдореИрдВ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:
<template> <TestComponent> <template v-slot="{ message }"> <div> {{ `Default slot with message: ${message}` }} </div> </template> <template v-slot:text="{ text }"> <div> {{ `Named slot with text: ${text}` }} </div> </template> </TestComponent> </template>
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрд▓реЙрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдирд╛рдорд┐рдд рд╕реНрд▓реЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
<template> <TestComponent v-slot="{ message }"> <div> {{ `Default slot with message: ${message}` }} </div> </TestComponent> </template>
рдФрд░ рдпрд╣рд╛рдБ рдирд╛рдорд┐рдд рд╕реНрд▓реЙрдЯ рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрдХрдЯ рд╣реИ:
<template> <TestComponent> <template #text="{ text }"> <div> {{ `Named slot with text: ${text}` }} </div> </template> </TestComponent> </template>
рдирдП рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдЧреБрдВрдЬрд╛рдЗрд╢ рдЪрд░ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рд╕реНрд▓реЙрдЯ рдЕрднреА рднреА рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ $ scopedSlots рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ред
рд╕рдВрджрд░реНрдн:
- рдирдпрд╛ рд╡реА-рд╕реНрд▓реЙрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕
- рд╡реА-рд╕реНрд▓реЙрдЯ рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрдХрдЯ
2. рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рддрд░реНрдХ
рдпрджрд┐ рдЖрдк v-bind рдпрд╛ v-on рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрддрд┐рд╢реАрд▓ рддрд░реНрдХ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ Vue@2.5.22 рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ:
<div v-bind="{ [key]: value }"></div> <div v-on="{ [event]: handler }"></div>
рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдХреБрдЫ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:
- рд╣рд░ рдХреЛрдИ рд╡рд╕реНрддреБрдУрдВ рдкрд░ v-bind / v-on рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдЪрд░ рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ
- vue-template-compier рдЕрдпреЛрдЧреНрдп рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ
- v- рд╕реНрд▓реЙрдЯ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИ
рдЙрдирд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, Vue@2.6.0 рдПрдХ рдирдпрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ:
<div v-bind:[key]="value"></div> <div v-on:[event]="handler"></div>
рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг: <template> <div> <div v-bind:[key]="value"></div> <div :[key]="value"></div> <div v-on:[event]="handler"></div> <div @[event]="handler"></div> <TestComponent> <template v-slot:[name]> Hello </template> </TestComponent> <TestComponent> <template #[name]> Cool slot </template> </TestComponent> </div> </template>
рд╕рдВрджрд░реНрдн:
3. Vue.observable () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╡рд╕реНрддреБрдПрдВ рдмрдирд╛рдирд╛
рдкрд╣рд▓реЗ, рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рд╡реАрдпреВ рдХрдВрдкреЛрдиреЗрдВрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдВрджрд░ рдЪрд┐рдкрдХрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рд╡рд╕реНрддреБ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рддреА рд╣реИ - Vue.observable ()ред
рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╡рд╕реНрддреБ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд░реЗрдВрдбрд░ рдФрд░ рдЧрдгрдирд╛ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг: import Vue from vue; const state = Vue.observable({ counter: 0, }); export default { render() { return ( <div> {state.counter} <button v-on:click={() => { state.counter++; }}> Increment counter </button> </div> ); }, };
4. рд╕рд░реНрд╡рд░ рдкрд░ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛
рдирдП рдЕрдкрдбреЗрдЯ рдореЗрдВ, рд╡реАрдпреВ-рд╕рд░реНрд╡рд░-рд░реЗрдВрдбрд░рд░ рдиреЗ рдПрд╕рдПрд╕рдЖрд░ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рд░рдгрдиреАрддрд┐ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред
рдкрд╣рд▓реЗ, рд╣рдореЗрдВ asyncData () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд░реВрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдШрдЯрдХреЛрдВ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЧрдИ рдереАред
рдирдП рд╕рдВрд╕реНрдХрд░рдг рдиреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рд╢реБрд░реВ рдХреА - рд╕рд░реНрд╡рд░рдкреНрд░реЗрдЪ ()ред рд╡реАрдпреВ-рд╕рд░реНрд╡рд░-рд░реЗрдВрдбрд░рд░ рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдкрд░ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдФрд░ рд╣рд▓ рдХрд┐рдП рдЧрдП рд╡рд╛рджреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛:
<template> <div v-if="item"> {{ item.name }} </div> </template> <script> export default { </script>
рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рднреА рд╕рд░реНрд╡рд░рдкрд╛рд░реНрдЯреАрдЪ () рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдиреЗ рдЕрдкрдирд╛ рд░реЗрдВрдбрд░ рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛, рд╕рд░реНрд╡рд░ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдПрдХ рд░реЗрдВрдбрд░ () рд╣реБрдХ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛:
import { createApp } from './app'; export default context => new Promise((resolve, reject) => { const { app, router, store } = createApp(); const { url } = context; router.push(url); router.onReady(() => { context.rendered = () => {
5. рдмреЗрд╣рддрд░ рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ
HTML рдХреЛ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдкрд░, vue-template-compiler рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИред Vue рдЕрдкрдиреЗ рд╕реНрдерд╛рди рдХреЗ рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рдерд╛, рдЕрдм рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рд╡рд╣ рдХрд╣рд╛рдВ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг: <template> <div> <template key="test-key"> {{ message }} </template> </div> </template>
рддреНрд░реБрдЯрд┐ vue-template-compiler@2.5.22:
Error compiling template: <div> <template key="test-key"> {{ message }} </template> </div> - <template> cannot be keyed. Place the key on real elements instead.
рдирдИ рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ vue-template-compiler@2.6.0:
Errors compiling template: <template> cannot be keyed. Place the key on real elements instead. 1 | 2 | <div> 3 | <template key="test-key"> | ^^^^^^^^^^^^^^ 4 | {{ message }} 5 | </template>
6. рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛
Vue рдЕрдм рдЬреАрд╡рди рдЪрдХреНрд░ рд╣реБрдХ рдФрд░ рдШрдЯрдирд╛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдореЗрдВ рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг: /* TestComponent.vue */ <template> <div @click="doSomething()"> Some message </div> </template> <script> export default { methods: { async doSomething() { await this.$nextTick(); throw new Error('Another Error'); }, }, async mounted() { await this.$nextTick(); throw new Error('Some Error'); }, }; </script>
рдорд╛рдЙрдВрдЯ рдХреЗ рдмрд╛рдж рддреНрд░реБрдЯрд┐:
[Vue warn]: Error in mounted hook (Promise/async): "Error: Some Error"
рдХреНрд▓рд┐рдХ рдХреЗ рдмрд╛рдж рддреНрд░реБрдЯрд┐:
[Vue warn]: Error in v-on handler (Promise/async): "Error: Another Error"
7. рдИрдПрд╕рдПрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдирд┐рд░реНрдорд╛рдг
рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдПрдХ рдФрд░ Vue рдЕрд╕реЗрдВрдмрд▓реА рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИ - vue.esm.browser.jsред рдпрд╣ рдЙрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ ES6 рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:- HTML рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдлрдВрдХреНрд╢рди рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИ
- ES6 рдореЙрдбреНрдпреВрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
- рдЕрдирд╛рд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╢рд╛рдорд┐рд▓ рд╣реИ
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг: <html lang="en"> <head> <title>Document</title> </head> <body> <div id="app"> {{ message }} </div> <script type="module"> </script> </body> </html>
рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдФрд░ рдЕрд╕реЗрдВрдмрд▓реА рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - vue.esm.browser.js рдХреЗ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди HTML рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдмрд┐рдирд╛ред рдЬрдм рдореИрдВ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ ES6 рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдирд╡реАрдирддрдо рдХреЛрдб рджреЗ рдкрд╛рдКрдВрдЧрд╛ред
8. v-bind.prop рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо
рд╡реА-рдмрд╛рдЗрдВрдб рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╢реЛрдзрдХ рд╣реИред -рдкреНрд░реЙрдкред рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣
рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛
рд╣реИ ред рдореИрдВрдиреЗ рдЦреБрдж рдХрднреА рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреА рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдЬрдм рдпрд╣ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реЛред
рдЕрдм рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╣реИ: v-bind рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп: someProperty.prop = "foo", рдЖрдк .someProperty = "foo" рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ Vue@2.5.22 рдкрд░ рдерд╛:
<template> <div> <div v-bind:textContent.prop="'Important text content'" /> <div :textContent.prop="'Important text content'" /> </div> </template>
Vue@2.6.0 рдкрд░ рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ:
<template> <div .textContent="'Important text content'" /> </template>
9. рдХрд╕реНрдЯрдо toString () рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди
рдпрд╣ рд╕рд░рд▓ рд╣реИ: рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ toString () рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ VU рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж JSON.stringify () рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг: /* TestComponent.vue */ <template> <div> {{ message }} </div> </template> <script> export default { data() { return { message: { value: 'qwerty', toString() { return 'Hello Habr!'; }, }, }; }, }; </script>
рд╕рдВрд╕реНрдХрд░рдг Vue@2.5.22 рдореЗрдВ рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ рджреЗрдЦреЗрдВрдЧреЗ:
{ "value": "qwerty" }
рд╕рдВрд╕реНрдХрд░рдг Vue@2.6.0 рдореЗрдВ:
Hello Habr!
10. рд╡реА-рдХрд╛рдо рдХреЗ рд╕рд╛рде рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП
рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╡реА-рдлреЙрд░ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛
рд╣реИ , рдЬреЛ
рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ
рд╣реИрдВ , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореИрдк рдпрд╛ рд╕реЗрдЯред рд╕рдЪ рд╣реИ, 2.X рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХрддрд╛ рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдФрд░ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг: /* TestComponent.vue */ <template> <div> <div v-for="item in items" :key="item" > {{ item }} </div> </div> </template> <script> export default { data() { return { items: new Set([4, 2, 6]), }; }, }; </script>
рдЖрдк Vue рдХрд╛ рдмреАрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдХреЗ рдЕрднреА рд╕рднреА рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдПрдХреНрд╢рди рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
npm i vue@2.6.0-beta.3
рдпрджрд┐ рдЖрдк рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди vue рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ SSRs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ vue-template-compiler рдФрд░ vue-server-renderer рдЬреЛрдбрд╝рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ:
npm i vue-template-compiler@2.6.0-beta.3 vue-server-renderer@2.6.0-beta.3
рдЕрджреНрдпрддрди: Vue 2.6 рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛,
рдпрд╣рд╛рдВ рдЖрдк рдЗрд╡рд╛рди рдХреА рдкреЛрд╕реНрдЯ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдЦ рдХреЛ рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!