共计 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
宏来申明emit
s。
<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 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。