当前位置: 首页 > news >正文

Vue 3.0 风格指南 2

#元素 attribute 的顺序推荐

元素 (包括组件) 的 attribute 应该有统一的顺序。

这是我们为组件选项推荐的默认顺序。它们被划分为几大类,所以你也能知道新添加的自定义 attribute 和指令应该放到哪里。

  1. 定义 (提供组件的选项)
    • is
  2. 列表渲染 (创建多个变化的相同元素)
    • v-for
  3. 条件渲染 (元素是否渲染/显示)
    • v-if
    • v-else-if
    • v-else
    • v-show
    • v-cloak
  4. 渲染修饰符 (改变元素的渲染方式)
    • v-pre
    • v-once
  5. 全局感知 (需要超越组件的知识)
    • id
  6. 唯一的 Attributes (需要唯一值的 attribute)
    • ref
    • key
  7. 双向绑定 (把绑定和事件结合起来)
    • v-model
  8. 其他 Attributes (所有普通的绑定或未绑定的 attribute)
  9. 事件 (组件事件监听器)
    • v-on
  10. 内容 (覆写元素的内容)
    • v-html
    • v-text

#组件/实例选项中的空行推荐

你可能想在多个 property 之间增加一个空行,特别是在这些选项一屏放不下,需要滚动才能都看到的时候。

当你的组件开始觉得密集或难以阅读时,在多个 property 之间添加空行可以让其变得容易。在一些诸如 Vim 的编辑器里,这样格式化后的选项还能通过键盘被快速导航。

好例子

 
  1. props: {
  2. value: {
  3. type: String,
  4. required: true
  5. },
  6. focused: {
  7. type: Boolean,
  8. default: false
  9. },
  10. label: String,
  11. icon: String
  12. },
  13. computed: {
  14. formattedValue() {
  15. // ...
  16. },
  17. inputClasses() {
  18. // ...
  19. }
  20. }

 
  1. // 没有空行在组件易于阅读和导航时也没问题。
  2. props: {
  3. value: {
  4. type: String,
  5. required: true
  6. },
  7. focused: {
  8. type: Boolean,
  9. default: false
  10. },
  11. label: String,
  12. icon: String
  13. },
  14. computed: {
  15. formattedValue() {
  16. // ...
  17. },
  18. inputClasses() {
  19. // ...
  20. }
  21. }

#单文件组件的顶级元素的顺序推荐

单文件组件应该总是让 <script><template> 和 <style> 标签的顺序保持一致。且 <style> 要放在最后,因为另外两个标签至少要有一个。

反例

 
  1. <style>/* ... */</style>
  2. <script>/* ... */</script>
  3. <template>...</template>

 
  1. <!-- ComponentA.vue -->
  2. <script>/* ... */</script>
  3. <template>...</template>
  4. <style>/* ... */</style>
  5. <!-- ComponentB.vue -->
  6. <template>...</template>
  7. <script>/* ... */</script>
  8. <style>/* ... */</style>

好例子

 
  1. <!-- ComponentA.vue -->
  2. <script>/* ... */</script>
  3. <template>...</template>
  4. <style>/* ... */</style>
  5. <!-- ComponentB.vue -->
  6. <script>/* ... */</script>
  7. <template>...</template>
  8. <style>/* ... */</style>

 
  1. <!-- ComponentA.vue -->
  2. <template>...</template>
  3. <script>/* ... */</script>
  4. <style>/* ... */</style>
  5. <!-- ComponentB.vue -->
  6. <template>...</template>
  7. <script>/* ... */</script>
  8. <style>/* ... */</style>

#优先级 D 的规则:谨慎使用 (潜在风险)

#scoped 中的元素选择器谨慎使用

元素选择器应该避免在 scoped 中出现。

在 scoped 样式中,类选择器比元素选择器更好,因为大量使用元素选择器是很慢的。

