Vue.js 2.6 рдХрд╛ рдЕрд╡рд▓реЛрдХрди

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!

рдмрд╣реБрдд рдЬрд▓реНрдж, Vue.js рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - 2.6ред рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдЖрдкрдХреЛ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдорд┐рд▓реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдирдпрд╛ рд╕реНрд▓реЙрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕, Vue.observable () рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рд╢рд╛рдорд┐рд▓ рд╣реИ!


1. рд╕реНрдХреЛрдк рд╕реНрд▓реЙрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕


рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • рдирдпрд╛ рд╡реА-рд╕реНрд▓реЙрдЯ рдирд┐рд░реНрджреЗрд╢рди рд╕рдВрдпреЛрдЬрди рд╕реНрд▓реЙрдЯ рдФрд░ рд╕реНрд▓реЙрдЯ-рдЧреБрдВрдЬрд╛рдЗрд╢
  • рдирд╛рдорд╛рдВрдХрд┐рдд рд╕реНрдХреЛрдк рд╕реНрд▓реЙрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрдХрдЯ

рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╣реИ:

рд╕рдВрд╕реНрдХрд░рдг Vue@2.5.22 рдореЗрдВ рд╕реНрдХреЛрдк рдХрд┐рдП рдЧрдП рд╕реНрд▓реЙрдЯ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдереЗ:

<template> <TestComponent> <!--  scoped slot --> <div slot-scope="{ message }"> {{ `Default slot with message: ${message}` }} </div> <!--  scoped slot --> <div slot="text" slot-scope="{ text }"> {{ `Named slot with text: ${text}` }} </div> </TestComponent> </template> 

рдЕрдм рдореИрдВ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

 <template> <TestComponent> <!--  scoped slot --> <template v-slot="{ message }"> <div> {{ `Default slot with message: ${message}` }} </div> </template> <!--  scoped slot --> <template v-slot:text="{ text }"> <div> {{ `Named slot with text: ${text}` }} </div> </template> </TestComponent> </template> 

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

 <template> <!-- v-slot     --> <TestComponent v-slot="{ message }"> <div> {{ `Default slot with message: ${message}` }} </div> </TestComponent> </template> 

рдФрд░ рдпрд╣рд╛рдБ рдирд╛рдорд┐рдд рд╕реНрд▓реЙрдЯ рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрдХрдЯ рд╣реИ:

 <template> <TestComponent> <!-- # -    v-slot: --> <template #text="{ text }"> <div> {{ `Named slot with text: ${text}` }} </div> </template> </TestComponent> </template> 

рдирдП рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдЧреБрдВрдЬрд╛рдЗрд╢ рдЪрд░ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рд╕реНрд▓реЙрдЯ рдЕрднреА рднреА рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ $ scopedSlots рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ред

рд╕рдВрджрд░реНрдн:

  1. рдирдпрд╛ рд╡реА-рд╕реНрд▓реЙрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕

  2. рд╡реА-рд╕реНрд▓реЙрдЯ рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрдХрдЯ


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> <!-- v-bind    --> <div v-bind:[key]="value"></div> <!--  v-bind    --> <div :[key]="value"></div> <!-- v-on    --> <div v-on:[event]="handler"></div> <!--  v-on    --> <div @[event]="handler"></div> <!-- v-slot    --> <TestComponent> <template v-slot:[name]> Hello </template> </TestComponent> <!--  v-slot    --> <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 { //    async serverPrefetch() { await this.fetchItem(); }, computed: { item() { return this.$store.state.item; }, }, //    mounted() { if (!this.item) { this.fetchItem(); } }, methods: { async fetchItem() { await this.$store.dispatch('fetchItem'); }, }, }; </script> 

рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рднреА рд╕рд░реНрд╡рд░рдкрд╛рд░реНрдЯреАрдЪ () рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдиреЗ рдЕрдкрдирд╛ рд░реЗрдВрдбрд░ рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛, рд╕рд░реНрд╡рд░ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдПрдХ рд░реЗрдВрдбрд░ () рд╣реБрдХ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛:

 /*  entry-server.js */ 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 = () => { //       serverPrefetch() context.state = store.state; }; resolve(app); }, reject); }); 

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"> //    vue.esm.js, //    , //        import Vue from 'path/to/vue.esm.browser.js'; new Vue({ el: '#app', data() { return { message: 'Hello World!', }; }, }); </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 рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣рд╛рдВ рдЖрдк рдЗрд╡рд╛рди рдХреА рдкреЛрд╕реНрдЯ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдЦ рдХреЛ рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/hi437582/


All Articles