这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

Vue 3 稳定已经有一段时间了。许多代码库正在生产中使用它,其他人最终也必须进行迁移。我有机会与它一起工作,并记录了我的错误,这可能是你想避免的。

1.使用响应式助手声明基本类型

数据声明曾经很简单,但现在有多个辅助工具可用。现在的一般规则是:

  • 使用 reactive 代替 Object, Array, Map, Set
  • 使用 ref 代替 String, Number, Boolean

对于原始值使用响应式会导致警告,并且该值不会被设置为响应式:

/* DOES NOT WORK AS EXPECTED */
<script setup>
import { reactive } from "vue"; const count = reactive(0);
</script>

[Vue warn]: value cannot be made reactive

事例:codesandbox.io/s/jolly-ish…

矛盾的是,反过来却行得通!例如,使用 ref 声明 Array 将在内部调用 reactive

2.解构失去响应式值

让我们想象一下,有一个具有计数器和一个按钮以增加计数器的响应式对象。

<template>
Counter: {{ state.count }}
<button @click="add">Increase</button>
</template> <script>
import { reactive } from "vue";
export default {
setup() {
const state = reactive({ count: 0 }); function add() {
state.count++;
} return {
state,
add,
};
},
};
</script>

这个过程相当直接,也能如预期般工作,但你可能会想利用 JavaScript 的解构特性来进行下面的操作。

/* DOES NOT WORK AS EXPECTED */
<template>
<div>Counter: {{ count }}</div>
<button @click="add">Increase</button>
</template> <script>
import { reactive } from "vue";
export default {
setup() {
const state = reactive({ count: 0 }); function add() {
state.count++;
} return {
...state,
add,
};
},
};
</script>

地址:codesandbox.io/s/gracious-…

代码看起来一样,根据我们以前的经验,应该可以运行,但实际上,Vue 的反应性跟踪是基于属性访问的。这意味着我们不能赋值或解构一个响应性对象,因为与第一个引用的响应性连接会丢失。这是使用 reactive helper 的限制之一。

3.对".value"属性感到困惑

使用 ref 的怪癖之一可能很难适应。Ref 接受一个值并返回一个响应式对象。该值在对象内部在 .value 属性下可用。

const count = ref(0)

console.log(count) // { value: 0 }
console.log(count.value) // 0 count.value++
console.log(count.value) // 1

但是在模板中使用时,引用会被解包, .value 不需要。

<script setup>
import { ref } from 'vue' const count = ref(0) function increment() {
count.value++
}
</script> <template>
<button @click="increment">
{{ count }} // no .value needed
</button>
</template>
但请注意!解包(Unwrapping)只能在顶层属性上有效。下面的代码片段将产生 [object Object]
// DON'T DO THIS
<script setup>
import { ref } from 'vue' const object = { foo: ref(1) } </script> <template>
{{ object.foo + 1 }} // [object Object]
</template>

正确使用 ".value" 需要时间。尽管我偶尔会忘记它,但我发现我自己最初比需要的时候用得更频繁。

4. Emitted Events

自 Vue 初始版本以来,子组件可以使用 emits 与父组件通信。只需要添加一个自定义监听器来监听事件即可。

this.$emit('my-event')

<my-component @my-event="doSomething" />
现在需要使用 defineEmits 宏来声明emits。
<script setup>
const emit = defineEmits(['my-event'])
emit('my-event')
</script>
记住的另一件事是,无论是 defineEmits 还是 defineProps (用于声明props),都不需要导入。当使用 script setup. 时,它们会自动可用。
<script setup>
const props = defineProps({
foo: String
}) const emit = defineEmits(['change', 'delete'])
// setup code
</script>

5.声明额外选项

有一些 Options API 方法的属性在 script setup 中不受支持。

  • name
  • inheritAttrs
  • 插件或库需要的自定义选项

解决方案是在同一组件中定义两个不同的脚本,如脚本设置RFC中所定义的那样:

<script>
export default {
name: 'CustomName',
inheritAttrs: false,
customOptions: {}
}
</script> <script setup>
// script setup logic
</script>

6.使用 Reactivity Transform

响应性转换是 Vue 3 的一项实验性但有争议的特性,其目标是简化声明组件的方式。这个想法是利用编译时转换来自动解包 ref 并使 .value 变得过时。但现在已经被取消,并将在 Vue 3.3 中被移除。它仍然会以一个包的形式存在,但由于它不是 Vue 核心的一部分,所以最好不要在它上面投入时间。

7. 定义异步组件

异步组件以前是通过将它们包含在一个函数中来声明的。

const asyncModal = () => import('./Modal.vue')
自 Vue 3 开始,异步组件需要使用 defineAsyncComponent 辅助函数进行显式定义:
import { defineAsyncComponent } from 'vue'

const asyncModal = defineAsyncComponent(() => import('./Modal.vue'))

8. 在模板中使用不必要的包装器

在Vue 2中,组件模板需要一个单一的根元素,这有时会引入不必要的包装器:

<!-- Layout.vue -->
<template>
<div>
<header>...</header>
<main>...</main>
<footer>...</footer>
</div>
</template>
这不再是问题,因为现在支持多个根元素。
<!-- Layout.vue -->
<template>
<header>...</header>
<main v-bind="$attrs">...</main>
<footer>...</footer>
</template>

9. 使用错误的生命周期事件。

所有组件生命周期事件都被重命名,要么通过添加 on 前缀,要么完全更改名称。可以在以下图形中检查所有更改。

10. Skipping the Documentation

最后,官方文档已经进行了重大改版,以反映新的 API,并包含许多有价值的注解、指南和最佳实践。即使你是一名经验丰富的 Vue 2 工程师,通过阅读这个文档,你肯定能学到一些新的东西。