详解
为了给样式设置作用域,Vue 会为元素添加一个独一无二的 attribute,例如 data-v-f3f3eg9。然后修改选择器,使得在匹配选择器的元素中,只有带这个 attribute 才会真正生效 (比如 button[data-v-f3f3eg9])。
问题在于大量的元素和 attribute 组合的选择器 (比如 button[data-v-f3f3eg9]) 会比类和 attribute 组合的选择器慢,所以应该尽可能选用类选择器。

反例

 
  1. <template>
  2. <button>×</button>
  3. </template>
  4. <style scoped>
  5. button {
  6. background-color: red;
  7. }
  8. </style>

好例子

 
  1. <template>
  2. <button class="btn btn-close">×</button>
  3. </template>
  4. <style scoped>
  5. .btn-close {
  6. background-color: red;
  7. }
  8. </style>

#隐性的父子组件通信谨慎使用

应该优先通过 prop 和事件进行父子组件之间的通信,而不是 this.$parent 或变更 prop。

一个理想的 Vue 应用是 prop 向下传递,事件向上传递的。遵循这一约定会让你的组件更易于理解。然而,在一些边界情况下 prop 的变更或 this.$parent 能够简化两个深度耦合的组件。

问题在于,这种做法在很多简单的场景下可能会更方便。但请当心,不要为了一时方便 (少写代码) 而牺牲数据流向的简洁性 (易于理解)。

反例

 
  1. app.component('TodoItem', {
  2. props: {
  3. todo: {
  4. type: Object,
  5. required: true
  6. }
  7. },
  8. template: '<input v-model="todo.text">'
  9. })

 
  1. app.component('TodoItem', {
  2. props: {
  3. todo: {
  4. type: Object,
  5. required: true
  6. }
  7. },
  8. methods: {
  9. removeTodo() {
  10. this.$parent.todos = this.$parent.todos.filter(todo => todo.id !== vm.todo.id)
  11. }
  12. },
  13. template: `
  14. <span>
  15. {{ todo.text }}
  16. <button @click="removeTodo">
  17. ×
  18. </button>
  19. </span>
  20. `
  21. })

好例子

 
  1. app.component('TodoItem', {
  2. props: {
  3. todo: {
  4. type: Object,
  5. required: true
  6. }
  7. },
  8. template: `
  9. <input
  10. :value="todo.text"
  11. @input="$emit('input', $event.target.value)"
  12. >
  13. `
  14. })

 
  1. app.component('TodoItem', {
  2. props: {
  3. todo: {
  4. type: Object,
  5. required: true
  6. }
  7. },
  8. template: `
  9. <span>
  10. {{ todo.text }}
  11. <button @click="$emit('delete')">
  12. ×
  13. </button>
  14. </span>
  15. `
  16. })

#非 Flux 的全局状态管理谨慎使用

应该优先通过 Vuex 管理全局状态,而不是通过 this.$root 或一个全局事件总线。

通过 this.$root 和/或全局事件总线管理状态在很多简单的情况下都是很方便的,但是并不适用于绝大多数的应用。

Vuex 是 Vue 的官方类 flux 实现,其提供的不仅是一个管理状态的中心区域,还是组织、追踪和调试状态变更的好工具。它很好地集成在了 Vue 生态系统之中 (包括完整的 Vue DevTools 支持)。

反例

 
  1. // main.js
  2. import { createApp } from 'vue'
  3. import mitt from 'mitt'
  4. const app = createApp({
  5. data() {
  6. return {
  7. todos: [],
  8. emitter: mitt()
  9. }
  10. },
  11. created() {
  12. this.emitter.on('remove-todo', this.removeTodo)
  13. },
  14. methods: {
  15. removeTodo(todo) {
  16. const todoIdToRemove = todo.id
  17. this.todos = this.todos.filter(todo => todo.id !== todoIdToRemove)
  18. }
  19. }
  20. })

