关于typescript:开始使用Vue-3时应避免的10个错误

31次阅读

共计 3806 个字符,预计需要花费 10 分钟才能阅读完成。

本文首发于微信公众号:大迁世界, 我的微信: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) // 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。

交换

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

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

正文完
 0