vue开发必须知道的九大秘法

开发
近年来,vue越来越火,使用它的人也越来越多。vue基本用法很容易上手,但是还有很多优化的写法你就不一定知道了。本文列举了一些vue常用的开发技巧。

[[345880]]

 require.context()
在实际开发中,绝大部分人都是以组件化的方式进行开发。随之而来就有了许多的组件需要引入。比如以下场景:

  1. import outExperInfo from "@/components/userInfo/outExperInfo"
  2. import baseUserInfo from "@/components/userInfo/baseUserInfo"
  3. import technicalExperInfo from "@/components/userInfo/technicalExperInfo"
  4. import skillExperInfo from "@/components/userInfo/skillExperInfo"
  5.  
  6. components:{ 
  7.     outExperInfo, 
  8.     baseUserInfo, 
  9.     technicalExperInfo, 
  10.     skillExperInfo 

这样写并没有错,但是仔细观察发现写了很多重复的代码,这个时候利用require.context()可以写成:

  1. const path = require('path'
  2. const files = require.context('@/components/userInfo'false, /\.vue$/) 
  3. const userComponents = {} 
  4. files.keys().forEach(key => { 
  5.  const name = path.basename(key'.vue'
  6.  userComponents[name] = files(key).default || files(key
  7. }) 
  8. components:userComponents 

这样不管需要引入多少组件,都可以使用这一个方法。

路由的按需加载
随着项目功能模块的增加,引入的文件数量剧增。如果不做任何处理,那么首屏加载会相当的缓慢,这个时候,路由按需加载就闪亮登场了。

  1. webpack< 2.4 时 
  2.  path:'/'
  3.  name:'home'
  4.  components:resolve=>require(['@/components/home'],resolve) 
  5.   
  6. webpack> 2.4 时 
  7.  path:'/'
  8.  name:'home'
  9.  components:()=>import('@/components/home'

import()方法是由es6提出的,动态加载返回一个Promise对象,then方法的参数是加载到的模块。类似于Node.js的require方法,主要import()方法是异步加载的。

动态组件
场景:如果项目中有tab切换的需求,那么就会涉及到组件动态加载,一般写法如下:

  1. <component v-bind:is="currentTab"></component> 

这样写也没有错,但是如果这样写的话,每次切换的时候,当前组件都会销毁并且重新加载下一个组件。会消耗大量的性能,所以就起到了作用。

  1. <keep-alive> 
  2.  <component v-bind:is="currentTab"></component> 
  3. </keep-alive> 

有的小伙伴会说,这样切换虽然不消耗性能了,但是切换效果没有动画效果了,别着急,这时可以利用内置的。

  1. <transition> 
  2. <keep-alive> 
  3.  <component v-bind:is="currentTab"></component> 
  4. </keep-alive> 
  5. </transition> 

components和vue.component
前者是局部注册组件,用法如下:

  1. export default
  2.  components:{home} 

后者是全局注册组件,主要针对一些全局使用的组件,用法如下:

  1. Vue.component('home',home) 

Vue.nextTick
Vue.nextTick()方法在下次DOM更新循环结束之后执行延迟回调,因此可以页面更新加载完毕之后再执行回调函数。下面介绍几个常用场景:

场景一

  1. <template> 
  2.     <div> 
  3.         <div ref = "ref"/> 
  4.     </div> 
  5. </template> 
  6. <script> 
  7. export default { 
  8.     created(){ 
  9.         console.log(this.$refs.ref) 
  10.         //undefined 
  11.     }) 
  12. </script> 

因为这个时候created阶段dom并未完全渲染完成,所以获取值为undefined,我们对其改造一下:

  1. <template> 
  2.     <div> 
  3.         <div ref = "ref"/> 
  4.     </div> 
  5. </template> 
  6. <script> 
  7. export default { 
  8.     created(){ 
  9.         Vue.nextTick(()=>{ 
  10.             console.log(this.$refs.ref) 
  11.         }) 
  12.         //<div></div> 
  13.          
  14.     }) 
  15. </script> 

这样就可以获取到dom了。

场景二

  1. <template> 
  2.     <div> 
  3.         <div v-if="visible" ref = "ref"/> 
  4.     </div> 
  5. </template> 
  6. <script> 
  7. export default { 
  8.     data() { 
  9.         return { 
  10.           visible: false 
  11.         }; 
  12.     }, 
  13.     showRef() { 
  14.         this.visible = true
  15.         console.log(this.$refs.ref); 
  16.         //undefined 
  17.     }, 
  18. </script> 

因为这个时候虽然visible的值为true,但是页面dom并没有更新完成,所以获取值为undefined,我们对其改造一下:

  1. <template> 
  2.     <div> 
  3.         <div v-if="visible" ref = "ref"/> 
  4.     </div> 
  5. </template> 
  6. <script> 
  7. export default { 
  8.     data() { 
  9.         return { 
  10.           visible: false 
  11.         }; 
  12.     }, 
  13.     showRef() { 
  14.         this.visible = true
  15.         Vue.nextTick(()=>{ 
  16.             console.log(this.$refs.ref) 
  17.         }) 
  18.         //<div></div> 
  19.     }, 
  20. </script> 

这样就可以获取到dom了。

Vue.directive
场景:官方给我们提供了很多指令,但是我们如果想将文字变成指定的颜色定义成指令使用,这个时候就需要用到Vue.directive,示例如下:

  1. // 全局定义 
  2. Vue.directive("change-color",function(el,binding,vnode){ 
  3.  el.style["color"]= binding.value; 
  4. }) 
  5.   
  6. // 使用 
  7. <template> 
  8.     <div v-change-color>{{message}} 
  9.     </div> 
  10. </template> 
  11. <script> 
  12.  export default
  13.      data(){ 
  14.       return
  15.       color:'green' 
  16.       } 
  17.      } 
  18.  } 
  19. </script> 

Vue.set()
当在项目中直接设置数组的某一项的值,或者直接设置对象的某个属性值,这个时候,你会发现页面并没有更新。这是因为Object.defineprototype()限制,监听不到变化,具体的可以查看我的另一篇文章:

vue对象数组数据变化,页面不渲染

事件修饰符

  • .stop:阻止冒泡
  • .prevent:阻止默认行为
  • .self:仅绑定元素自身触发
  • .once: 2.1.4 新增,只触发一次
  • passive: 2.3.0 新增,滚动事件的默认行为 (即滚动行为) 将会立即触发,不能和.prevent 一起使用
  • .sync 修饰符

从 2.3.0 起vue重新引入了 .sync 修饰符,但是这次它只是作为一个编译时的语法糖存在。它会被扩展为一个自动更新父组件属性的 v-on 监听器。示例代码如下:

  1. <comp :foo.sync="bar"></comp> 

会被扩展为:

  1. <comp :foo="bar" @update:foo="val => bar = val"></comp> 

当子组件需要更新 foo 的值时,它需要显式地触发一个更新事件:

  1. this.$emit('update:foo', newValue) 

长列表性能优化(数据冻结)
众所周知,vue会通过object.defineProperty对数据进行劫持,进而实现页面实时相应数据的变化,然而我们有些时候,需要的仅仅就是纯粹的展示数据,因为数据不会有任何改变,我们就不需要vue来劫持我们的数据。在数据量很大的情况下,这可以很明显的减少加载时间。

那么如何实现禁止vue劫持我们的数据尼?可以通过object.freeze方法来冻结数据,冻结之后数据也就不能再修改了。示例如下:

  1. let longList = [ 
  2.     {name:'monkeysoft'}, 
  3.     ... 
  4. this.longList = Object.freeze(longList) 

 

责任编辑:姜华 来源: 猴哥说前端
相关推荐

2017-10-17 15:18:58

综合布线网络

2018-04-08 10:08:43

开发人员工具

2023-12-21 14:43:30

Python字典

2010-04-12 14:58:56

Meego开发

2021-01-21 22:07:15

Web开发人工智能

2021-01-15 12:30:07

Vue技巧前端

2017-04-17 21:33:01

前端开发javascript严格模式

2012-06-27 09:36:37

软件开发软件开发

2015-04-15 10:50:06

综合布线

2021-07-29 08:13:05

高并发秒杀商品秒杀系统

2017-09-25 16:22:04

App

2014-09-01 09:53:50

Android框架

2020-07-09 07:34:40

开发Web工具

2021-01-29 10:07:31

大数据大数据技术

2021-02-05 11:21:54

大数据大数据技术

2020-02-28 14:05:00

Linuxshell命令

2017-12-07 15:47:25

2012-09-29 09:22:24

.NETGC内存分配

2012-09-29 10:29:56

.Net内存分配继承

2020-12-29 09:50:23

大数据大数据技术
点赞
收藏

51CTO技术栈公众号