vue3(setup语法糖+TS)

本文深入探讨Vue3的Composition API,包括响应式数据、计算属性、监听器、生命周期、组件间通信等核心概念。讲解了setup语法糖、ref、reactive、 computed、watchEffect的使用,以及如何实现异步组件、自定义指令和插件。此外,还介绍了父子组件通信、全局事件总线和Suspense组件的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只有身在更高处的你才能体验风不一样的感觉, 看不一样的风景

vue-cli

  • 创建项目:vue create [project-name]
  • 运行项目:npm run serve

vite

  • 创建项目: npm init vite@latest
  • 运行项目:npm run dev

Composition API(组合API)

refreactive

ref
  • 定义一个响应式的数据
  • 语法
<script setup lang="ts">
	// 按需导入API
	import {
   
    ref } from 'vue'
	const refDc = ref('dc')
</script>
  • 打印refDc
    ref对象

  • 使用需要通过.value方式,但是模板中是不需要这样的,自动会解包{ { refDc }}就可使用

  • 如果被套在reactive中会自动解包不用.value

  • 基本类型的数据:响应式依然是靠Object.defineProperty()getset方式完成

  • 对象类型的数据:内部是通过reactive函数完成(下面会有介绍)

shallowRef()
  • ref()浅层作用形式
import {
   
    shallowRef } from "vue"

const obj = shallowRef({
   
    name: "dc", age: 21 })
obj.value.name = "dcdc"  /* 并不会触发响应式 */
// obj.value  ===> { name: "dc", age: 21 }
// 即
obj.value = {
   
   name: '帝尘'}  /* 这样才会触发响应式 */
obj.value = '帝尘'  /* 这样才会触发响应式 */
  • 因为ref对象使用要.value 只有.value这一项改变才会触发响应式, 即shallowRef({ name: "dc", age: 21 })传入的参数本身改变才会触发响应式
  • 不能跟ref一起去写会影响视图的更新( shallowRef也会去触发更新)
triggerRef()
  • 强制触发依赖于一个浅层ref 的副作用, 也就是shallowRef()的副作用
import {
   
    shallowRef, triggerRef } from "vue"

const obj = shallowRef({
   
    name: "dc", age: 21 })
obj.value.name = "dcdc"  /* 并不会触发响应式 去更新视图 */
triggerRef(obj)  /* 调用之后 会强制触发依赖于所传的ref对象 的副作用 */
customRef()
  • 创建一个自定义的 ref,显式声明对其依赖追踪和更新触发的控制方式(创建一个我们可控的ref)
  • 接受一个回调, 两个参数tracktrigger, 并返回一个带有 getset 方法的对象。
  • 一般: track()应该在 get() 方法中调用,而 trigger() 应该在 set() 中调用

创建防抖的 ref

import {
   
    customRef } from "vue"

const myRef = (value: any) => {
   
   
  let time: number
  return customRef((track, trigger) => {
   
   
    return {
   
   
      get() {
   
   
        /* 跟踪依赖 */
        track()
        return value
      },
      set(newVal) {
   
   
        clearTimeout(time)
        time = setTimeout(() => {
   
   
          value = newVal
          /* 触发依赖 */
          trigger()
        }, 500);

      }
    }
  })
}
const my = myRef(1)
const change = () => {
   
   
  my.value++
}
reactive:
  • 定义一个响应式的数据
  • 语法
<script setup lang="ts">
// 按需导入API
import {
   
    reactive} from 'vue'
const reactionDc = reactive({
   
   
  name: 'dc',
  age: '21'
})
</script>
  • 打印reactionDc
    reaction对象
  • reactive 对象是用来对复杂数据类型进行响应式,并且内部是通过Proxy(代理): 拦截对象中任意属性的变化, 包括:属性值的读写、属性的添加、属性的删除等
  • 仅对对象类型(引用类型)有效(对象、数组和 Map、Set 这样的集合类型),而对 string、number 和 boolean 这样的 原始类型 无效。
  • 原因: Vue 的响应式系统是通过属性访问进行追踪的, 如果更改了原始的引用就会导致响应式连接丢失
  • 通过解构例如let name = reactionDc.name 这种是不可取会丢失响应式 可以使用toRef | toRefs去解构
shallowReactive()
  • reactive()浅层作用形式
  • 和 reactive() 不同,这里没有深层级的转换:一个浅层响应式对象里只有根级别的属性是响应式的。属性的值会被原样存储和暴露,这也意味着值为 ref 的属性不会被自动解包了
