Vue3、setup的使用

2023-11-16

1、setup的使用

1.1、简介

setup选项是一个接受props和context的函数,也就是说它的基本写法应该是这样的:

export default {
  name: 'test',
  setup(props, context){
    return {} // 这里返回的任何内容都可以用于组件的其余部分
  }
}

接受一个props和context函数并且将setup内的内容通过return暴露给组件的其余部分。

1.2、setup注意点

由于在执行setup函数的时候,还没执行created生命周期方法,所以在setup函数中,无法使用data和methods的变量和方法。
由于我们不能在setup函数中使用data和methods,所以Vue为了避免我们错误的使用,直接将setup函数中的this修改成了undefined。

1.3、定义响应式数据

refreactive

  • ref我们用来将基本数据类型定义为响应式数据,其本质是基于Object.defineProperty()重新定义属性的方式来实现(ref更适合定义基本数据类型)
  • reactive用来将引用类型定义为响应式数据,其本质是基于Proxy实现对象代理。
  • 基本数据类型(单类型):除Object。String、Number、boolean、null、undefined。
  • 引用数据类型:object。里面包含的function、Array、Date。
  • 定义:
<script>
import { ref, reactive } from "vue";
export default {
  name: "test",
  setup(){
    // 基本类型
    const nub = ref(0)
    const str = ref('inline')
    const boo = ref(false)
    // 引用类型
    const obj = reactive({
      name: 'inline',
      age: '18'
    })
    const arr = reactive(['0', '1', '2'])
    
    return {
      nub,
      str,
      boo,
      obj,
      arr
    }
  }
}
</script>
  • 使用:
<template>
  <div>
    <h1>基本类型</h1>
    <p>nub:{{ nub }}</p>
    <p>str:{{ str }}</p>
    <p>boo:{{ boo }}</p>
    <h1>引用类型</h1>
    <p>obj:{{ obj.name }}</p>
    <p>arr:{{ arr[1] }}</p>
  </div>
</template>
  • 结果:
    在这里插入图片描述

1.4、toRefs

如果我们用reactive的形式来定义响应式变量

setup(){
  const obj = reactive({
    name: 'inline',
    gender: '男',
    age: '18'
  })
  return {
    obj
  }
}

使用:

<div>
  <p>姓名:{{ obj.name }}</p>
  <p>性别:{{ obj.gender }}</p>
  <p>年龄:{{ obj.age }}</p>
</div>

这样我们是不是发现在模版内使用参数很麻烦,那我们想直接用{{ name }}的方式访问行不行,答案是不行的
这里我们使用es6的扩展运算符。

setup(){
  const obj = reactive({
    name: 'inline',
    gender: '男‘,
    age: '18',
  })
  return {
    ...obj
  }
}

使用:

<div>
  <p>姓名:{{ name }}</p>
  <p>性别:{{ gender }}</p>
  <p>年龄:{{ age }}</p>
  <button @click="name = 'lgg'">改变姓名</button>
  <button @click="gender = '未知'">改变性别</button>
  <button @click="age = '18'">改变年龄</button>
</div>

结果:
这里我们看到,参数都正常的显示在了页面上,但是我们去改变参数时发现视图并没有更新,why?
我们把扩展运算符写成它的等价格式

setup(){
  const obj = reactive({
    name: 'inline',
    gender: '男‘,
    age: '18',
  })
  return {
    ...obj ==> name:obj.name
  }
}

当鼠标浮动上去提示name只是个字符串?
在这里插入图片描述
那我们再看看我们用ref定义值时提示的是什么
在这里插入图片描述
这时我们看到name是一个Ref,是一个响应式字符串。
这时就知道了为什么没有更新视图了,当我们用…扩展运算符时我们得到的只是一个普通类型的数值,并不是一个响应式数据
问了解决这个问题,vue3给我们提供了**toRefs函数,来让我们看看效果如何:

setup(){
  const obj = reactive({
    name: 'inline',
    gender: '男'age: '18'
  })
  return {
    ...toRefs(obj)
  }
}
<div>
  <p>姓名:{{ name }}</p>
  <p>性别:{{ gender }}</p>
  <p>年龄:{{ age }}</p>
  <button @click="name = 'lgg'">改变姓名</button>
  <button @click="gender = '未知'">改变性别</button>
  <button @click="age = '18'">改变年龄</button>
