0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Vue3时遇到的一些问题

OSC开源社区 来源:OSCHINA 社区 2023-09-13 10:16 次阅读

来源| OSCHINA 社区

作者 |葡萄城技术团队

Vue3 目前已经趋于稳定,不少代码库都已经开始使用它,很多项目未来也必然要迁移至 Vue3。本文记录我在使用 Vue3 时遇到的一些问题,希望能为其他开发者提供帮助。

1.使用 reactive 封装基础数据类型

传统开发模式中,数据声明很简单。但是在 Vue 中有多个响应式变量声明方式,整体的使用规则如下:

使用 reactive 来封装 Object,Array,Map,Set 数据类型;

使用 ref 封装 String,Number,Boolean 类型。

如果使用 reactive 来封装基础数据类型,会产生警告,同时封装的值不会成为响应式对象。



但是,可以使用 ref 来封装 Object、Array 等数据类型,内部会调用 reactive。

2.解构 reactive 对象

下面代码中,count 封装成了 reactive 对象,点击按钮时,count 会自增。



 

如果需要使用 ES6 结构赋值对 state 进行结构,需要使用如下的代码:




结构复制完成之后,点击按钮,效果如下: 代码看起来比较相似,而且根据以前的表现,逻辑是可以正常执行的。但事实上,Vue 的响应式追踪通过属性获取,这意味着我们不能去解构响应式对象,会导致引用连接丢失。这是响应式代理的限制之一。

3.使用.value 造成的困惑

Ref 接受一个值并返回一个响应式对象,该值只有在内部对象.value 属性下可用。
const count = ref(0)

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

 count.value++
 console.log(count.value) // 1

但是 ref 如果应用在 template 中,不需要对 ref 进行解包,也就是不需要使用.vue。




需要注意的是,解包只作用于一级属性,下边的代码会返回 [object Object]



正确使用.value 需要时间,初学者偶尔会忘记它。在使用时,要注意只在合适的场景下使用它。

4.Emitted 事件

从 Vue 发布以来,子组件可以通过 emits 与父组件通信,只需要添加一个自定义的监听器来监听事件即可。
this.$emit('my-event')

Vue3 中,需要使用编译器宏 defineEmits 来声明 emits。
const emit = defineEmits(['my-event'])
 emit('my-event')
 

在 setup 语法糖下,defineEmits 和 defineProps 会被自动引入。其它情况下,需要主动引入。


最后,由于 Vue3 中,事件必须声明,因此再需要使用.native 修饰符,该修饰符已被移除。

5. 声明组件选项

setup 不支持如下组件选项声明:

name

inheritAttrs

customOptions

如果需要继续使用这些属性,可以声明多个 script 脚本,如下所示:





6. 使用 Reactivity Transform

Reactivity Transform 是 Vue3 中一个预览属性,有一定的争议性,默认是禁用的。它主要用来简化组件的声明方式。这个想法是利用编译时转换来自动解包 ref,从而避免使用.value。从 Vue3.3 中已经删除该功能,作为一个扩展包提供。由于它不是 Vue 的核心部分,且目前风险还是比较多,建议先不要在此方面投入太多事件。

7.定义异步组件

异步组件以前是通过将它们包含在方法中来声明的。
const asyncModal = () => import('./Modal.vue')

Vue3 中需要使用 defineAsyncComponent 来声明异步组件。

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

8.template 中使用不必要的包装元素

 

Vue3 中支持多个根元素,不再需要使用外层 div 元素包裹。



9.生命周期函数

所有组件生命周期函数都通过添加 on 前缀或完全更名实现,下图详细列出了具体的变化:7e6d476c-5160-11ee-a25d-92fbcf53809c.png

10.产品文档

官方对文档已经做了更新,补充更新了 API,并包含很多有价值的注释、指南和最佳实践。即使你现在使用的是 Vue2,通过阅读新的文档也会学到一些新知识。 总结 每个框架都有学习曲线,Vue3 相对 Vue2 更加陡峭,在框架切换之间也会有一定的学习成本。但 Vue3 组合式 API 相对 Vue2 选项式 API 确实更加简洁易用。如果您在使用过程中有什么疑问,也欢迎留言交流。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 封装
    +关注

    关注

    124

    文章

    7280

    浏览量

    141100
  • 数据类型
    +关注

    关注

    0

    文章

    228

    浏览量

    13498
  • string
    +关注

    关注

    0

    文章

    40

    浏览量

    4646