<template>
  <div>{
   
   {
   
    shallowObj.c.d.e }}</div>
  <button @click="change">改变</button>
</template>

<script setup lang="ts">
import {
   
    isReactive, shallowReactive } from "vue";
const shallowObj = shallowReactive({
   
   
  a: 1,
  b: 2,
  c: {
   
   
    d: {
   
   
      e: 10,
    },
  },
})

const change = () => {
   
   
  // shallowObj.a++ 不能一起写
  shallowObj.c.d.e++; /* 不会触发更新 */
  console.log(
    isReactive(shallowObj) /* true */,
    isReactive(shallowObj.c.d.e) /* false */
  )
}

不能跟 reactive一起写会向refshallowRef一样影响视图更新

readonly()
  • 属性只读, 不可修改
import {
   
    readonly } from "vue";
const obj = readonly({
   
    a: 123, b: 456 });
obj.a++; /* 会提示: 无法分配到 "a" ,因为它是只读属性。 */
shallowReadonly()
  • readonly()浅层作用形式
import {
   
    shallowReadonly } from "vue";
const obj = shallowReadonly({
   
    a: 123, b: {
   
    c: 200 } });
// obj.a++   /* 会提示: 无法分配到 "a" ,因为它是只读属性。 */
obj.b.c++  /* 深层次可以修改 */
toRaw()
  • 可以返回由 reactive()readonly()shallowReactive() 或者 shallowReadonly() 创建的代理对应的原始对象
import {
   
    shallowReadonly, toRaw } from "vue";
const obj = shallowReadonly({
   
    a: 123, b: {
   
    c: 200 } });
console.log(toRaw(obj)); /* 返回原始对象 { a: 123, b: { c: 200 } } */
markRaw()
  • shallowReactive()shallowReadonly(), shallowRef 这种类似都是浅层作用形式, 作用为: 将一个对象标记为不可被转为代理。返回该对象本身
import {
   
    markRaw, reactive} from "vue";

const markRawObj = markRaw({
   
    a: 123, b: {
   
    c: 200 } })
console.log(markRawObj);  /* 添加标记属性 __v_skip: true */

const reactiveObj = reactive(markRawObj)
console.log(reactiveObj)
好的,以下是一个使用Vue3 + TypeScript + Ant Design Modal组件的示例代码: ```vue <template> <a-button type="primary" @click="showModal">打开弹出框</a-button> <a-modal v-model:visible="visible" :title="title" @ok="handleOk" @cancel="handleCancel"> <p>{{ content }}</p> </a-modal> </template> <script lang="ts"> import { defineComponent, ref } from &#39;vue&#39;; import { Modal, Button } from &#39;ant-design-vue&#39;; export default defineComponent({ name: &#39;MyModal&#39;, components: { Modal, Button }, setup() { const visible = ref(false); const title = ref(&#39;提示&#39;); const content = ref(&#39;这是弹出框内容&#39;); const showModal = () => { visible.value = true; }; const handleOk = () => { visible.value = false; // 点击确定按钮后的操作 }; const handleCancel = () => { visible.value = false; // 点击取消按钮后的操作 }; return { visible, title, content, showModal, handleOk, handleCancel, }; }, }); </script> ``` 在这个示例代码中,我们首先引入了Ant Design的Modal和Button组件。然后,使用`defineComponent`方法定义了一个名为`MyModal`的组件。在`setup`函数中,我们定义了一些响应式的变量,包括`visible`(控制弹出框的显示与隐藏)、`title`(弹出框的标题)、`content`(弹出框的内容)。接着,我们定义了三个方法,分别是`showModal`、`handleOk`和`handleCancel`。`showModal`方法用于显示弹出框,`handleOk`方法和`handleCancel`方法则分别在点击弹出框的确定和取消按钮时触发。 最后,在模板中,我们使用Ant Design的Button组件来触发`showModal`方法,使用Ant Design的Modal组件来展示弹出框。在Modal组件中,我们使用Vue3语法糖`v-model:visible`来绑定弹出框的显示与隐藏状态。同时,我们通过`:title`传递了弹出框的标题,通过`@ok`和`@cancel`监听了弹出框的确定和取消事件。在弹出框的内容中,我们使用了响应式变量`content`来展示弹出框的内容。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值