setup语法糖体验

一、准备

1.1 简介

vue提案链接(注意详细链接每天都在变化,这是 vue 官方的在github维护的提案仓库,写在今天的提案索引是 40,自己进入链接寻找)
setup语法糖 一个减少重复代码的语法糖,之前setup语法糖的提案在修改阶段,现阶段已经定稿,详情看下面的语法

1.2 插件准备

如果你使用vscode编辑器,最好安装 Volar 插件,它和 Vetur 一样也会对.Vue格式的文件高亮显示,支持vue2、vue3,并且还多了在 template 中对 TypeScript 的支持,自定义组件标签高亮,以及本文要说的 setup语法糖 支持
注意来自Volar插件的提示:

Note: You need to disable Vetur to avoid conflicts.

Vetur 也是之前写 vue2 很常用的插件,但是它已经十分落后,不支持 vue3 的 setup 语法糖,会发生冲突,如果你想写 vue3 的 setup 语法糖请卸载或者禁用它,安装 Volar 足矣。

<script setup lang="ts">
import HelloWorld from "./components/HelloWorld.vue";  //此处使用 Vetur 插件会报红
</script>

二、语法

2.1 组件引入

之前的写法

<script lang="ts">
import { defineComponent } from 'vue';
import HelloWord from '@/components/HelloWord.vue';
export default defineComponent({
  name: 'Home',
  components:{
    HelloWord
  }
});
</script>

现在的写法

<script setup lang="ts">
import HelloWord from '@/components/HelloWord.vue'; //不用注册,引入即注册
</script>

2.2 定义组件的 props

<script setup lang="ts">
import { ref,defineProps } from 'vue'
type Props={
  msg:string
}
defineProps<Props>(); // 在 setup 中,defineProps 相当于全局变量,不用引入直接使用,注意这是 vue编译器实现的,非 setup 需要引入
</script>

2.3 定义响应变量、函数、监听、计算属性....

<script setup lang="ts">
import { ref,computed,watchEffect } from 'vue'
const count = ref(0); //不用 return ,直接在 templete 中使用
const addCount=()=>{  //定义函数,使用同上
  count.value++;
}
const howCount=computed(()=>"现在count值为:"+count.value);//定义计算属性,使用同上
watchEffect(()=>console.log(count.value)); //定义监听,使用同上
//...some code else
</script>

2.3 使用 await 异步

注意在vue3的源代码中,setup执行完毕,函数 getCurrentInstance 内部的有个值会释放对 currentInstance 的引用,await 语句会导致后续代码进入异步执行的情况。所以上述例子中最后一个 getCurrentInstance() 会返回 null,建议使用变量保存第一个 getCurrentInstance() 返回的引用.

三、其他

3.1 语法糖实现

vue文件代码

<template>
  <div>{{ msg }}</div>
</template>
<script setup>
  const msg = 'Hello!'
</script>

编译后的js代码:

export default {
  setup() {
    const msg = 'Hello!'

    return function render() {
      // has access to everything inside setup() scope
      // 在函数 setup 作用域,函数 render 能访问 setup 的一切,
      return h('div', msg)
    }
  }
}

注意到,即使普通变量也能作为模版被置入 template 中被编译,某些人认为这不合适,不够分离。我觉得还好,还ok

posted @   Sebastian·S·Pan  阅读(1283)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示