vue3.5新特性整理

本文章介绍vue3.5更新的几个新特性

1.vue中watch中深度监听更新的层级

在之前deep 属性是一个boolean值 我们要监听对象的变化需要使用deep: true 在vue3.5之后 deep 也可以是一个number 表示对象要监听的层级数量 这个功能还是比较实用的 因为层级过深的时候我们可能需要监听数据所在层级没有那么什么就不需要全部监听 可以优化性能

js 复制代码
<template>
    <div>
        <button @click="change">change</button>
    </div>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue'
let obj = ref({
    a: {
        n1: 0,
        b: {
            n2: 0,
            c: {
                n3: 0,
                d: {
                    n4: 0,
                    e: {
                        n5: 0
                    }
                }
            }
        }
    }
})
watch(obj, (val)=> {
    console.log(val)
}, {
    deep: 2
})


const change = () => {
    obj.value.a = {
        q: 0
    }
}
</script>

在 vue3.4 中watch 配置中还新增一个once 属性 只监听一次数据变化

复制代码
watch(obj, (val)=> {
    console.log(val)
}, {
    deep: 2,
    once: true
})

2.vue中之前响应式数据的定义和获取组件的示例都是用 ref 这个函数定义 vue3.5之后引入新的定义获取ref的函数 useTemplateRef

基本使用

js 复制代码
    之前的使用方式
    const inputDom = ref(null)
    <input value="" ref="inputDom" />
    获取dom
    inputDom.value.focus()
    
    
    3.5新增
    <template>
        <div>
            <input value="" ref="testRef" />
            <button @click="onHandler">获取焦点</button>
        </div>
    </template>
    <script setup lang="ts">
    import { useTemplateRef } from 'vue'

    const inputRef = useTemplateRef('testRef')

    const onHandler = () => {
        inputRef.value.focus()
    }

    </script>

3.Teleport 传送组件

Teleport 组件新增一个 defer 之前传送组件只能传送到 定义传送组件之前已经存在dom里面 现在新增这个defer属性 可以传送到 定义在传送组件后面的dom中

js 复制代码
TestTeleport.vaue
<template>
    <div >
        <Teleport defer  to="#demo_1" >
            <div >teleport test </div>
        </Teleport>
        <!-- 加上defer 属性可以将Teleport 组件放到demo_1 结构下面 -->
        <div id="demo_1">

        </div>
    </div>
</template>

Home.vue
<template>
  <main>
    <!-- 组件渲染之前已经存在dom结构 -->
    <div id='test'></div>
    <TeleportDemo />
  </main>
</template>

4.props 3.5之后新增一个比较好用的功能 对props解构

之前对 props 进行结构不能实现vue的响应式更新

并且对props 赋默认值需要使用 withDefaults 包裹有一点点麻烦 如果要想实现对props 结构需要使用 toRef/ toRefs

js 复制代码
TestProps.vue
<template>
    <div>
        test props
        <p>msg: {{ msg }}</p>
        <p>count: {{ count }}</p>
    </div>
</template>
<script setup lang="ts" >
import { watch } from "vue"

const { msg, count } = defineProps<{
    msg: string,
    count: number
}>()


watch(()=> count, (val)=> {
    console.log(val)
})

</script>

Home.vue


<template>
  <main>
    <TestProps  :msg="msg" :count="count" />
    <button @click="onTest">test</button>

  </main>
</template>
<script setup lang="ts">
import TestProps from '../components/TestProps.vue'
import { ref } from 'vue'
let msg = ref<string>('21323123')
let count = ref<number>(1)
function onTest() {
  count.value ++
}
</script>

5. onWatcherCleanup 新增api

这个api 也是优化watch 监听

如果要监听的属性变化很快而且我们在处理变化的之后的逻辑比较复杂 会很影响性能 之前处理这种操作可以使用防抖函数 现在vue 给我们提供了一种解决方法

js 复制代码
    <template>
        <div>
            {{ num }}
            <button @click="onTest">+1</button>

        </div>
    </template>
    <script setup lang='ts'>
    import {ref, watch, onWatcherCleanup } from 'vue'

    let num = ref<number>(0)

    watch(num, (val) => {
        let timer = setTimeout(()=> {
            console.log(val)
        }, 1000) 

        onWatcherCleanup(()=> {
            clearTimeout(timer)
        })
    })

    const onTest = () => {
        num.value ++
    }
    </script> 

注意 如果使用setTimeout测试间隔时间不能小于200ms 如果小于200毫秒 setTimeout 中的打印语句还是会执行的

以上就是我对vue3.5 更新的新特性的整理 如有错误欢迎指出

相关推荐
Ai-_Man1 小时前
您您这可以把Grok的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭
javascript·人工智能·ai·小程序·电脑
传人once1 小时前
多图片上传预览功能如何写
前端·css·html·jquery·html5
Eric.461 小时前
Wan‑Animate+MiniMax-H3 本地部署 AI 漫剧流水线:8G 显存动作迁移与动态分镜工程实战
前端·人工智能·comfyui·ai漫剧
liangshanbo12151 小时前
JavaScript 异步核心主线
javascript·事件循环·异步操作
传人once3 小时前
悬停旋转放大和位移效果如何写
javascript·css·动画
库拉镜像AI牛牛3 小时前
短剧内容自动化生产:知漫剧工作室落地教程
大数据·服务器·前端·人工智能·语音识别
律宏阔3 小时前
Flutter 列表图片内存优化:CachedNetworkImage 与 ClipRRect 的取舍
前端·flutter
行者全栈架构师3 小时前
【鸿蒙心迹】相册文搜图工程化落地:HarmonyOS 7.0 端侧 AI 检索全链路实战与 5 个踩坑解法
前端
律宏阔3 小时前
Dart 3 Record:解决 Future.wait 异构返回值的类型问题
前端·flutter
Seraphina363 小时前
DVWA(XSS Reflected/Stored High,CSRF Low)
前端·xss·csrf