【vue3】vue3.5

vue3.5是9.1发布的,还挺热乎的,赶快学习起来!!!

组件属性结构解析赋值

组件属性结构解析赋值,高度提高开发体验,这个特性曾经在vue3.3提出过,然后3.4废弃,终于3.5稳定了。下面一起来看看怎么用的吧。

html 复制代码
<script setup lang="ts">
  import { watch } from 'vue';

  // 自定义属性结构解析,可在结构解析时赋默认值
  const { count = 0, name = '张三' } = defineProps<{
    count: number;
    name: string;
  }>();

  // 监听自定义属性改变
  watch(
    () => count,
    (value) => {
      console.log('count', value);
    }
  );
</script>

<template>
  <div>{{ count }}</div>
  <div>{{ name }}</div>
</template>

内置组件teleport优化

Teleport 可以将一个组件内部的一部分模板"传送"到该组件的 DOM 结构外层的位置去,但有一个局限,传送元素只能在目标元素后面,vue3.5给 Teleport 加了一个defer属性,可以忽略这个顺序。

html 复制代码
<template>
  // 这里'传送'成功
  <div id="box1"></div>
  <teleport to="#box1">
    <div>我系渣渣辉box1</div>
  </teleport>
  <teleport to="#box2">
    <div>我系渣渣辉box2</div>
  </teleport>
  // 这里'传送'失败
  <div id="box2"></div>
  <Teleport defer to="#box3">
    <div>我系渣渣辉box3</div>
  </Teleport>
  // 这里'传送'成功
  <div id="box3"></div>
</template>

useTemplateRef

返回一个浅层 ref,其值将与模板中的具有匹配 ref attribute 的元素或组件同步。

html 复制代码
<script setup lang="ts">
  import { ref, useTemplateRef } from 'vue';
  import Comp from './Comp.vue';

  // before
  const domDiv = ref<HTMLDivElement>();
  // after
  const div = useTemplateRef('domDiv');
  const divInnerText = () => {
    div.value!.innerText = '张三6666';
  };

  // before
  // const comp = ref<HTMLDivElement>();
  // after
  const useTComp = useTemplateRef<{
    addNum: () => void;
  }>('comp');

  const addCompNum = () => {
    useTComp.value!.addNum();
    // comp.value.addNum();
  };
</script>

<template>
  <div ref="domDiv"></div>
  <button @click="divInnerText">innerText</button>
  <Comp ref="comp"></Comp>
  <button @click="addCompNum">comp num++</button>
</template>

onWatcherCleanup

注册一个清理函数,在当前侦听器即将重新运行时执行。只能在 watchEffect 作用函数或 watch 回调函数的同步执行期间调用 (即不能在异步函数的 await 语句之后调用)。这个让我想起了防抖,当然可以作为防抖来使用。

html 复制代码
<script setup lang="ts">
  import { ref, watch, onWatcherCleanup } from 'vue';
  const num = ref(0);
  watch(
    () => num.value,
    (value) => {
      const timer = setTimeout(() => {
      	// 按钮被点击停下后1秒后打印,一直点击则不触发,输入框同理
        console.log(value, '改变发生请求');
      }, 1000);
      onWatcherCleanup(() => {
        clearTimeout(timer);
      });
    }
  );
</script>

<template>
  <button @click="num++">num++</button>
</template>
相关推荐
计算机魔术师20 分钟前
Anthropic官方插件被「寄生」,背后是同一类攻击又来了
前端
我命由我1234541 分钟前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
key_3_feng1 小时前
评估与对齐:Agent 自我进化的护栏
前端·数据库·agent
程序员大阳1 小时前
副队长JavaScript教程(65)-详解JSON:轻量级数据交换格式
javascript·json·序列化·反序列化·stringify·parse
LaughingZhu2 小时前
Product Hunt 热榜 2026-10-30:Empacer、Scape、Floot in ChatGPT
java·前端·数据库·人工智能·chatgpt·notion
Lank_M2 小时前
抠图结果缩放后边缘发脏,该怪的不是插值
前端
jerrywus2 小时前
Skill、MCP、Workflow、Rules、Memory 有什么区别?拿几次真实开发任务讲清楚
前端·agent·claude
补码缩写2 小时前
canvas 与 sharp 缩放透明图:默认预乘,非预乘得拆通道
前端
静默回滚2 小时前
抠图 PNG 缩小再放大,边缘又糊又白是两件事
前端
用户11977079480732 小时前
GitHub 电商开源项目分享:用 sharp 批量出饰品主图,试了裁剪、细节图和色彩配置文件三个坑
前端·node.js