</div>

参数都可以正常改变,成功改头换面。

toRefs总结:
toRefs会将一个响应式的对象转变为一个普通对象,然后将这个普通对象里的每一个属性变为一个响应式的数据

1.5、setup中执行方法

1.5.1、方式一:

以reactive定义响应式数据的方式来定义方法:

<script>
  import { ref, reactive, toRefs } from 'vue';
  export default {
    name: 'test',
    setup(){
      const str = ref('inline')
      const fun = reactive({
        fun1(data) {
          console.log(str.value)
          this.fun2(data)
        },
        fun2(data) {
          console.log(data)
          console.log('我是fun2')
        }
      })
      return {
        ...toRefs(fun)
      }
    }
  }
</script>

通过点击事件将值传给fun1,fun1接受到后再传给fun2。
这里我们用this.fun2()的方式去调用fun2,为什么这里用this可以正常执行不会报undefind,因为这里的this非彼this,Vue2里的this是实例,这里的this是对象

<button @click="fun1('你还')">点我</button>

结果在这里插入图片描述

1.5.2、方式二:

注意这里调用fun2的方式与方式一不同,直接调用就可以,不用this调用。

export default {
  name: 'test',
  setup(){
    const fun1 = (data) => {
      fun2(data)
    }
    const fun2 = (data) => {
      console.log(data)
    }
    return {
      fun1
    }
  }
}

调用

<button @click="fun1('你好 inline')">点我1</button>

结果
在这里插入图片描述

1.5.3、方式三:

这种方式避免了将功能逻辑都堆叠在setup的问题,我们可以将独立的功能写成单独的函数,这里我在setup外写了fun()login()两个功能函数,并在setup内分别调用。

import { ref, reactive, toRefs } from 'vue';
export default {
  name: 'test',
  setup(){
    const test1 = fun() // 如果函数返回的参数过多,可以赋值给变量并用扩展运算符暴露给组件的其余部分。
    const { test } = login() // 也可单个接受
    return {
      ...toRefs(test1),
      test
    }
  }
}
// 功能1
function fun() {
  let str = ref('我是功能1')
  function fun1(data) {
    console.log(str.value)
    fun2(data)
  }
  function fun2(data) {
    console.log(data)
  }
  return{
    fun1,
    fun2
  }
}
// 功能2
function login() {
  const obj = reactive({
    msg: '我是功能2'
  })
  function test() {
    console.log(obj.msg)
  }
  return{
    test
  }
}

调用:

<button @click="fun1(你好 inline)">点击1</button>
<button @click="test">点击2</button>

1.5.4、方式四:

与方式三一样,只是我们将两个功能函数提取出来放在单独的.js文件中:
在这里插入图片描述
然后引入组件,并在setup内调用

<template>
  <div>
    <button @click="fun1('你好 inline')">点击1</button>
    <button @click="test">点击2</button>
  </div>
</tempalte>
<script>
import { ref, reactive, toRefs } from 'vue';
import { fun, login } from './test.js'
export default {
  name: "test",
  setup(){
    const test1 = fun()
    const { test } = login()
  }
  return{
    ...toRefs(test1),
    test
  }
}
</script>

1.5.5、方式五:

我们还可以这样写,这里我定义一个reactive响应式对象,赋值给login变量,这个响应式对像内有我们登录需要的参数、验证和方法,这里我们全部放在login这个响应式对象内然后用toRefs及其扩展运算符暴露出去。

