本文首发于微信公众号:大迁世界, 我的微信:qq449245884,我会第一工夫和你分享前端行业趋势,学习路径等等。
更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi ,蕴含一线大厂面试残缺考点、材料以及我的系列文章。

快来收费体验ChatGpt plus版本的,咱们出的钱
体验地址:https://chat.waixingyun.cn
能够退出网站底部技术群,一起找bug.

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

事例:https://codesandbox.io/s/jolly-ishizaka-ud946f?file=/src/App.vue

矛盾的是,反过来却行得通!例如,应用 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>

地址:https://codesandbox.io/s/gracious-ritchie-sfpswc?file=/src/Ap...

代码看起来一样,依据咱们以前的教训,应该能够运行,但实际上,Vue 的反馈性跟踪是基于属性拜访的。这意味着咱们不能赋值或解构一个响应性对象,因为与第一个援用的响应性连贯会失落。这是应用 reactive helper 的限度之一。

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

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

const count = ref(0)console.log(count) // { value: 0 }console.log(count.value) // 0count.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。

交换

有幻想,有干货,微信搜寻 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。

本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。