Vue3 中的 @Options,是做什么的?

2023-11-07

@Options 是个啥?

@Options 是 Vue Class Component (8.x版) 提供的一个装饰器 (Decorator),目的是使 Vue 开发者可以用 类语法 的风格来定义组件 (Class-Style Component)。 也就是说,以前是通过传入选项来定义一个组件的,现在通过 @Options,可以把组件当作一个类,用定义类的语法来定义组件。

补充说明:

  • 在进行 Vue + TypeScript 开发时,Class-Style Component 是一个可选项,开发者如果不习惯这种风格,可以不使用它;

  • @Options 由 Vue Class Component (7.x版) 中的 @Component 改名而来。


为什么我的项目中会有 @Options 或 @Component?

当用 Vue CLI 创建项目时,如果采用手动模式,并选中了 TypeScript,在之后弹出的 Use class-style component syntax?(Y/n) 中,回复 y,则启用了 Class Style 的组件风格。
开启 class style 示意图
因此,如果开发者还是喜欢用选项来定义组件,而且是自己主导的项目,可以在项目创建时禁用它,或者删掉相关依赖再 npm install

  • Vue3 项目中,相关依赖是 vue-class-component,以及 tsconfig.json 中的 experimentalDecorators 选项 (如果有用到装饰器,也可不删);
  • Vue2 项目中,相关依赖是 vue-class-componentvue-property-decorator

啥是“类语法风格的组件”(Class-Style Component)?

简单说,就是用定义类的语法来定义组件,具体而言:

  • data 数据可以声明为类属性
  • methods 可以声明为类成员方法
  • computed 属性可以声明为类属性访问器 (getter/setter)
  • hooks 及 data(), render() 可以声明为类成员方法,但无法从外部访问(且约定这些命名为保留字,应避免用作自定义方法的命名)
  • 对于其它选项,直接放在 @Options 的参数中(如果没有需要放到 @Options 中的参数,那么 @Options 可以省略)

举个栗子 (采用 Vue3 + TypeScript ):

//Vue原生的选项风格:
import { defineComponent } from 'vue';
import MyComponent from './MyComponent.vue';
export default defineComponent ({
	name: 'App',
    components: {
        MyComponent 
    },
    data(){ return { 
        count: 0 
    }},
    mounted(){ this.count = 10 },
    methods:{
        increase(){ this.count++; }
    },
    computed:{
        doubleCount():number{ return this.count * 2; }
    }
})

//改用类风格写法:
import { Options, Vue } from 'vue-class-component';
import MyComponent from './MyComponent.vue';
@Options({
    components: {
        MyComponent 
    }
})
export default class App extends Vue {
    count = 0 //注意不能为 undefined,否则该数据的响应性将失效
    mounted(){ this.count = 10 }
    increase(){ this.count++; }
    get doubleCount():number{ return this.count * 2; }
}

Vue Class Component 更多有趣特性


@Options 与 @Component 的一点区别

