性能更好,打包体积更小,更好的ts支持,更好的代码组织,更好的逻辑抽离,更多的新功能。
Composition API的生命周期:
beforecate和created被setup方法本身所取代。
Options API的生命周期:
Composition API
和Options API
是Vue.js中的两种组件编写方式。
Options API
是Vue.js早期版本中使用的编写方式,通过定义一个options
对象进行组件的配置,包括props、data、methods、computed、watch
等选项。这种方式的优点在于结构清晰、易于理解,在小型项目中比较实用。
Composition API
是Vue.js 3.x
版本中新引入的一种组件编写方式,它以函数的形式组织我们的代码,允许我们将相关部分组合起来,提高了代码的可维护性和重用性。Composition API
还提供了模块化、类型推断等功能,可以更好地实现面向对象编程的思想。
Composition API
更好的代码组织,更好的逻辑复用和可维护性,更好的类型推导,可拓展性更好;
两种API各有优缺点,使用哪种API取决于具体的项目需求。对于小型项目,Options API
更为简单方便;对于大型项目,Composition API
可以更好地组织代码。
总之,Vue.js的Composition API
和Options API
是为了满足不同开发者的需求而存在的,我们应该根据具体的场景选择使用哪种API,以达到更好的开发效果和代码质量。
官方文档解答:为什么要有组合式 API?
性能优化:Vue.js 3.0
使用了Proxy
替代Object.defineProperty
实现响应式,并且使用了静态提升技术来提高渲染性能。新增了编译时优化,在编译时进行模板静态分析,并生成更高效的渲染函数。
Composition API:Composition API
是一个全新的组件逻辑复用方式,可以更好地组合和复用组件的逻辑。
TypeScript支持:Vue.js 3.0
完全支持TypeScript
,在编写Vue应用程序时可以更方便地利用TS的类型检查和自动补全功能。
新的自定义渲染API:Vue.js 3.0
的自定义渲染API允许开发者在细粒度上控制组件渲染行为,包括自定义渲染器、组件事件和生命周期等。
改进的Vue CLI:Vue.js 3.0
使用了改进的Vue CLI
,可以更加灵活地配置项目,同时支持Vue.js2.x
项目升级到Vue.js 3.0
。
移除一些API:Vue.js 3.0
移除了一些不常用的API,如过渡相关API,部分修饰符等。
Proxy
和Object.defineProperty
都可以用来实现JavaScript
对象的响应式,但是它们有一些区别:
实现方式:Proxy
是ES6
新增的一种特性,使用了一种代理机制来实现响应式。而Object.defineProperty
是在ES5
中引入的,使用了getter
和setter
方法来实现。
作用对象:Proxy
可以代理整个对象,包括对象的所有属性、数组的所有元素以及类似数组对象的所有元素。而Object.defineProperty
只能代理对象上定义的属性。
监听属性:Proxy
可以监听到新增属性和删除属性的操作,而Object.defineProperty
只能监听到已经定义的属性的变化。
性能:由于Proxy
是ES6
新增特性,其内部实现采用了更加高效的算法,相对于Object.defineProperty
来说在性能方面有一定的优势。
综上所述,虽然Object.defineProperty
在Vue.js 2.x
中用来实现响应式,但是在Vue.js 3.0
中已经采用了Proxy
来替代,这是因为Proxy
相对于Object.defineProperty
拥有更优异的性能和更强大的能力。
使用Proxy
和Reflect
API实现vue3响应式。
Vue3会将响应式对象转换为一个Proxy
对象,并利用Proxy
对象的get
和set
拦截器来实现对属性的监听和更新。当访问响应式对象的属性时,get
拦截器会被触发,此时会收集当前的依赖关系,并返回属性的值;当修改响应式对象的属性时,set
拦截器会被触发,此时会触发更新操作,并通知相关的依赖进行更新。
优点:可监听属性的变化、新增与删除,监听数组的变化
watch 和 watchEffect 都是监听器,watchEffect 是一个副作用函数。它们之间的区别有:
watch 既要指明监视的数据源,也要指明监视的回调。而 watchEffect 可以自动监听数据源作为依赖。不用指明监视哪个数据,监视的回调中用到哪个数据,那就监视哪个数据。
watch 可以访问改变之前和之后的值,watchEffect 只能获取改变后的值。
watch 运行的时候不会立即执行,值改变后才会执行,而 watchEffect 运行后可立即执行。这一点可以通过 watch 的配置项 immediate 改变。
watchEffect有点像 computed , 但 computed 注重的计算出来的值(回调函数的返回值), 所以必须要写返回值。而 watcheffect注重的是过程(回调函数的函数体),所以不用写返回值。
watch与 vue2.x中 watch 配置功能一致,但也有两个小坑:
Vue 3 中新增了teleport(瞬移)组件,可以将组件的 DOM 插到指定的组件层,而不是默认的父组件层,可以用于在应用中创建模态框、悬浮提示框、通知框等组件。
Teleport 组件可以传递两个属性:
to (必填):指定组件需要挂载到的 DOM 节点的 ID,如果使用插槽的方式定义了目标容器也可以传入一个选择器字符串。
disabled (可选):一个标志位指示此节点是否应该被瞬移到目标中,一般情况下,这个 props 建议设为一个响应式变量来控制 caption 是否展示。
总之,Teleport 组件是 Vue3 中新增的一个非常有用的组件,可以方便地实现一些弹出框、提示框等组件的功能,提高了开发效率。
ref: 函数可以接收原始数据类型与引用数据类型。ref函数创建的响应式数据,在模板中可以直接被使用,在 JS 中需要通过 .value 的形式才能使用。
reactive: 函数只能接收引用数据类型。
toRef:针对一个响应式对象的属性创建一个ref,使得该属性具有响应式,两者之间保持引用关系。