vue setup与OptionsAPI

setup 是 vue3 中一个新的配置项,值是一个函数,组件中所用到的:数据、方法、计算属性、监视等等,全配置再setUp中。

特点如下:

  • 生命周期优先级

setup 函数在 beforeCreate 钩子之前自动调用,优先于所有生命周期钩子执行 。 ‌

  • 作用域限制

在 setup 函数中无法使用组件实例(即this),但可通过 getCurrentInstance 获取组件实例 。 ‌setup 函数中的 this 是 undefined,vue3 中已经弱化 this 了。

  • 数据暴露机制

setup返回的对象中的数据和方法可直接在模板中使用,未返回的内容无法访问 。 ‌

  • 参数传递

setup 的第一个参数用于接收父组件传递的 props,支持响应式解构 。 ‌

  • 性能优化

由于在组件实例创建前执行,适合进行异步加载或延迟初始化操作 。 ‌

  • 类型支持

TypeScript 中 setup 函数的返回值能提供更精确的类型推断,提升开发体验 。 ‌

  • 逻辑复用

支持将逻辑拆分为独立函数并组合使用,增强代码复用性和可维护性 。

复制代码
<script  >
import { ref } from 'vue';

export default {
  setup() {
    const message = ref('Hello World!');
    function changeMessage() {
      message.value = 'AAAAA!';
    }
    
    return {
      message,changeMessage
    };
  }
};

</script>

<template>
  <div id="app">{{ message }}</div>
  <button @click="changeMessage">Click me</button>
</template>

<style scoped></style>

setup 的返回值

  • 若返回一个对象:则对象中的:属性、方法等,在模板中均可直接使用。

  • 若返回一个函数:则可以自定义渲染内容,代码如下:

    setup() {
    return ()=>"Hello vue!"
    }

setup和Options API的关系

  • Vue2 的配置(data、methos......)中可以访问到 setup中的属性、方法。
  • 但在setup中不能访问到Vue2的配置(data、methos......)。
  • 如果与Vue2冲突,则setup优先。

setup语法糖

setup 函数有一个语法糖,这个语法糖,可以让我们把 setup 独立出去,代码如下:

复制代码
<script setup lang="ts" >
import { ref } from 'vue';

const message = ref('Hello World!');
function changeMessage() {
  message.value = 'BBB!';
}

</script>

<template>
  <div id="app">{{ message }}</div>
  <button @click="changeMessage">Click me</button>
</template>

<style scoped></style>

扩展:上述代码,你需要确保已经安装了 vite-plugin-vue-setup-extend 插件。如果还没有安装,可以通过 npm 或 yarn 来安装它。

  • 安装插件

    npm install vite-plugin-vue-setup-extend --save-dev

    或者

    yarn add vite-plugin-vue-setup-extend -D

  • 修改Vite配置文件:在vite.config.jsvite.config.ts 文件中,你需要引入并配置该插件。

    import { defineConfig } from 'vite'
    import vueDevTools from 'vite-plugin-vue-devtools'

    // https://vite.dev/config/
    export default defineConfig({
    plugins: [
    vue(),
    vueDevTools(),
    ]
    })

复制代码
  <script setup lang="ts">
相关推荐
疯不皮41 分钟前
tiptiap3如何实现编辑器内部嵌套多个富文本编辑器
前端·vue.js·开源
溪饱鱼43 分钟前
主动与被动AI交互范式
前端·后端·aigc
我叫黑大帅43 分钟前
如何实现UniApp登录拦截?
前端·javascript·vue.js
写代码的皮筏艇44 分钟前
Sequelize 详细指南
前端·后端
国服第二切图仔44 分钟前
Electron for 鸿蒙PC项目实战案例之水果消消乐
javascript·electron·harmonyos·鸿蒙pc
北辰alk1 小时前
解锁Vue组件通信新姿势:provide/inject深度解析
vue.js
用户600071819101 小时前
【翻译】我们如何打造v0版iOS应用
前端
编程猪猪侠1 小时前
打造高灵活度动态表单:基于 React + Ant Design 的 useDynamicForm hooks 实现思路
前端·react.js·前端框架
柒儿吖1 小时前
Electron for 鸿蒙PC - 番茄工作法计时器适配问题排查与解决方案
javascript·electron·harmonyos