Vue Class Component 从 8.x 开始支持 Vue3,并且将 @Component 更名为 @Options。(issue#406)
此外,还允许省略 @Options,并且项目中只需要依赖 vue-class-component 一个库。

Summary

  • @Component will be renamed to @Options.
  • @Options is optional if you don’t declare any options with it.
  • Vue constructor is provided from vue-class-component package.

这也是为什么创建 Vue 2 项目时看到的是 @Component,而创建 Vue3 项目时看到的是 @Options。

虽然只是改个名,但它们的意义却不一样了:

  • 旧版的 @Component 不能省略,它的意义是标注一个类是 Class-Style Component;
  • 新版中,只要一个类继承了来自 vue-class-component 库的 Vue,就是一个 Class-Style Component,无须任何装饰器来标注。@Options 的意义更像是专门用来放置像 component、emits、mixins 这种声明性、资源引用性的非核心逻辑的内容。
    在使用原生的选项风格来定义组件时,Vue 官方推荐我们按照统一的顺序来组织选项,以提升代码的可读性 ( 风格指南 / 组件-实例选项的顺序推荐),而使用 Class-Style Component 时,借助 @Options,可以进一步将这种规范落地——依赖、组合、接口等选项在 @Options 中完成声明,组合式 API、本地状态、watch、声明周期勾子、methods、render 等承载组件核心逻辑的内容放在类中定义。

开发中的注意事项


参考资料:

[1] Vue Class Component Github主页 (前往)
[2] 官方文档 (本文发布时仅更新到 v7) (前往)
[3] v8 proposals in the issue list (前往)

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

Vue3 中的 @Options,是做什么的? 的相关文章

  • 在网页上写乐谱[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我希望能够在网页中编写乐谱和和弦 有没有可用的库 例如用于数学的 Mathjax 如果没有 那么还有其
  • Iphone 上的 Javascript 日期解析

    我正在开发一个针对移动设备的离线 Javascript 网站 iPhone 就是这样的一种移动设备 我正在尝试从 REST API JSON 对象的成员 解析日期 我在用着 Date parse 2010 03 15 10 30 00 这适
  • CSS 比例和方形中心裁剪图像

    所以我的应用程序中有一个缩略图集合 其大小为200x200 有时原始图像没有这个比例 所以我计划将此图像裁剪为正方形 目前它只是拉伸图像以适合缩略图 所以说我的原始图像大小是400x800 那么图像看起来就很压扁 我想裁剪此图像 以便它查看
  • jQuery 无法在外部 JavaScript 中工作

    我是 jQuery 新手 遇到了一些奇怪的问题 我正在使用 jQuery 的change and click方法 在我的 HTML 文件中使用时它们工作正常
  • jQuery 模式窗口从我的表单中删除元素

    jQuery 当我用它创建一个包含表单元素的模式窗口时 当我提交表单时 它会取出这些元素 表格示例
  • javascript - 动态变量

    您好 我正在尝试创建动态变量 但它说 变量 v0 到 v5 未定义 td each function i eval var v i this html 任何帮助将不胜感激 这听起来是个坏主意 你有什么理由不能这样做吗 var tdHtml
  • JavaScript 对象镜像/单向属性同步

    出于安全目的 我需要一个 镜像 对象 也就是说 如果我创建对象 A 并浅克隆 A 的副本并将其称为 B 则每当 A 的属性发生更改时 我希望 B 自动更新自身以反映更改 但反之则不然 换句话说 单向属性同步 我的问题 是否已经存在我不知道的
  • Firefox(仅限)动态表单操作不起作用

    控制台为操作属性返回空白 我已经移动了 file upload attr action io cfm action updateitemfile item id agenda modal attr data defaultitemid 周围
  • 使用 Jquery 更改 css 属性时的事件检测

    有没有办法检测元素的 显示 css 属性是否更改 是否更改为无 块或内联块 如果没有的话有什么插件吗 谢谢 Note 突变事件 https developer mozilla org en US docs Web Guide Events
  • 无法让 CloudKit 进行身份验证(使用 Javascript 和服务器到服务器密钥)

    我正在尝试使用苹果的cloudkit js文件以建立与 CloudKit 的服务器到服务器连接 然而 尽管配置混乱了几个小时 我似乎无法让 CloudKit 认为我的请求有效 我的配置逻辑非常简单 const privateKeyFile
  • JSLint 错误:意外的“这个”

    无法理解为什么 JSLint 对我的使用感到惊讶this在下面的代码中 function testConstr x use strict this joker Whyyy sooo seriousss this x x 对于这两个属性分配
  • 是否可以向 JavaScript 函数发送可变数量的参数?

    是否可以从数组向 JavaScript 函数发送可变数量的参数 var arr a b c var func function debug alert arguments length for arg in arguments alert
  • 使用点符号将数字传递到函数中

    如果我有一个对象和函数 var obj 1234 example sample 5678 example sample function example num str if obj num hasOwnProperty str manip
  • 将 DIV 转换为单击并拖动视口

    有人知道一种不显眼的 基于原型或无框架的方法将具有大内容 例如地图 的 DIV 转换为具有固定尺寸的可点击和可拖动的 地图 容器 非常像 Google 地图 我想在大型输入表单中显示 HTML 块 这些块可能会超出可用空间 每个块可以有大约
  • 无法安装js-bson

    我正在使用Windows 7 64位 尝试安装bson作为mongodb的依赖项 我收到此错误 npm WARN package json email protected cdn cgi l email protection No READ
  • 主干集合排序

    我制作了我的第一个主干应用程序 但在集合排序方面遇到了一些问题 使用这个后 var SortedFriends MyFriends sortBy function friend return friend get uid console l
  • 如何制作实时jquery效果?

    我想制作一个实时提要阅读器 并且我想要一个解决方案 使新项目无需刷新页面即可出现 并且具有像friendfeed一样的滚动效果 你可以在这里看到我在说什么 http www vimeo com 4029954 http www vimeo
  • 响应覆盖 div 下的链接

    场景是这样的 我已经构建了一个顶部导航原型 它需要在其顶部有一个覆盖 透明 PNG 图像 目前它覆盖了大约 1 3 的链接 请看下面 有什么方法可以让前 1 3 的链接做出响应 即使有一个 div div 部分覆盖它们 覆盖层不会包含任何可
  • 如何在javascript中设置从数据库输入的最大数量?

    我希望根据数据库中的数量设置 输入类型 数字 中输入的最大数量 目前 我正在尝试让它在数据最大的基础上工作 然后再尝试从数据库中获取最大值 但它似乎无法工作 之前已经在这里问过 但我仍然无法理解 在 php javascript 中设置数据
  • CSS 未使用 req.params 或其他内容加载

    我对节点 表达等非常陌生 我制作了一个博客应用程序 但遇到了问题 我正在使用 mongoose node express 和 ejs 当我打电话时 router get posts function req res Post find fu

随机推荐

  • 标签href几种使用

    a标签的最重要功能是实现超链接和锚点 a标签里href属性是我们经常用的 其实它的值有很多种 可能我们往往会忽略 今天分享一下a标签的属性值及用法 1 href 这是一个比较常用的方法 是标签内置的一个方法 用于网页返回顶部较多 比如在底部
  • 深度学习------tensorflow2.0,keras实现CNN(mnist、cifar2、cifar10:ResNet-34、ResNet-18)

    1 ResNet 34卷积神经网络 cifar10 随着网络的加深 出现了训练集准确率下降 错误率上升的现象 就是所谓的 退化 问题 按理说更深的模型不应当比它浅的模型产生更高的错误率 这不是由于过拟合产生的 而是由于模型复杂时 SGD的优
  • qt day 5

    实现局域网的网络聊天室功能 1 gt 服务器代码 widget h ifndef WIDGET H define WIDGET H include
  • IDEA安装教程(多图预警)

    简介 关于IDEA的介绍 引用自百度百科 IDEA全称 IntelliJ IDEA 是java编程语言开发的集成环境 IntelliJ在业界被公认为最好的java开发工具 尤其在智能代码助手 代码自动提示 重构 J2EE支持 各类版本工具
  • 集简云简化流程模板,轻松实现工作流程自动化

    集简云平台内置大量自动化流程模板 用户可以在 模板中心 搜索应用名称 选择适合自己的场景 直接使用 本期分享集简云自动化工作流程 模板推荐 模板1 小鹅通新增订单后同步到seatable并更新微伴助手用户信息 集成应用 小鹅通 SeaTab
  • [终端配色方案]

    配色方案 一 Iterm2 设置Color Preferences gt Profiles gt Colors Brighten bold text去掉 选择solarized 选择xterm 256color 二 Iterm2 Shell
  • Restful风格

    文章目录 前言 一 Restful风格是什么 二 Restful风格里面的请求方式 1 Get 2 POST 3 PUT 4 DELETE 这四个在项目接口中分别代表的是查 增 改 删 三 Restful风格的Controller如何实现
  • django静态文件无法访问解决方案

    nginx配置如下 For more information on configuration see Official English Documentation http nginx org en docs Official Russi
  • 开发日记2021-17、20周

    2021 4 19 温习了下观察者模式 学习了状态模式 但是感觉状态模式不是太能把握透彻 代码结构不太一样 理解起来有些偏差 写着写着就陷入到了沉思中 总会忘记要把想法记下来 这里就是草稿就是思路演练场 这里写下的东西不需要完美 只要记录下
  • 【Clion+CubeMX开发STM32】(二)创建自己的工程

    目录 新建工程 修改芯片型号 添加自己的文件 将自己的文件添加Cmake项目 修改CMakeLists template txt 烧录程序 编写 cfg文件 编写 cfg文件 新建工程 打开你的Clion 点击新建工程 在左侧找到STM32
  • 期货开户寻找交易确定性

    1 寻找确定性 都说金融是概率游戏 大家都是说胜率有多少 没有谁敢说行情能100 确定 但傅海棠却提出 在特定情况下 能找到100 确定的行情 他的这个观点也一度引起了广泛的争议 傅海棠说 物极必反 必 是100 不是概率 关键是找到那个
  • Unity3D之sprite动画(Animation)的制作

    实例说明 忍者跑酷的player动画制作 这些都是用Sprite做的动画 在prioject面板里的一组sprite里面点击 之后看属性面板的Sprite Editor对这组Sprite进行编辑 下面先编辑一个idle状态的动画 首先选择第
  • 贝叶斯推断及其互联网应用(一)

    贝叶斯推断及其互联网应用 一 投递人 itwriter 发布于 2011 08 25 14 03 评论 6 有1981人阅读 原文链接 收藏 一年前的这个时候 我正在翻译Paul Graham的 黑客与画家 那本书大部分谈的是技术哲学 但是
  • 二、水平管道中CO2气液两相的流量研究

    水平管道中CO2气液两相的流量研究 3 1 引言 在CCS系统的CO2管道运输过程中 由于传输距离较长且受到管道周围环境的影响 管道中的CO2不可避免的会发生相态的改变 产生气液两相CO2流 因此 本研究基于多传感器系统的测量方法 对水平管
  • android hwcomposer 抓取各个显示图层的raw显示数据

    amlogic 平台 void fill color void vaddr int cnt unsigned int p data p data unsigned int vaddr for int i 0x00 i lt 256 1920
  • 服务器---session理论知识

    1 session理论知识 1 1 session何时创建 1 2 session何时销毁 1 session何时创建 Session 机制 session机制是一种服务器端的机制 用来在无状态的HTTP协议下越过多个请求页面来维持状态和识
  • Mac上Pycharm中安装anaconda的pandas和numpy的方法

    1 点击PyCharm菜单栏下的Preferences 2 选择需要安装的project中的Project Interpreter选项 3 选择一个python版本 如红框1 下面会列出已经安装了的Package 这时点击红框2的anaco
  • 【Mac】Mac下SSH免密登录localhost

    1 背景 问题起因参考 mac下ssh 报错 localhost ssh connect to host localhost port 22 Connection refused 为了在MAC上搭建Hadoop standalone 需要配
  • gtx1050ti最稳定的驱动_更新PC电脑的蓝牙驱动方法

    有时候我们需要更新自己的电脑蓝牙版本使我们在特定环境下更好的使用 下面就来讲讲怎么更新蓝牙版本 一 首先我们要查看自己电脑的蓝牙版本 1 右键点击左下方的开始菜单 找到设备管理器 M 2 点开设备管理器 找到蓝牙并右键属性 并查看驱动程序
  • Vue3 中的 @Options,是做什么的?

    Vue3 中的 Options 是做什么的 Options 是个啥 为什么我的项目中会有 Options 或 Component 啥是 类语法风格的组件 Class Style Component Vue Class Component 更