好例子

 
  1. // store/modules/todos.js
  2. export default {
  3. state: {
  4. list: []
  5. },
  6. mutations: {
  7. REMOVE_TODO (state, todoId) {
  8. state.list = state.list.filter(todo => todo.id !== todoId)
  9. }
  10. },
  11. actions: {
  12. removeTodo ({ commit, state }, todo) {
  13. commit('REMOVE_TODO', todo.id)
  14. }
  15. }
  16. }

 
  1. <!-- TodoItem.vue -->
  2. <template>
  3. <span>
  4. {{ todo.text }}
  5. <button @click="removeTodo(todo)">
  6. X
  7. </button>
  8. </span>
  9. </template>
  10. <script>
  11. import { mapActions } from 'vuex'
  12. export default {
  13. props: {
  14. todo: {
  15. type: Object,
  16. required: true
  17. }
  18. },
  19. methods: mapActions(['removeTodo'])
  20. }
  21. </script>

相关文章:

Vue 3.0 风格指南 2

#元素 attribute 的顺序推荐 元素 (包括组件) 的 attribute 应该有统一的顺序。 这是我们为组件选项推荐的默认顺序。它们被划分为几大类&#xff0c;所以你也能知道新添加的自定义 attribute 和指令应该放到哪里。 定义 (提供组件的选项) is列表渲染 (创建多个变化的相同元素…...

ChatGPT遭多国调查,OpenAI凌晨就安全问题发文,GPT-5要暂缓?

最近&#xff0c;意大利宣布禁用 ChatGPT&#xff0c;因为 OpenAI 违反了意大利相关的隐私规则和数据保护法&#xff0c;出现了用户数据丢失情况&#xff0c;而且未向用户告知。 消息出来后&#xff0c;德国、法国、爱尔兰、西班牙等国的监管部门都表示正在密切关注 ChatGPT 的…...

网络安全书籍推荐

网络安全书籍推荐 &#xff0c;对于网络安全的初学者来说&#xff0c;能很好的选择教材&#xff0c;鉴于只有英文版&#xff0c;我尝试翻译成中文以供参考&#xff0c;初次翻译&#xff0c;翻译的不好请见谅。 标题注解技术等级The Art of Software Security Assessment软件安…...

【独家】华为OD机试 - 狼羊过河 or 羊、狼、农夫过河(C 语言解题)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:狼羊过河 or 羊、狼、农夫过河…...

东八区的 springboot 如何配置序列化

东八区的 springboot &#x1f69e;使用SpringBoot默认配置自定义配置类自定义 ObjectMapper自定义序列化器总结我接受它的苦&#xff0c;它的灰暗&#xff0c;它的刺&#xff0c;因为总会过去&#xff0c;我的花会开&#xff0c;生活也会慢慢拥抱我 使用SpringBoot默认配置 S…...

论文阅读_LLaMA

论文信息 number headings: auto, first-level 2, max 4, _.1.1 name_en: LLaMA: Open and Efficient Foundation Language Models name_ch: LLaMA: 开放高效的基础语言模型 paper_addr: https://arxiv.org/abs/2302.13971 doi: https://doi.org/10.48550/arXiv.2302.13971 da…...

腾讯空降测试工程师,绩效次次拿S,真是砂纸擦屁股,给我露了一手啊

​上周我们公司的绩效面谈全部结束了&#xff0c;每年到这个时间点就是打绩效的时候了&#xff0c;对于职场打工人来说绩效绝对是最重要的事情之一&#xff0c;原因也很简单&#xff1a;奖金、晋升、涨薪都和它有关系。 比如下面这个美团员工在脉脉上的自曝就很凄凉&#xff1…...

真题详解(计算机总线)-软件设计(四十五)

真题详解&#xff08;二维数组&#xff09;-软件设计&#xff08;四十四&#xff09;https://blog.csdn.net/ke1ying/article/details/130023062 1、2016年下半年 解析&#xff1a; A选项&#xff0c;当B中的两个结束都到达&#xff0c;会转到C2&#xff0c;因为C2没有事件&a…...

剪格子

[蓝桥杯 2013 省 A] 剪格子 题目描述 如图 111 所示&#xff0c;333\times 333 的格子中填写了一些整数。 我们沿着图中的红色线剪开&#xff0c;得到两个部分&#xff0c;每个部分的数字和都是 606060。 本题的要求就是请你编程判定&#xff1a;对给定的 mnm\times nmn 的格…...

