vue3之语法糖

说起 Vue 3肯定不会陌生,作为时下最火的前端框架之一,很多人将它作为入门框架。

但是尽管 Vue 3很久之前就已经开始投入使用,也不免会有人抱怨 Vue 3的知识点太多太杂,更新太快。这不,最近 Vue 3又定稿了一项新技术:script-setup 语法糖

1.什么是setup语法糖

起初 Vue3.0 暴露变量必须 return 出来,template中才能使用

现在只需在script标签中添加setup,组件只需引入不用注册,属性和方法也不用返回,也不用写setup函数,也不用写export default ,甚至是自定义指令也可以在我们的template中自动获得

<template>
 <my-component :num="num" @click="addNum" />
</template>
​
<script setup>  import { ref } from 'vue';  import MyComponent from './MyComponent .vue';
​
 // 像在平常的setup中一样的写,但是不需要返回任何变量
 const num= ref(0)    //在此处定义的 num 可以直接使用
 const addNum= () => {  //函数也可以直接引用,不用在return中返回
  num.value++
 }
</script>
​
//必须使用驼峰命名

2.使用setup组件自动注册

在 script setup 中,引入的组件可以直接使用,无需再通过components进行注册,并且无法指定当前组件的名字,它会自动以文件名为主,也就是不用再写name属性了

<template>
    <zi-hello></zi-hello>
</template>
​
<script setup>
  import ziHello from './ziHello'
</script

3.使用setup后新增API

因为没有了setup函数,那么props,emit怎么获取呢

Setup script语法糖提供了新的API来供我们使用

3.1 defineProps

用来接收父组件传来的 props。

示例:

<template>
 <div class="die">
  <h3>我是父组件</h3>
  <zi-hello :name="name"></zi-hello>
 </div>
</template>
​
<script setup>  import ziHello from './ziHello'    import {ref} from 'vue'  let name = ref('赵小磊========')</script>子组件代码
​
<template>
 <div>
  我是子组件{{name}} // 赵小磊========
 </div>
</template>
​
<script setup>  import {defineProps} from 'vue'
​
 defineProps({
  name:{
   type:String,
   default:'我是默认值'
  }
 })


// 在js中使用则需要用变量接收
let obj = defineProps({
  msg: {
    type: String,
    default: "默认值",
  },
});
onMounted(() => {
  console.log(obj.msg);
});
</script>

3.2 defineEmits

子组件向父组件事件传递。示例:

子组件

<template>
    <h2>语法糖子组件</h2>
    <h3>{{msg}}</h3>
    <button @click="tofa">向父级传参</button>
</template>
<script setup>  import {defineEmits} from 'vue'
​
 **//自定义函数,父组件可以触发
 const em = defineEmits(['up'])
const tofa = () => {
    em('up', '我是sugarson') // 通过up方法向父组件传递
}**

父组件

<template>
    <div>
        <h2>语法糖</h2>
       // <son-view :uname="uname" xlj="肖丽君" @up="up"></son-view>
    </div>
</template>
<script setup>  
// 需要在组件中引用子组件中的方法
import SonView from './SonView.vue'    
const up = val => {
    console.log(val) // 子组件传递过来的值
}
</script>

3.3 defineExpose

组件暴露出自己的属性,在父组件中可以拿到。

示例:

子组件

<template>
 <div>
  我是子组件
 </div>
</template>
​
<script setup>  
import {defineExpose,reactive,ref} from 'vue'  
let ziage=ref(18)  
let ziname=reactive({    name:'赵小磊'  })  
//暴露出去的变量  
defineExpose({    ziage,    ziname  })
</script>

父组件

<template>
    <div>
        <h2>语法糖</h2>
        <h3>{{ myName }}</h3>
        <button @click="fn">提交</button>
        <!-- <check-all-vue></check-all-vue> -->
        <son-view :uname="uname" xlj="肖丽君" @up="up" ref="sonview"></son-view>
    </div>
</template>

<script setup>  
import ziHello from './ziHello'  
import {ref} from 'vue'  
const sonview = ref() // 给组件定义一个ref名称, 查找组件sonview  通过sonview找到子组件抛出的值
onMounted(() => {
    console.log('挂载后')
    console.log('接收ref暴漏出来的值',sonview.value.ziage)
  console.log('接收reactive暴漏出来的值',sonview.value.ziname.name)
})

4.语法糖生命周期

<script setup>
import {onMounted,onUnmounted} from 'vue'
//所有的生命周期用法均为回调函数
onMounted(()=>{
  console.log('我创建了');
})
// 销毁实例变为onUnmounted,与vue2的destroy作用一致
onUnmounted(()=>{
  console.log('我销毁了');
})
</script>

5.ref获取dom节点

