初识Vue3,Vue3与Vue2的一些小差别有哪些?
Vue3与Vue2小案例
完成下图效果
Vue2代码
<script>
export default {
data(){
return {
count:0
}
},
methods:{
add(){
this.count++
}
}
}
</script>
Vue3代码
<script setup>
import { ref } from 'vue'
const count = ref(0)
const add = ()=> count.value++
</script>
特点
- 代码量变少
- 分散式维护变成集中式维护
- v3对v2的兼容性很好
组合式 API (Composition API) 是一系列 API 的集合,使我们可以使用函数而不是声明选项的方式书写 Vue 组件
Vue3的更多优势
熟悉V3的项目目录和关键文件
package.json
vue的版本是3 + 依赖vite做底层驱动
vite.config.js
配置文件。类似vue2的vue.config.js。
业务文件夹src/main.js
new Vue() 创建vue的实例对象
createApp也是用来创建vue的实例对象
createApp(App).mount('#app')
mount('#app') 把vue的实例对象挂载在index.html的#app元素上
App.vue
- script -> template -> style
- script 上的setup是一个特殊的开关:
-
- 打开之后,就可以使用组合式api
- 不打开它,就可以继续兼容v2的写法
- template中可以不需要唯一的根元素的区别
小结
-
vite.config.js - 项目的配置文件基于vite的配置
-
package.json - 项目包文件核心依赖项变成了Vue3.x和vite
-
main.js - 入口文件 createApp函数创建应用实例
-
app.vue - 根组件SFC单文件组件script - template - style
- 脚本script和模板template顺序调整
- 模板template不再要求唯一根元素
- 脚本script添加setup标识支持组合式API
-
index.html - 单页入口提供id为app的挂载点
组合式API - setup选项
setup选项的写法和执行时机
类似于生命周期钩子的写法且执行时机再beforeCreate之前
<script>
export default {
setup(){
console.log('setup')
},
beforeCreate(){
console.log('beforeCreate')
}
}
</script>
setup中写代码的特点
在setup函数中写的数据和方法需要在末尾以对象的方式return,才能给模版使用。
<script>
export default {
setup(){
const message = 'this is message'
const logMessage = ()=>{
console.log(message)
}
// 必须return才可以
return {
message,
logMessage
}
}
}
</script>
注意:vue3不再推荐使用this.data去定义和修改数据,在setup中,console.log(this)会得到undefined。
script setup 语法糖
每次需要return是不是太麻烦了?觉得麻烦就对了,接下来介绍setup 语法糖让这个烦恼消失。
代码如下:
<script setup>
const message = 'this is message'
const logMessage = ()=>{
console.log(message)
}
</script>
组合式API - reactive和ref函数(响应式)
reactive
作用:接收对象类型数据的参数传入并返回一个响应式的对象
步骤
- 从vue包中导入reactive函数
- 在
<script setup>
中执行reactive
函数并传入类型为对象的初始值,使用变量接收返回值
示例代码:
<script setup>
import { reactive } from 'vue' // 导入
const state = reactive({ // 执行函数 传入参数 变量接收
count:0
})
const add = ()=>{
state.count++ // 修改数据更新视图
}
</script>
<template>
<button @click="add">{{state.count}}</button>
</template>
ref
作用:接收简单类型或对象类型数据的参数传入并返回一个响应式的对象
步骤
-
从vue包中导入ref函数
-
在
<script setup>
中执行ref函数并传入初始值,使用变量接收返回值- 在模板中使用数据不需加.value
- 在代码中使用数据要加.value
示例代码:
<script setup>
import { ref } from 'vue' // 导入
const setCount = ()=>{ // 执行函数 传入参数 变量接收
console.log(count)
// 修改数据更新视图必须加上.value
count.value++
}
</script>
<template>
<button @click="setCount">{{count}}</button>
</template>
两者比较
相同点:reactive和ref都用来生成响应式数据
不同点:
- reactive不能处理简单类型的数据
- ref参数类型支持更好,但必须通过.value来访问
- ref的实现是依赖于reactive的
这里更推荐大家使用ref,减少记忆成本😁
组合式API - computed
它与Vue2中的计算属性思想相同,简单了修改了API写法
步骤
- 导入
computed
函数 - 执行函数在回调参数中return基于响应式数据做计算的值,用变量接收
示例代码:
<script setup>
// 导入
import { computed } from 'vue'
// 执行函数 变量接收 在回调参数中return计算值
const computedState = computed(() => {
return 基于响应式数据做计算之后的值
})
</script>
组合式API - watch
作用
侦听一个或者多个数据的变化,数据变化时执行回调函数。
俩个额外参数immediate
控制立刻执行,deep
开启深度侦听
基础用法侦听单个数据
步骤
- 导入
watch
函数 - 执行
watch
函数传入要侦听的响应式数据(ref对象)和回调函数
示例代码:
<<template>
<button @click="add">
{{ count }}
</button>
</template>
<script setup>
// 1. 导入watch
import {ref, watch } from 'vue'
const count = ref(0)
const add = () => count.value++
// 2. 调用watch 侦听变化
// count: ref参数不需要加.value
watch(count, (newVal, oldVal) => {
console.log('旧值为',oldVal,'新值为',newVal )
})
</script>
侦听多个数据
侦听多个数据,第一个参数写出数组即可
<script setup>
// 1. 导入watch
import { ref, watch } from 'vue'
const count = ref(0)
const name = ref('cp')
// 2. 调用watch 侦听变化
watch([count, name], ([newCount, newName],[oldCount,oldName])=>{
console.log(`count或者name变化了,[newCount, newName],[oldCount,oldName])
})
</script>
立即监听 immediate
在侦听器创建时立即出发回调,响应式数据变化之后继续执行回调
直接看代码:
<script setup>
// 1. 导入watch
import { ref, watch } from 'vue'
const count = ref(0)
// 2. 调用watch 侦听变化
watch(count, (newValue, oldValue)=>{
console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)
},{
immediate: true
})
</script>
深度侦听 - 精准侦听
通过watch监听的ref对象默认是浅层侦听的,直接修改嵌套的对象属性不会触发回调执行,需要开启deep
未开启deep
<script setup>
// 1. 导入watch
import { ref, watch } from 'vue'
const state = ref({ count: 0 })
// 2. 监听对象state
watch(state, ()=>{
console.log('数据变化了')
})
const changeStateByCount = ()=>{
// 直接修改不会引发回调执行
state.value.count++
}
</script>
开启deep之后
<script setup>
// 1. 导入watch
import { ref, watch } from 'vue'
const state = ref({ count: 0 })
// 2. 监听对象state 并开启deep
watch(state, ()=>{
console.log('数据变化了')
},{deep:true})
const changeStateByCount = ()=>{
// 此时修改可以触发回调
state.value.count++
}
</script>
注意:开启deep的问题它会递归地处理处理所有的值,无论哪个属性被修改都会触发watch回调,这可能会导致不必要的浪费。(所以接下来就是精确监听)
精确监听
精确监听需要把第一个参数改成函数的写法,并返回要监听的具体属性
直接上代码:
watch(()=>state.value.name, (newVal, oldVal) => {
console.log('name变化了')
})
总结
Vue3与Vue2的差别的小小总结(初步认的总结)
- 代码量变少
- 使用了组合式API更容易维护
- 重新了diff算法使其拥有更快的速度
- 因为需要按需引入所以它的体积更小
- 响应式方面V3使用Proxy,V2使用
Object.defineProperty
- setup的出现,定义函数,数据,并以对象的方式return,执行时间在beforeCreate钩子之前
- Vue3不再推荐使用this.data去定义和修改数据在setup中的console.log(this)会得到undefined
转载自:https://juejin.cn/post/7252685715967983675