<script>
import { ref, reactive, toRefs } from "vue";
export default {
  name: "test",
  setup(){
    const login = reactive({
      param: {
        username: '123',
        password: '123456',
      },
      rules: {
        username: [{
          required: true,
          message: '请输入用户名',
          trigger: 'blur'
        }],
        password: [{
          required: true,
          message: '请输入密码',
          trigger: 'blur'
        }]
      },
      login(){
        this.param.username = 'inline'
        this.param.password = '123456'
        console.log('登录成功!‘)
      }
    })
    return{
      ...toRefs
    }
  }
}
</script>

使用

<input type="text" v-model="param.username">
<input type="password" v-model="param.password">
<button @click="login">登录</button>

结果:
在这里插入图片描述
正常执行,所以我们还可以将一个功能的所有方法和相关参数写在一个reactive对像内

1.6、script setup:

script setup已经在vue3.2的版本上正式发布
用法

<script setup></script>
  • 变量方法无需return
  • 使用<script setup》时,模版被编译成一个内联在setup函数作用域内的渲染函数。这意味着内部声明的任何顶级绑定<script setup》都可以直接在模版中使用
<script setup>
  const msg = 'hello!'
</script>
<template>
  <div>{{ msg }}</div>
</template>

script setup内定义的变量和方法无需返回,可以直接使用

  • 组件引入:
    导入的组件无需注册,可直接使用
<script setup>
// 导入的组件也可以直接在模版中使用
import Foo from './Foo.vue'
import { ref } from 'vue' 
// 编写合成API代码,就像在正常设置中一样
// 不需要手动返回所有内容
const count = ref(0)
const inc = () => {
  count.value++
}
</script>
<template>
  <Foo :count="count" @click="inc">
</template>
  • 发布Props和Emits
<script setup>
  const props = defineProps({ foo: String })
  const emit = defineEmits(['update', 'delete'])
</script>
  • 普通script和script setup:
    script setup 可以和script同时存在
<script>
  export const name = 1
</script>
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>
  • script setup 附加选项
    script setup给提供了大多数与options api等效的能力;
    就是说options api能办到的事script setup大部分都能办到。
    那还有哪些是script setup做不到的呢?
  1. name
  2. inheritAttrs
  3. 插件或库所需要的自定义选项
    怎么办?分开写:
<script>
export default {
  name: 'CustomName', // 自定义名称
  inheritAttrs: false, // 继承属性
  customOptions: {} // 自定义选项
}
</script>
<script setup></script>

1.7、defineExpose:

script setup定义的变量默认不会暴露出去,因为变量这时候包含在setup的闭包中。这时我们可以使用defineExpose({})来暴露组件内部属性给父组件使用:

<script setup>
const a = 1
const b = ref(2)
defineExpose({
  a, 
  b
})
</script>

当父组件通过模版引用获取此组件的实例时,检索到的实例将会是这样{ a: number, b: number } (引用会像在普通实例上一样自动展开)

2、ref、reactive、toRef、toRefs的作用及区别

2.1、reactive

reactive用于为对象添加响应式状态。
接受一个js对象作为参数,返回一个具有响应式状态的副本

  • 获取数据值的时候直接获取,不需要加.value
  • 参数只能传入对象类型。
import { reactive } from 'vue'

// 响应式状态
const state = reactive({
  count: 0
})
// 打印count的值
console.log(state.count)

2.2、ref

ref用于为数据添加响应式状态。
由于reactive只能传入对象类型的参数,而对于基本数据类型要添加响应式状态就只能用ref了,同样返回一个具有响应式状态的副本

  • setup获取数据值的时候需要加.value,template则会自动带入.value。(对于基本类型,ref是自己的实现方式且性能优于reactive,而对于对象类型,ref可以理解为是通过reactive包装实现的)
  • 参数可以传递任意数据类型,传递对象类型时也能保持深度响应式,所以适用性更广。
  • vue3.0 setup里定义数据时优先使用ref,方便逻辑拆分和业务解耦
import { ref } from 'vue'

// 为基本数据类型添加响应式状态
const name = ref('lgg')

// 为复杂数据类型添加响应式状态
const state = ref({
  count: 0
})

// 打印name的值
console.log(name.value)
// 打印count的值
console.log(state.value.count)

2.3、toRef

toRef用于为**源响应式对象上的属性**新建一个ref,从而保持对其源对象属性的响应式连接。
接受两个参数:1、源响应式对象;2、属性名。返回一个ref数据。
例如:使用父组件传递的props数据时,要引用props数据时,要引用props的某个属性且要保持响应式连接时就很有用。

  • 获取数据值的时候需要加.value。
  • toRef后的ref数据如果是复杂类型数据时,不是原始数据的拷贝,而是引用,改变结果数据的值也会同时改变原始数据。
import { defineComponent, toRef } from 'vue'
export default defineComponent({
  props: [title],

  setup(props) {
    // 创建变量myTitle
    const myTitle = toRef(props, 'title')

    console.log(myTitle.value)
  }
})

2.4、toRefs

toRefs用于将响应式对象转换为结果对象,其中结果对象的每个属性都是指向原始对象响应的属性的ref。
常用于es6的解构赋值操作,因为在对一个响应式对象直接解构时解构后的数据将不再有响应式,而使用toRefs可以方便解决这一问题。

  • 获取数据值的时候需要加.value。
  • toRefs后的ref数据如果是复杂类型数据时,不是原始数据的拷贝,而是引用,改变结果数据的值,也会同时改变原始数据
  • 作用其实和toRef类似,只不过toRef是对一个个属性手动赋值,而toRefs是自动解构赋值。
import { defineComponent, toRefs} from 'vue'
export default defineComponent({
  props: [title],
  setup(props) {
    // 使用了解构赋值语法创建了变量myTitle
    const { myTitle } = toRefs(props)
    
    console.log(myTitle.value)
  }
})

提示:尽量不要混着用,reactive和ref选一种,toRef和toRefs选一种,不然代码会很乱。(推荐ref和toRefs)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue3、setup的使用 的相关文章

  • React中ComponentDidMount生命周期方法被调用两次

    在我的 React 应用程序中 加载应用程序时会进行两次初始 API 调用 我查看了 Chrome gt inpsect 中的网络选项卡 启动器 调用堆栈显示第一个调用是从VM123000 bundle js而第二个调用只是从实际的bund
  • 从 json 数组中获取成对的值

    首先 这是我从 php 源获取的 json 值 oid 2 cid 107 oid 4 cid 98 oid 4 cid 99 之后 我想要得到并且oid值以及相应的cid值例如 oid 2 and cid 107一口气 oid 4 and
  • 如何在 Adob​​e Brackets 中使用 const 和 let 禁用 JSLint ES6 错误?

    我用 Google 搜索并浏览了这个网站 但我只能找到 JSHint 而不是 JSLint 的答案 为了摆脱 use function form of use strict 错误 我添加了 jslint node true 但要禁用使用错误
  • 从 iframe 关闭父弹出窗口

    在domain1 com 上 我有一个链接 可以打开domain2 com 的弹出窗口 弹出窗口中有一个 iframe 也托管在 domain2 com 上 在 iframe 中 我试图关闭弹出窗口 我似乎对如何做到这一点感到困惑 在 if
  • 外部 CSS 是否应用于 jsPDF 生成的 pdf

    我已经开始使用 jspdf 制作一些演示 我有一个 html 文件 我的 css 在外部文件中 我写了下面的代码来生成我的pdf pdfButton on click function var pdf new jsPDF p in lett
  • 异步 JS 加载到 head 中

    我需要将脚本异步加载到页面上 我正在使用createElement方法在头部动态插入脚本标签 发生的事情是首先加载页面源 完成后 头部中包含的所有元素都会并行加载 一旦全部加载完毕 我动态添加的脚本就会加载 这在逻辑上是有道理的 但我正在寻
  • 代理递归函数

    想象一个简单的递归函数 我们试图包装它以检测输入和输出 A simple recursive function const count n gt n 1 count n 1 Wrap a function in a proxy to ins
  • 从画布保存/转换后文件质量下降的问题

    这是我正在使用的代码 代码位于这篇文章的底部 但这里是链接GitHubGist Noitidart ff addon snippet browseForBadgeThenCreateSaveAnApply js https gist git
  • React 功能组件:作为函数调用与作为组件调用

    假设我有一个功能组件 const Foo props gt div props name div 直接作为函数调用有什么区别 const fooParent gt div Foo name foo div 与将其称为组件相比 const f
  • 如何使用 JS/Puppeteer 上传文件

    我试图弄清楚如何将图片文件上传到输入对话框中 不可能只输入名称并按 Enter 键 因为我没有找到使用 Puppeteer 实现自动化的方法 我想我必须设置一些值作为图片 但我不知道该怎么做 有任何想法吗 您使用上传文件elementHan
  • 类型错误:require.config 不是一个函数

    我正在使用 require js 作为早午餐项目的一部分 这段代码抛出错误 require config require config is not a function paths jquery lib jquery underscore
  • JavaScript 检查时区名称是否有效

    有没有一种方法可以在不使用外部库的情况下检查 JavaScript 中的时区名称是否有效 当用户在文本字段中输入时区名称时 我想验证时区是否有效 我知道我们可以使用时刻时区库轻松做到这一点 但我不想使用任何额外的库 我正在寻找纯 JavaS
  • javascript 函数后面括号中的值

    我正在尝试重新利用我在 SO 的答案中找到的一些 Javascript 代码 但我想首先更好地理解它的语法 其大纲是 function root ns factory some code window detectZoom function
  • 如何应对 WebStorm 中大量未解决的变量警告?

    我有一个从服务器获取数据的函数 function getData data console log data someVar 网络风暴说someVar是一个未解决的变量 我怎样才能摆脱这样的警告 我看到几个选项 禁止 IDE 设置中的警告
  • 谷歌绘制具有相同比例的多个系列的图表

    我正在寻找一种在图形上显示多个系列的方法 这些系列具有相同的比例但仅显示一次 正如你在这里看到的 http jsfiddle net Youkoal d3xwnqdu http jsfiddle net Youkoal d3xwnqdu 我
  • 如何使用jquery点击眼睛图标时显示和隐藏密码

    我需要在单击眼睛图标时显示和隐藏用户密码 因此我为此编写了脚本 当我单击眼睛图标时 只有类正在更改 但密码不可见 再次单击斜线眼睛图标 它应该隐藏这两个图标方法不起作用如何解决这个问题
  • 如何让 Grunt.js 和 Meteor.js 协同工作?

    我想在我的 Meteor 应用程序中使用简单的复制和串联 但是当 Meteor 在服务器和客户端上运行所有 javascript 文件时 我遇到了问题 而我不希望它们在任何地方运行 它要么只是配置文件 例如Gruntfile js或我想以某
  • 如何在 Servlet 中打开弹出窗口,然后重定向页面

    我想在调用 servlet 时打开一个弹出窗口 然后想将 servlet 重定向到某个 jsp page 这就是我所做的 protected void doGet HttpServletRequest request HttpServlet
  • 通过均匀分布值来有效合并两个数组

    我见过许多问题 答案主题是通过交替值合并两个数组 他们是这样工作的 let array1 a b c d let array2 1 2 let outcome a 1 b 2 c d 但我希望输出更加高效 并且根据数组大小均匀分配值 exp
  • 如何在输入时格式化 contenteditable div?

    我正在尝试编写一个函数 允许 contenteditable div 在用户输入 div 时执行一些自动格式化 到目前为止我只能让它在 IE 中运行 有人可以帮助我吗 function formatOnKeyUp if window get

随机推荐

  • s2.ubuntu搭建s3c2440平台arm-linux-gcc交叉编译工具链安装+资源下载

    交叉编译工具包arm linux gcc 3 4 5 glibc 2 3 6 tar bz2 zip 蓝奏云 文件实际后缀是 bz2 下载后去掉 zip后缀 然后放入Ubuntu系统 具体步骤 1 复制交叉编译链的包到Ubuntu中 这里我
  • Spring学习(五):Spring中注入一些细节

    1 字面值 字面值 可用字符串表示的值 可以通过
  • Misc

    我可是黑客 用winehx打开 下拉到最后 moctf e4sy 1ma9e m1sc 假装安全 用kali的binwalk分离 打开记事本 mcfCrflyS1eot eul ld 扫扫出奇迹 用QR Research直接扫 或者用Ste
  • Linux 4G 通信实验

    目录 4G 网络连接简介 高新兴ME3630 4G 模块实验 ME3630 4G 模块简介 ME3630 4G 模块驱动修改 1 Linux内核添加代码 USB设备信息 2 Linux内核添加代码 添加ECM支持程序 3 配置使能Linux
  • 计算机怎么快速查找应用,win10系统如何快速查找应用?win10系统快速查找应用的方法...

    win10电脑经常会安装各种程序应用 因为没有添加到桌面 所以这个时候很难找到 如果一个一个程序查找很浪费时间 有什么快速查找应用的方法 针对此疑问 小编和大家说说win10系统快速查找应用的方法 具体方法如下 1 首先你要找到 开始菜单
  • Vue3+Element-Plus 实现表单中搜索功能 三五

    1 当用户在表单搜索框中 输入要搜索的用户名 点击搜索按钮后 查找到相对应的用户数据 2 实现搜索功能的步骤 2 1 首先 使用v model 指令 将文本输入框的数据与 data 中的数据做双向绑定 2 2 其次 为搜索按钮绑定单击事件
  • Java中Math类中的常用方法

    Java中Math类中的常用方法 代码实例 public class Demo1 Math public static void main String args System out println Math PI System out
  • 使用备份工具mysqldump备份数据库

    MySQL自带的备份工具mysqldump 可以很方便的对MySQL进行备份 通过该命令工具可以将数据库 数据表或全部的库导出为SQL脚本 便于该命令在不同版本的MySQL服务器上使用 例如 当需要升级MySQL服务器时 可以先使用mysq
  • Java 读取jar内包资源文件和读取jar包外资源文件

    Java 读取jar包内资源文件 读取jar 包内资源文件application properties InputStream appPropertiesInputStream ApplicationPropertiesHolder cla
  • U-Net 模型改进和应用场景研究性综述

    U Net综述 1 文章介绍 2 U Net介绍 3 结构改进 4 非结构改进 4 1 预处理 数据增强 4 2 训练 数据归一化 4 3 训练 激活函数 4 4 训练 损失函数 4 5 结构改进总结 5 U Net应用场景 5 1 视网膜
  • PAN和MS融和综述(pansharpening)

    PAN和MS融和综述 pansharpening 一 基于成分替代的图像融和 1 基于IHS变换的图像融合方法 IHS方法是将原始多光谱图像从RGB空间变换到IHS空间 然后用高分辨率图像或用不同投影方式得到的待融合图像替代I分量 在IHS
  • spring的InitializingBean接口、DisposableBean接口

    本文介绍spring中与bean有关的一些接口 afterPropertiesSet afterPropertiesSet 方法是 Spring 框架中的一个初始化方法 主要用于在 Bean 实例化和属性注入完成后执行一些初始化操作 具体来
  • windows 7 系统安装

    环境 workstation 10 虚拟机 GHOST windows 7 32位 今天安装系统 碰到一些问题 在此记录 问题一是分区后 重启黑屏的问题 解决方案 问题二 点击安装到第一分区 自动跳转到dos工具界面问题 解决方案 问题三
  • Qt之QLabel

    简述 QLabel提供了一个文本或图像的显示 没有提供用户交互功能 一个QLabel可以包含以下任意内容类型 内容 设置 纯文本 使用setText 设置一个QString 富文本 使用setText 设置一个富文本的QString 图像
  • HR人员和岗位关联日期问题

    离职日期是4月3号 但4月1 2号的数据在GET PERNR 就查不到 原因是人员和岗位关联日期在3月31号就结束了 所以选中组织结构后找不到数据了 表HRP1001可以查看 O组织 S岗位 P人员 修改 PO13 gt 关系显示 gt 找
  • UNIX网络编程之源代码的编译和使用

    UNIX网络编程入门 对于想学习网络编程的来说 UNIX网络编程 这书肯定是不二选择 所谓实践是检验真理的唯一标志 特别是对于编程来讲 再多的理论经验也比不过code一次 UNIX网络编程 这本书提供连源码下载 第三本版的源码可点击这里下载
  • Linux——(第六章)常用指令(一)

    目录 一 帮助指令 1 man获取帮助信息 2 help指令 3 常用快捷键 二 文件和目录相关指令 1 pwd 指令 2 ls 指令 3 cd 指令 4 mkdir 指令 5 rmdir指令 6 touch指令 7 cp 指令 8 rm
  • 队列——queue

    Hello 这是你们的苦力怕 今天我去医院做核酸检测 排了老长的队 wait了半个多小时才做完 真是把我整无语死了 但是我在wait的过程中突然想到了一个问题 啥数据结构跟排队很像 对了 就是大名鼎的队列 目录 什么是队列 队列的用法 队列
  • 安装CP210xVCP遇到的问题

    在CE系统里面有USB设备虚拟串口的驱动 CP210xVCP就是这样 在写入注册表的配置信息里面 虚拟的串口默认为COM9 有一些设备上面 COM9是不行的 遇到这样的情况 修改为较小的编号 如COM6是可以的 还有一些设备 裁减掉了USB
  • Vue3、setup的使用

    Vue3 setup ref reactive toRef toRefs 1 setup的使用 1 1 简介 1 2 setup注意点 1 3 定义响应式数据 1 4 toRefs 1 5 setup中执行方法 1 5 1 方式一 1 5