每个框架都有一个学习曲线,Vue 3的曲线无疑比Vue 2更陡峭。我仍然不确定版本之间的迁移工作是否值得,但组合API更加清晰,一旦掌握了它,就会感觉很自然。

代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug

本文转载于:

https://juejin.cn/post/7241963298890137637

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

记录--开始使用Vue 3时应避免的10个错误的更多相关文章

  1. 使用 Vue 3 时应避免的 10 个错误

    Vue 3已经稳定了相当长一段时间了.许多代码库都在生产环境中使用它,其他人最终都将不得不迁移到Vue 3.我现在有机会使用它并记录了我的错误,下面这些错误你可能想要避免. 使用Reactive声明原 ...

  2. unity, scene视图查看场景时应调成正交模式

    scene视图查看场景时应调成正交模式,以避免稍微滑动滚轮就导致视角过远或过近.

  3. 记录Linux下安装elasticSearch时遇到的一些错误

    记录Linux下安装elasticSearch时遇到的一些错误 http://blog.sina.com.cn/s/blog_c90ce4e001032f7w.html (2016-11-02 22: ...

  4. 在做APP前端开发时应注意的一些问题

    在做APP前端开发时应注意的一些问题 在整个app开发流程中,app前端开发是一个必不可少的环节,也是一个在app开发过程中重量级的角色.说到这,那么在app应用的前端开发中,又要注意什么问题呢?一. ...

  5. MySQL运行内存不足时应采取的措施?

    排除故障指南:MySQL运行内存不足时应采取的措施? 天一阁@ 老叶茶馆 1周前 导读 排除故障指南:MySQL运行内存不足时应采取的措施? 翻译团队:知数堂藏经阁项目 - 天一阁 团队成员:天一阁- ...

  6. MySQL运行内存不足时应采取的措施

    导读 排除故障指南:MySQL运行内存不足时应采取的措施? 原文出处:<What To Do When MySQL Runs Out of Memory: Troubleshooting Gui ...

  7. 解决webstorm拉取Vue项目时卡顿,及内存爆满问题

    最近在拉取Vue项目时总是会出现webstorm内存瞬间爆满,导致webstorm卡死,而且,有时在下载完node_modues后webstorm一直处于updating中,为此在网上找了很多方法结果 ...

  8. Lombok 继承时应注意的点

    lombok项目的产生就是为了省去我们手动创建getter和setter等基本方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter等方法.即它最终能够达到的效果是:在源码中没 ...

  9. APP前端开发时应注意的一些问题

    在做APP前端开发时应注意的一些问题 在整个app开发流程中,app前端开发是一个必不可少的环节,也是一个在app开发过程中重量级的角色.说到这,那么在app应用的前端开发中,又要注意什么问题呢?一. ...

  10. 解决VSCode中使用vetur插件格式化vue文件时,js代码会自动加上冒号和分号

    解决VSCode中使用vetur插件格式化vue文件时,js代码会自动加上冒号和分号 在设置中把"vetur.format.defaultFormatter.js": " ...

随机推荐

  1. Java集合篇之深入解析ArrayList,这六问你答的上来吗?

    写在开头 开年第一篇,先祝各位新的一年身体健康,学业有成,事业有成哈,春节期间就是咔咔乱吃,咔咔乱玩,把学习都抛一边子去了,已经9天没有学习了,深深的懊悔,从今天开始,2024年的学习正式开启,一起给 ...

  2. 从 KeyStore 中获取 PublicKey 和 PrivateKey

    KeyStore(译:密钥存储库) 代表用于加密密钥和证书的存储设施. KeyStore 管理不同类型的 entry(译:条目).每种类型的 entry 都实现了 KeyStore.Entry 接口. ...

  3. java 从零开始手写 redis(九)LRU 缓存淘汰算法如何避免缓存污染

    前言 java从零手写实现redis(一)如何实现固定大小的缓存? java从零手写实现redis(三)redis expire 过期原理 java从零手写实现redis(三)内存数据如何重启不丢失? ...

  4. 【leetcode】如何实现 regex 正则表达式引擎

    题目 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字 ...

  5. Java设计模式-适配器模式Adapter

    介绍 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本 因接口不匹配不能一起工作的两个类可以协同工作.其别名为包装器(Wrapper ...

  6. 李宏毅2022机器学习HW3 Image Classification

    Homework3 数据集下载 在本地环境下进行实验总是令人安心,但是又苦于网上找不到数据集,虽然kaggle上有数据集但是下载存在问题 于是有了一个天才的想法,间接从kaggle上下载(利用outp ...

  7. zlib开发笔记(一):zlib库介绍、编译和工程模板

    前言   Qt使用一些压缩解压功能,介绍过libzip库编译,本篇说明zlib库.   zlib库   zlib被设计为一个免费的,通用的,法律上不受限制的-即不受任何专利保护的无损数据压缩库,几乎可 ...

  8. SpringMvc-<context:component-scan>使用说明

    在xml配置了这个标签后,spring可以自动去扫描base-package下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把 ...

  9. 聊聊 HTTP 性能优化

    哈喽大家好,我是咸鱼. 作为用户的我们在 "上网冲浪" 的时候总是希望快一点,尤其是抢演唱会门票的时候,但是现实并非如此,有时候我们会遇到页面加载缓慢.响应延迟的情况. 而 HTT ...

  10. 面试官:说说SSO单点登录的实现原理?

    单点登录(Single Sign-On, SSO)是一种让用户在多个应用系统之间只需登录一次就可以访问所有授权系统的机制.单点登录主要目的是为了提高用户体验并简化安全管理. 举个例子,您在一个大型企业 ...