通過上一篇文章嚐鮮vue3.0-從ToDoList開始的介紹,你們能夠初步瞭解一下vue3.0的簡單寫法。接下來,我描述一下尤大總結的整體變化,以及目前成熟的rfcs(語法變化)。html
Performance(性能)vue
slot語法變化react
directiveapi
//動態轉入指令名稱 <div v-bind:[key]="value"></div> <div v-on:[event]="handler"></div> // import { h, resolveComponent, resolveDirective, withDirectives } from 'vue' export default { render() { const comp = resolveComponent('some-global-comp') const fooDir = resolveDirective('foo') const barDir = resolveDirective('bar') // <some-global-comp v-foo="x" v-bar="y" /> return withDirectives( h(comp), [fooDir, this.x], [barDir, this.y] ) } }
爲了運行tree-shaking,將api經過全局的import導出性能優化
//好比 import {nextTick,h,} from 'vue'
刪除 v-bind.sync,用v-model代替數據結構
函數式組件必須爲函數app
{ functional: true }
<template functional>
//與2.X相比 //只使用props和slot(data和childre就沒了) //使用的新的api inject代替injections //parent被刪除,首選使用props 和 injections //listeners 將包括在 attrs 屬性中 import { inject } from 'vue' import { demo } from './Demo' const FunctionalComp = (props, { slots, attrs, emit }) => { const demoCom = inject(demo) return h('div', `Using demo ${demoCom}`) }
import { defineAsyncComponent } from 'vue' const AsyncComp = defineAsyncComponent(() => import('./Foo.vue'))
改變Vue行爲的global API被移到由新的apicreateApp
方法建立的應用實例中,他們的只做用於app實例中,不改變Vue行爲的gloabl API經過import使用,見第5點
dom
h
使用import從vue中引用,見第五點props, { slots, attrs, emit }
export default { render() { return h( 'div', //之前 //{ // domProps: { innerHTML: '' }, //on: { click: foo }, //key: 'foo', //class: ['foo', 'bar'], //style: { color: 'red' }, //attrs: { id: 'foo' }, //}, // 扁平化的數據結構 { innerHTML: '', id: 'app', onClick:clickFn, key: 'foo', class: ['foo', 'bar'], style: { color: 'red' } }, [ h('span', 'world') ] ) } }
目前變化的api,東西太多講不完。大概就是上一遍新增的ref,reactive,watchEffect
等api異步
transition變化ide
<transition>
做爲組件的根將再也不觸發轉換class變化
v-enter-from
替換 v-enter
v-leave-from
替換 v-leave
v-appear-from
替換 v-appear
$on, $off, $once
在vue2.0裏面,能夠用聲明式的$emit
可觸發父組件中的方法,可是也能使用命令式的$on, $off, $once
也能實現。算是一種重載,也考慮到也不必暴露組件實例
屬性的強制行爲
當值爲布爾值時再也不移除屬性。相反,它被設置爲attr="false"。若要刪除該屬性,請使用null或undefined。
//vue2.0中原話 //若是 isButtonDisabled 的值是 null、undefined 或 false,則 disabled attribute 甚至不會被包含在渲染出來的 <button> 元素中 <button v-bind:disabled="isButtonDisabled">Button</button>
棄用 >>>
和 /deep/
//使用這種 ::v-deep(.bar) {}
::v-global(.foo) {}
當前,從父節點傳入的插槽內容同時受到父節點和子節點的樣式影響。沒法顯式的建立以slot內容爲目標的樣式,或者不影響slot內容的樣式,vue3.0中增長::v-slotted()
::v-slotted(.foo) {}
目前的改動簡單的列舉了一下,vue3.0改動很大,可是更可能是整理簡化api,增長更多開發者須要的api,內部語法調整,以及性能優化。仍是儘可能的貼合之前開發習慣,下降升級成本。因此你們不用擔憂,能夠愉快的接受3.0
喜歡的話,大佬們能夠點贊收藏,後續再更新😄
下一篇嚐鮮vue3.0-tyepscript開發組件(3)