vue script setup语法糖

创建项目

yarn 安装的 vue3.0+vite+ts

yarn create @vitejs/app my-vue-ts-vite --template vue-ts

示例

这个时候你在App.vue发现这个 script setup语法糖

<template>
  <h1><a href="">{{ count }}</a></h1>
  <h1>{{state.data.a}}</h1>
  <button @click="count++">count ++</button>
</template>

<script setup>
import {ref,defineProps,reactive,watch } from 'vue';
import {helloLog} from '/@/hooks/hello'
/*
基本数据类型
引用数据类型(复杂类型) 个人建议 ref初始化变量 
ref 和 reactive 本质我们可以简单的理解为ref是对reactive的二次包装, 
ref定义的数据访问的时候要多一个.value
*/
 const count =ref(0);
 const state = reactive({
   data:{a:1}
 })
 defineProps({
  msg:  {
      type: String,
      required: true
    }
})
watch(count,(e)=>{
console.log('count变化了:>> ', e);
})
function name(params) {
  console.log('原始html用法 ',helloLog());
}
// 
</script>

<style  scoped lang="scss" >
h1{
  a {
  color: #42b983;
}
}

label {
  margin: 0 0.5em;
  font-weight: bold;
}

code {
  background-color: #eee;
  padding: 2px 4px;
  border-radius: 4px;
  color: #304455;
}
</style>


总结模板

组件

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

<script setup>
import {ref,defineProps,reactive,getCurrentInstance } from 'vue';
    const internalInstance = getCurrentInstance();//获取当前实例
    const route = internalInstance?.appContext.config.globalProperties.$route;

/*
基本数据类型
引用数据类型(复杂类型) 个人建议 ref初始化变量 
ref 和 reactive 本质我们可以简单的理解为ref是对reactive的二次包装, 
ref定义的数据访问的时候要多一个.value
*/
 const count =ref(0);
 const state = reactive({
   data:{a:1}
 })

 defineProps({
  msg:  {
      type: String,
      required: true
    }
})

</script>

<style  scoped lang="scss" >

</style>

普通页面

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

<script setup>
import {ref,defineProps,reactive,getCurrentInstance } from 'vue';
    const internalInstance = getCurrentInstance();//获取当前实例
    const route = internalInstance?.appContext.config.globalProperties.$route;
import HelloWorld from '/@/components/HelloWorld.vue'
/*
基本数据类型
引用数据类型(复杂类型) 个人建议 ref初始化变量 
ref 和 reactive 本质我们可以简单的理解为ref是对reactive的二次包装, 
ref定义的数据访问的时候要多一个.value
*/
 const count =ref(0);
 const state = reactive({
   data:{a:1}
 })


</script>

<style  scoped lang="scss" >

</style>

个人评价

script setup语法糖提供了传统html函数使用方式的便利性+组件化开发的效率,组件导入即可使用无需扔到components,需要计算属性引入 watch即可

### Vue3 中 `setup` 语法糖编译后的实现分析 #### 编译过程概述 在 Vue 3 中,`<script setup>` 是一种语法糖设计,用于简化组件开发流程。当开发者编写 `<script setup>` 部分时,Vue 的编译器会将其转换为标准的 `setup` 函数形式[^1]。这一过程主要发生在 SFC (Single File Component, 单文件组件) 的解析阶段。 具体来说,`compileScript` 函数负责处理 `<script setup>` 对应的部分,并通过 AST 抽象语法树的方式对其进行遍历和转化。最终的结果是一个标准化的 `setup` 函数,其中包含了所有的逻辑声明以及模板所需的绑定数据。 --- #### 编译后输出结构 以下是 `<script setup>` 被编译之后的标准输出形式: ```javascript export default { setup() { const msg = 'Hello Vue!'; function handleClick() { console.log('Button clicked!'); } return { msg, handleClick }; } }; ``` 在这个例子中: - 所有在 `<script setup>` 块中定义的变量(如 `msg`)会被自动加入到返回的对象中。 - 定义的方法(如 `handleClick`)同样被包含在返回对象中,以便能够在模板中调用它们[^2]。 这种机制解释了为什么在 `<script setup>` 层级定义的内容可以无缝地传递给模板部分使用——因为这些内容都被显式地暴露给了外部环境。 --- #### 模板中的可访问性 为了使 `<template>` 可以直接访问 `<script setup>` 中定义的数据或方法,Vue 在内部实现了特殊的绑定逻辑。这实际上依赖于 `setup` 返回值的作用域提升技术。也就是说,任何由 `setup` 函数返回的属性都可以作为全局上下文的一部分供模板读取。 例如,在上述代码片段中,如果存在如下模板: ```html <template> <div>{{ msg }}</div> <button @click="handleClick">Click me</button> </template> ``` 那么这里的 `{{ msg }}` 和 `@click="handleClick"` 将能够正常工作,原因在于 `msg` 和 `handleClick` 已经被 `setup` 显式导出了。 --- #### 组件注册优化 关于为何导入组件后可以直接使用而不需要手动注册的问题,这是由于 Vue 3 提供了一种隐式的局部组件注册方式。在这种模式下,只要某个组件已经被成功引入并赋值给常量,则该组件即可视为已注册状态。 举个简单的例子: ```javascript // MyComponent.vue <script setup> import ChildComponent from './ChildComponent.vue'; const localState = true; </script> <template> <!-- 这里无需额外配置 components 字段 --> <ChildComponent /> </template> ``` 在这里,`ChildComponent` 并未显示添加至父组件的 `components` 列表之中;然而它依然能正常使用,这是因为其引用关系已被静态分析工具捕获并记录下来。 --- #### 开发调试注意事项 值得注意的是,在实际开发过程中,建议关闭 JavaScript Source Maps 功能以避免打断点时跳转回原始 `.vue` 文件而非目标编译产物的情况发生[^3]。这样可以帮助工程师更专注于审查生成的目标代码行为本身。 --- ### 总结 综上所述,Vue 3 的 `<script setup>` 语法糖不仅极大地提升了编码效率,还隐藏了许多底层细节使得应用构建更加直观流畅。通过对源码的理解可以看出,其实现背后涉及到了复杂的 AST 解析、作用域管理以及动态模块加载等多个方面的工作协同完成。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值