<script setup>
import { ref ,getCurrentInstance,nextTick} from 'vue'
import Header from './Header.vue'
​
const {proxy} = getCurrentInstance()
const rename = ref(null)//声明一个和ref一样的名字,直接获取它
nextTick(()=>{
  console.log(rename.value)
  //console.log(proxy.$refs.rename) 或者直接这样获取
    //要获取子组件的dom节点,通过绑定ref在子组件标签上,子组件获取自己的dom节点,通过defineExpose暴露给父组件
})
</script>
​
<template>
  <div ref="rename"></div>
  <Header/>
  <div></div>
</template>
```vue <script setup> /** * ✅ 使用 <script setup> + onMounted 语法糖 * * 在 Vue 3 的 <script setup> 中,onMounted 可直接使用, * 无需 return 或 defineExpose,是组合式 API 的“语法糖”体现。 */ import { ref, onMounted } from &#39;vue&#39; // 响应式数据 const message = ref(&#39;Hello, Vue 3!&#39;) const mountedTime = ref(&#39;&#39;) // DOM 已挂载钩子(等价于 Vue 2 的 mounted 钩子) onMounted(() => { console.log(&#39;[onMounted] 组件已挂载到页面&#39;) mountedTime.value = new Date().toLocaleTimeString() // 可执行以下操作: // - 初始化第三方库(如 Chart.js、Map) // - 发起 API 请求 // - 访问 DOM 元素(配合模板引用) }) </script> <template> <div class="mounted-example"> <h3>{{ message }}</h3> <p>组件挂载时间: <strong>{{ mountedTime }}</strong></p> <small>✔️ onMounted 在 script setup 中自动注册</small> </div> </template> <style scoped> .mounted-example { padding: 20px; border: 1px solid #ddd; border-radius: 8px; background-color: #f9f9f9; max-width: 400px; } h3 { margin: 0 0 10px; color: #2c3e50; } p { font-size: 14px; color: #555; } </style> ``` --- ### 回答问题 在 Vue 3 中,`onMounted` 在 `<script setup>` 中是如何工作的?它为什么被称为“语法糖”? ### 给出解释 #### ✅ 什么是 `onMounted`? `onMounted` 是 Vue 3 组合式 API 提供的一个**生命周期钩子函数**,用于在组件完成 DOM 挂载后执行代码。 - 等价于选项式 API 中的 `mounted()` 钩子; - 常用于: - 操作 DOM; - 初始化非响应式实例(如图表、地图); - 发起首次数据请求; --- ### 🔧 `<script setup>` 如何简化 `onMounted` 的使用? #### 1. **无需显式导出或声明组件对象** 传统写法(选项式 API): ```js export default { mounted() { console.log(&#39;组件已挂载&#39;) } } ``` 组合式 API(普通 setup): ```js import { onMounted } from &#39;vue&#39; export default { setup() { onMounted(() => { console.log(&#39;组件已挂载&#39;) }) } } ``` ✅ `<script setup>` 语法糖(最简): ```vue <script setup> import { onMounted } from &#39;vue&#39; onMounted(() => { console.log(&#39;组件已挂载&#39;) }) </script> ``` > 🎯 编译器会自动将 `onMounted` 注册为 `mounted` 生命周期钩子 —— 这就是“语法糖”的本质:**开发者感知更简单,编译器背后处理复杂逻辑**。 --- #### 2. **语法糖的本质是什么?** | 特性 | 解释 | |------|------| | 🍬 隐式返回 | 不需要 `return {}` 暴露变量和方法 | | 🧼 自动注册生命周期 | 所有 `onXXX` 钩子自动绑定 | | ⚡ 更少样板代码 | 减少 `setup() {}`、`export default` 等冗余结构 | | 📦 编译时转换 | `<script setup>` 被编译为标准的 `setup()` 函数 | 例如: ```vue <script setup> onMounted(() => { ... }) </script> ``` 会被编译为: ```js setup() { onMounted(() => { ... }) } ``` --- #### 3. **可以多次调用 `onMounted`** ```js onMounted(() => console.log(1)) onMounted(() => console.log(2)) ``` 多个 `onMounted` 会按顺序执行,适用于逻辑拆分或组合式函数(composables)复用。 --- #### 4. **与模板引用结合使用** ```vue <script setup> import { ref, onMounted } from &#39;vue&#39; const el = ref(null) onMounted(() => { console.log(el.value) // 获取真实 DOM 元素 el.value.focus() // 聚焦输入框 }) </script> <template> <input ref="el" type="text" /> </template> ``` --- #### 5. **常见用途汇总** | 场景 | 示例 | |------|------| | 初始化图表 | `new Chart(ctx, config)` | | 加载异步数据 | `fetchData()` | | 第三方库集成 | `new Map(container, options)` | | 监听事件 | `window.addEventListener` | | 动画启动 | `gsap.from(...)` | ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值