当前位置: 首页 > 科技观察

Vue3实践一些问题清单

时间:2023-03-20 19:25:11 科技观察

本文转载自微信公众号《微信大学前端技术》,作者黄勤。转载本文请联系微一大学前端技术公众号。前言,秦胖第三篇来袭!最近在计划中列了一个vue3的清单。关于vue3,虽然很久以前看过,只是写了几个小demo,简单了解一下,而且我们公司的主要技术栈也是vue。最近趁着这个学习的势头,赶紧申请了一个内部项目,想用vue3来实践一下。希望这篇总结能给一些小伙伴提供一些帮助。下面主要从两部分进行总结,一部分是可能混淆的点或者一些常见的问题,另一部分是实践过程中遇到的陷阱/注意点。关于vue3的一些问题1:使用Vue3时,必须要用CompositionAPI的形式来写页面吗?答案是不。需要注意的一点是:Vue3并没有放弃OptionsAPI,甚至会全面支持兼容Vue2语法的工作。CompositionAPI的后台主要是解决逻辑抽象和复用的问题,但不代表它已经成为Vue3的标准。所以,如何区分使用OptionsAPI还是CompositionAPI,主要看业务逻辑复杂的程序,比如一些简单的toast/button等基础组件,使用optionsAPI会更清晰简洁。对于比较复杂的业务逻辑,可以使用CompositionAPI,将单块逻辑拆分成一个模块,通过hook函数解决。2:在Vue3中混用OptionsAPI和CompositionAPI会影响性能吗?不会,其实从问题1可以很清楚的看出,不会对性能有什么影响。思维不要被optionapi限制,更要注意逻辑的衔接。问题三:关于setup中没有this的问题。vue官方文档是这样解释的:在setup()中,this不会是对活动实例的引用,因为setup()在其他组件选项解析之前被调用,所以setup()中的this与其他选项中的this行为完全不同.在将setup()与其他选项API一起使用时,这可能会导致混淆。这意味着,除了props之外,您将无法访问组件中声明的任何属性——本地状态、计算属性/方法。但是从源码实现中,你会发现组件实例其实是先创建的,而函数之所以不能访问this,是因为它在执行setup函数的时候没有将组件实例实例传给setup。它也不将this指向实例实例。所以执行顺序实际上是:组件实例是在setup函数执行之前创建的,但是执行setup时,组件还没有挂载,而且是晚于beforeCreatehook,早于createhook。4:reactiveVSref当你第一次阅读文档时,人们经常会比较这两者。总结一下:反应式API:可以将对象数据变成响应式数据(相当于2.x中的Vue.observable()),CompositionAPI建议用户主动定义响应式数据,而不是内部黑盒处理ref:对于数组或者对象来说,本质是响应式的,读取值的时候就是ref.value。另外,注意toRefs:对于组合函数返回,在响应对象时使用toRefs,本质上帮助我们做了一层getter和setter处理,解构得到响应数据,也减轻了ref5的一些心理负担:Vue3responsive比Vue2性能更好吗?vue3出来的时候经常听到一些回答说vue3的性能比vue2好,但是真的是这样吗?在Vue3发布的那段时间(我也去1元的源码上课分析学习了很多:老黄YYDS),甚至群里的每个人都在讨论这个问题。首先在实现上:我们都知道vue2中的响应式主要是由于Object.defineProperty,它主要是劫持对象的属性,所以无法观察到对象属性的增删改查,而在vue中,它用Proxy实现,劫持的是整个对象,可以避免vue2留下的问题,但是也有一个明显的缺点就是兼容性不够强。但是和Vue2相比,需要知道的是,vue3的性能优势主要体现在初始化阶段。因为在Vue2中定位响应式对象的时候,会递归的把子对象变成响应式的。而Vue3其实是惰性执行:当真正访问到对象属性时,子对象的递归执行就变成响应式了。6:VueCompositionAPIVSReactHooksVue3的CompositionAPI在写法上和ReactHooks非常相似。每个人都忍不住将它们进行比较。关于这部分内容的PK,我们小伙伴已经总结过了。很全面,这里就不赘述了。传送门:VueCompositionAPI和ReactHooks对比:https://juejin.cn/post/6847902223918170126除了一些常见问题,更重要的是实践。对于新的项目,可以直接从vue3入手,但是更多的是对于已有的项目,从vue2升级到vue3的时候,肯定会踩很多坑。以下是您在实践中可能遇到的一些注意点和陷阱。报告以下警告:Informscriptsetup仍是一项实验性新功能,尚未作为官方功能发布。以后会不会有变化还不好说。[@vue/compiler-sfc]isstillanexperimentalproposal.Followitsstatusathttps://github.com/vuejs/rfcs/pull/227.[@vue/compiler-sfc]当使用实验特性时,建议将你的vue依赖项添加到精确的版本以避免中断编译]`er-sfc/defineProps`isalongelnecompilerma2:迁移vue3时,只保留一次,setup中保留$off等方法,只保留emit,如下:setup(props,{emit}){constrootRef=ref(null)constscroll=useScroll(rootRef,props,emit)return{rootRef,scroll}}//scrollVal.on('scroll',pos=>{emit('scroll',pos)})3inscroll.js:aboutcomputed:3.X将computed转为一个计算属性API,所以可以有多个computed,可以按照Vue.js2.x的使用方法//vue2.xcomputed:{loading(){return!this.list.length}},//vue3.xconstloading=computed(()=>!this.list.length)consttitleList=computed(()=>{returnprops.data.map((item)=>item.title)})4:关于watch:for当监听object是一个分隔字符串,你需要d在选项参数中指定深度:true//vue2.xwatch:{'data.distance':function(newVal,oldVal){if(newVal===constants.DISTANCE_ON){...}},},//vue3.xwatch(()=>this.data.distance,(newVal,oldVal)=>{if(newVal===constants.DISTANCE_ON){...}},{deep:true},)5:在Vue3中的组件没有过滤器选项。在迁移过程中,可以使用computed/methods代替//vue2.xfilters:{//justamethoddateFormat,},//vue3.xconstdateFormat=computed(()=>{//justamethoddateFormat,})可以使用多个two-同一个组件的方式绑定,可以使用自定义的v-model修饰符6:.sync在vue3.X中被移除,取而代之的是v-model并且不限于同一个组件中只有一个v-model//vue2.x//vue3.x总结踩坑还在继续,继续练,继续踩!参考资料vue文档:https://vue3js.cn/docs/zh/guide/composition-api-setup.html#%E4%BD%BF%E7%94%A8%E6%B8%B2%E6%9F%93%E5%87%BD%E6%95%B0VueCompositionAPI与ReactHooks对比:https://juejin.cn/post/6847902223918170126进入微医互联网医院在线诊疗平台,速问大夫,3分钟为你找出前三博士(https://wy.guahao.com/?channel=influence)

最新推荐
猜你喜欢