【Nowcoder-BC146.添加逗号 -OR63.删除公共字符】

Nowcoder-BC146.-OR63.Nowcoder-BC146.添加逗号Nowcoder-OR63.删除公共字符Nowcoder-BC146.添加逗号 题目&#xff1a;对于一个较大的整数 N(1<N<2,000,000,000) 比如 980364535&#xff0c;我们常常需要一位一位数这个数字是几位数&#xff0c;但是如果在这个数字每三位…...

能自动摊铺施工的公路滑模机多少钱一台

滑模机是能在公路施工现场进现场自动摊铺作业的设备&#xff0c;让路缘石经过设备制作一次性完成施工工序&#xff0c;整体成型一次完成。这样的使用流程整体包含了几个大的关键步骤&#xff0c;分别是测量后放置标示线-设备进场就位-原材料运输和供应-滑模机摊铺作业-后续伸缩…...

ChatGPT热潮下,因生成式AI失业的人出现,我成了第一批失业的人

近几个月来&#xff0c;越来越多的知名人士预计&#xff0c;年内大热的ChatGPT有望掀起一场新的工业革命。而纵观历史&#xff0c;历次工业革命往往会深远改变当时的社会结构——从机械织布机到内燃机再到第一台计算机&#xff0c;新技术的出现总是会引起人们对于被机器取代的恐…...

TypeScript01-基础知识

基础类型 boolean 类型 let isDone: boolean false; // ES5&#xff1a;var isDone false;number 类型 let count: number 10; // ES5&#xff1a;var count 10;string 类型 let name: string "semliker"; // ES5&#xff1a;var name semlinker;Symbol 类…...

【Redis学习】Redis安装配置

Linux 安装环境必须先具备gcc编译环境 版本选择 查看自己redis版本的命令 安全Bug按照官网提示&#xff0c;升级成为6.0.8及以上 目前建议都需要升级到6.0.8版本以上 本次我们用Redis7.0 Redis7安装步骤 下载获得redis-7.0.0.tar.gz后将它放入Linux目录/opt /opt目录下解…...

leetcode160:相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后…...

基于Prometheus的jvm监控指标详解

使用Prometheus 监控Springboot应用参考 Prometheus Operator实战—— Prometheus、Alertmanager、Grafana 监控Springboot服务 下面来看看jvm的监控指标 # HELP jvm_gc_collection_seconds Time spent in a given JVM garbage collector in seconds. # TYPE jvm_gc_collection…...

C程序设计语言基础

机器语言与高级语言 计算机硬件只能够识别电平信号&#xff0c;正电平或负电平&#xff0c;计算机的的各种按钮触发各种电平与计算机交互。随着随着操作系统的发展&#xff0c;人们用1&#xff0c;0分别表示正电平和负电平&#xff0c;并由0&#xff0c;1所组成的一系列指令指…...

构建同一局域网下文件共享网页

首先&#xff0c;我会将这个内容分成以下步骤&#xff1a; 目录 1. 安装必要的软件和工具 2. 搭建本地服务器 3. 编写账号系统和登录页面 4. 实现多人登录 5. 实现文件上传和共享功能 以下是每个步骤的详细说明和代码示例。 1. 安装必要的软件和工具 为了完成这个项目&…...

程序员未来是不是会大量失业?

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store 会&#xff0c;但是主要原因并不是来自最近爆火的AIGC。 生成式AI对比与传统的工具的确很强大&#xff0c;但是要说替代某种工作岗位还为时尚早。最近铺天盖地的相关推文&#xff0c;热度一波未平又起…...

解密普元大文件传输平台新版本21种特性

本文主要介绍大文件传输平台及其传输特性&#xff0c;以平台版本升级为切入点&#xff0c;探讨大文件传输平台对多种传输场景的支持及部署管控方面能力的增强。目 录01 普元大文件传输平台‍‍02 普元文件传输平台新版本特性‍‍‍‍‍‍03 信创项目案例‍‍04 总结01普元大…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...