原文标题:Vue3中的几个坑,你都见过吗?

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    virtex6中使用SRIO时遇到一些问题怎么解决

    大家好,我在virtex6中使用SRIO时遇到一些问题。所以我试着用ibert来测试他的问题所在。但测试也失败了。我不知道出了什么问题.Plase帮帮我!非常感谢你。
    发表于 06-19 10:15

    基于TypeScript实现Vue3.0指令组件拖拽

    最近在用vue3重构后台的个功能。个弹窗组件,弹出个表单。然后点击提交。早上运维突然跑过来问我,为啥弹窗挡住了下边的表格的数据,我添加的时候,都没法对照表格来看了。你必须给我解决
    发表于 11-04 06:58

    STM32F030多路ADC采样遇到一些问题

    最近使用到了STM32F030CCT6,较之前经常使用的STM32F207还是有些区别的,今天主要说下STM32F030 多路ADC采样(非DMA连续方式)遇到一些问题,供其他同志参考。 首先
    发表于 08-04 09:10

    STM32开发过程中遇到一些问题

    STM32开发过程中遇到一些问题,记录如下。Q1:下载后程序不运行,反复排查代码没问题。A1:栈空间太小,打开startup_stm32f10x_hd.s,把 Stack_Size EQU
    发表于 08-20 06:48

    ESP8266模块和机智云学习中遇到一些问题

    正点原子STM32开发板+ESP8266使用机智云最近学习STM32,学长和大佬建议我去学习下ESP8266模块和机智云,于是开始摸索。在这里记录以下学习中遇到一些问题,希望帮助得到大家。
    发表于 08-24 06:28

    学习HC06蓝牙模块遇到一些问题记录

    学习HC06蓝牙模块遇到一些问题,特此写下作为记录。用USB转TTL连接,插到电脑上,发AT怎么也不回USB转TTL与蓝牙模块连接图打开串口助手:开始用的是丁丁串口助手,发·AT不回OK。后来
    发表于 12-02 07:46

    学习32输入捕获时遇到一些问题

    在学习32输入捕获时遇到一些问题以及得出的答案最近学习输入捕获时参考了原子哥的程序,前面的引脚设置,定时器设置,中断设置啥的都看的懂,(不懂的可以去网上搜下,讲解的有很多)但是在中断设置里有些
    发表于 01-06 06:16

    在keil编译过程中遇到一些问题及解决方案汇总

    Keil编译问题汇总所学板子为32系列(Cortex-M0),在keil编译过程中遇到一些问题及解决方案:①…\FWLib\SRC\ETIMER.c(48): error:#5: cannot
    发表于 01-11 08:18

    【跃昉科技BF2开发板试用体验】遇到过的一些问题

    分享一些遇到一些遇到一些问题吧。首先第个就是编译器与环境的问题。官方对工程编译算是提供了三
    发表于 06-26 21:56

    配置S32K144的窗口模式时遇到一些问题求解

    我在配置 S32K144 的窗口模式时遇到一些问题,CMP 模块。附件是我的测试演示。我使用了 CMP_0 模块,正输入是 DAC,负输入是输入 0,(逻辑分析仪通道 1,蓝线,设置频率
    发表于 04-03 09:05

    CSEc模块初始化时使用setAuthKey()设置授权密钥的一些问题求解

    我在使用 CSEc 模块时遇到一些问题。 我在初始化期间使用 setAuthKey 设置授权密钥,并使用 loadKey 加载和更新 key1。重新上下电后如何管理setAuthKey
    发表于 05-18 10:24

    cadence画板中遇到一些问题

    cadence画板中遇到一些问题,在这里分享给大家,多多指教
    发表于 02-25 16:01 0次下载

    绘制原理图和PCB图的过程中常遇到一些问题

    绘制原理图和PCB图的过程中常遇到一些问题.doc
    发表于 07-12 10:42 0次下载

    关于React和Vue产生一定的认知

    Vue2 相较 Vue3 版本而言牢牢占据着大部分 Vue 开发者的视野,但是因为 Vue 官方已经把 Vue3 作为默认的版本,所以在此同
    的头像 发表于 11-02 13:18 541次阅读

    一文看懂Vue3响应式系统原理

    Vue3 中,响应式系统的实现基于 ES6 的 Proxy 对象。Proxy 可以直接监听对象和数组的变化,而无需对每个属性进行监听,从而大大提高性能。同时,Proxy 也可以解决 Object.defineProperty 无法监听数组的问题。
    的头像 发表于 12-07 10:55 444次阅读
    一文看懂<b class='flag-5'>Vue3</b>响应式系统原理