iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >Vue使用技巧有哪些
  • 256
分享到

Vue使用技巧有哪些

2024-04-02 19:04:59 256人浏览 安东尼
摘要

小编给大家分享一下Vue使用技巧有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!数据不响应,可能是用法有问题前几天有朋友给我

小编给大家分享一下Vue使用技巧有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

数据不响应,可能是用法有问题

前几天有朋友给我发了一段代码,然后说Vue有bug,他明明写的没问题,为啥数据就不响应呢,一定是Vue的bug?我感觉他比尤雨溪要牛逼,高攀不起,就没有理他了。但是确实有时候我们在开发时候会遇到数据不响应的情况,那怎么办呢?比如下面这段代码:

<template>    <div>      <div>        <span>用户名: {{ userInfo.name }}</span>        <span>用户性别: {{ userInfo.sex }}</span>        <span v-if="userInfo.officialAccount">          公众号: {{ userInfo.officialAccount }}        </span>      </div>      <button @click="handleAddOfficialAccount">添加公众号</button>    </div>  </template>  <script>  export default {    data() {      return {        userInfo: {          name: '子君',          sex: '男'        }      }    },    methods: {      // 在这里添加用户的公众号      handleAddOfficialAccount() {        this.userInfo.officialAccount = '前端有的玩'      }    }  }  </script>

在上面的代码中,我们希望给用户信息里面添加公众号属性,但是通过this.userInfo.officialAccount = '前端有的玩' 添加之后,并没有生效,这是为什么呢?

这是因为在Vue内部,数据响应是通过使用Object.definePrototype监听对象的每一个键的getter,setter方法来实现的,但通过这种方法只能监听到已有属性,新增的属性是无法监听到的,但我就是想监听,小编你说咋办吧。下面小编提供了四种方式,如果有更多方式,欢迎下方评论区告诉我。

1. 将本来要新增的属性提前在data中定义好

比如上面的公众号,我可以提前在userInfo里面定义好,这样就不是新增属性了,就像下面这样

data() {      return {        userInfo: {          name: '子君',          sex: '男',          // 我先提前定义好          officialAccount: ''        }      }    }

2. 直接替换掉userInfo

虽然无法给userInfo里面添加新的属性,但是因为userInfo已经定义好了,所以我直接修改userInfo的值不就可以了么,所以也可以像下面这样写

this.userInfo = {    // 将原来的userInfo 通过扩展运算法复制到新的对象里面    ...this.userInfo,    // 添加新属性    officialAccount: '前端有的玩'  }

3. 使用Vue.set

其实上面两种方法都有点取巧的嫌疑,其实对于新增属性,Vue官方专门提供了一个新的方法Vue.set用来解决新增属性无法触发数据响应。

Vue.set 方法定义

  Vue.set( target, propertyName, value )

上面的代码使用Vue.set可以修改为

import Vue from 'vue'  // 在这里添加用户的公众号  handleAddOfficialAccount() {    Vue.set(this.userInfo,'officialAccount', '前端有的玩')  }

但是每次要用到set方法的时候,还要把Vue引入进来,好麻烦,所以为了简便起见,Vue又将set方法挂载到了Vue的原型链上了,即Vue.prototype.$set = Vue.set,所以在Vue组件内部可以直接使用this.$set代替Vue.set

this.$set(this.userInfo,'officialAccount', '前端有的玩')

小编发现有许多同学不知道什么时候应该用Vue.set,其实只有当你要赋值的属性还没有定义的时候需要使用Vue,set,其他时候一般不会需要使用。

4. 使用$forceUpdate

我觉得$forceUpdate的存在,让许多前端开发者不会再去注意数据双向绑定的原理,因为不论什么时候,反正我修改了data之后,调用一下$forceUpdate就会让Vue组件重新渲染,bug是不会存在的。但是实际上这个方法并不建议使用,因为它会引起许多不必要的性能消耗。

针对数组的特定方式

其实不仅仅是对象,数组也存在数据修改之后不响应的情况,比如下面这段代码

<template>    <div>      <ul>        <li v-for="item in list" :key="item">          {{ item }}        </li>      </ul>      <button @click="handleChangeName">修改名称</button>    </div>  </template>  <script>  export default {    data() {      return {        list: ['张三', '李四']      }    },    methods: {      // 修改用户名称      handleChangeName() {        this.list[0] = '王五'      }    }  }  </script>

上面的代码希望将张三的名字修改为王五,实际上这个修改并不能生效,这是因为Vue不能检测到以下变动的数组:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 当你利用索引直接设置一个项时,例如: this.list[index] = newValue

  3. 修改数组的length属性,例如: this.list.length = 0

所以在上例中通过this.list[0] = '王五' 是无法触发数据响应的,那应该怎么办呢?像上面提到的Vue.set和$forceUpdate都可以解决这个问题,比如Vue.set可以这样写

Vue.set(this.list,0,'王五')  复制代码

除了那些方法之外,Vue还针对数组提供了变异方法

在操作数组的时候,我们一般会用到数据提供的许多方法,比如push,pop,splice等等,在Vue中调用数组上面提供的这些方法修改数组的值是可以触发数据响应的,比如上面的代码改为以下代码即可触发数据响应

this.list.splice(0,1,'王五')

实际上,如果Vue仅仅依赖getter与setter,是无法做到在数组调用push,pop等方法时候触发数据响应的,因此Vue实际上是通过劫持这些方法,对这些方法进行包装变异来实现的。

Vue对数组的以下方法进行的包装变异:

  • push

  • pop

  • shift

  • unshift

  • splice

  • sort

  • reverse

所以在操作数组的时候,调用上面这些方法是可以保证数据可以正常响应,下面是Vue源码中包装数组方法的代码:

var original = arrayProto[method];    def(arrayMethods, method, function mutator () {      // 将 arguments 转换为数组      var args = [], len = arguments.length;      while ( len-- ) args[ len ] = arguments[ len ];      var result = original.apply(this, args);      // 这儿的用法同dependArray(value),就是为了取得dep      var ob = this.__ob__;      var inserted;      switch (method) {        case 'push':        case 'unshift':          inserted = args;          break        case 'splice':          inserted = args.slice(2);          break      }      // 如果有新的数据插入,则插入的数据也要进行一个响应式      if (inserted) { ob.observeArray(inserted); }     // 通知依赖进行更新      ob.dep.notify();      return result    });

文本格式化,filter更简单

使用filter 简化逻辑

我想把时间戳显示成yyyy-MM-DD HH:mm:ss的格式怎么办?是需要在代码中先将日期格式化之后,再渲染到模板吗?就像下面这样

<template>    <div>      {{ dateStr }}      <ul>        <li v-for="(item, index) in getList" :key="index">          {{ item.date }}        </li>      </ul>    </div>  </template>  <script>  import { fORMat } from '@/utils/date'  export default {    data() {      return {        date: Date.now(),        list: [          {            date: Date.now()          }        ]      }    },    computed: {      dateStr() {        return format(this.date, 'yyyy-MM-DD HH:mm:ss')      },      getList() {        return this.list.map(item => {          return {            ...item,            date: format(item.date, 'yyyy-MM-DD HH:mm:ss')          }        })      }    }  }  </script>

像上面的写法,针对每一个日期字段都需要调用format,然后通过计算属性进行转换?这时候可以考虑使用Vue提供的filter去简化

<template>    <div>      <!--使用过滤器-->      {{ dateStr | formatDate }}      <ul>        <li v-for="(item, index) in list" :key="index">          <!--在v-for中使用过滤器-->          {{ item.date | formatDate }}        </li>      </ul>    </div>  </template>  <script>  import { format } from '@/utils/date'  export default {    filters: {      formatDate(value) {        return format(value, 'yyyy-MM-DD HH:mm:ss')      }    },    data() {      return {        date: Date.now(),        list: [          {            date: Date.now()          }        ]      }    }  }  </script>

通过上面的修改是不是就简单多了

注册全局filter

有些过滤器使用的很频繁,比如上面提到的日期过滤器,在很多地方都要使用,这时候如果在每一个要用到的组件里面都去定义一遍,就显得有些多余了,这时候就可以考虑Vue.filter注册全局过滤器

对于全局过滤器,一般建议在项目里面添加filters目录,然后在filters目录里面添加

// filters\index.js  import Vue from 'vue'  import { format } from '@/utils/date'  Vue.filter('formatDate', value => {    return format(value, 'yyyy-MM-DD HH:mm:ss')  })

然后将filters里面的文件引入到main.js里面,这时候就可以在组件里面直接用了,比如将前面的代码可以修改为

<template>    <div>      <!--使用过滤器-->      {{ dateStr | formatDate }}      <ul>        <li v-for="(item, index) in list" :key="index">          <!--在v-for中使用过滤器-->          {{ item.date | formatDate }}        </li>      </ul>    </div>  </template>  <script>  export default {    data() {      return {        date: Date.now(),        list: [          {            date: Date.now()          }        ]      }    }  }  </script>

是不是更简单了

开发了插件库,来安装一下

在使用一些UI框架的时候,经常需要使用Vue.use来安装, 比如使用element-ui时候,经常会这样写:

import Vue from 'vue';  import ElementUI from 'element-ui';  import 'element-ui/lib/theme-chalk/index.CSS';  Vue.use(ElementUI,{size: 'small'});

使用了Vue.use之后,element-ui就可以直接在组件里面使用了,好神奇哦(呸,娘炮)。接下来我们实现一个简化版的element来看如何去安装。

了解Vue.use的用法

Vue.use是一个全局的方法,它需要在你调用 new Vue() 启动应用之前完成,Vue.use的参数如下

 Vue.use(plugin, options)

模拟element-ui的安装逻辑

想一下,使用Vue.use(ElementUI,{size: 'small'}) 之后我们可以用到哪些element-ui提供的东西

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 可以直接在组件里面用element-ui的组件,不需要再import

  3. 可以直接使用v-loading指令

  4. 通过this.$loading在组件里面显示loading

  5. 其他... 

// 这个是一个按钮组件  import Button from '@/components/button'  // loading 指令  import loadingDirective from '@/components/loading/directive'  // loading 方法  import loadingMethod from '@/components/loading'  export default {        install(Vue, options) {      console.log(options)      // 将组件通过Vue.components 进行注册      Vue.components(Button.name, Button)      // 注册全局指令      Vue.directive('loading', loadingDirective)      // 将loadingMethod 挂载到 Vue原型链上面,方便调用      Vue.prototype.$loading = loadingMethod    }  }

通过上面的代码,已经实现了一个丐版的element-ui插件,这时候就可以在main.js里面通过Vue.use进行插件安装了。大家可能会有疑问,为什么我要用这种写法,不用这种写法我照样可以实现功能啊。小编认为这种写法有两个优势

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 标准化,通过提供一种统一的开发模式,无论对插件开发者还是使用者来说,都有一个规范去遵循。

  3. 插件缓存,Vue.use 在安装插件的时候,会对插件进行缓存,即一个插件如果安装多次,实际上只会在第一次安装时生效。

插件的应用场景

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 添加全局方法或者 property。

  3. 添加全局资源:指令/过滤器/过渡等。

  4. 通过全局混入来添加一些组件选项。

  5. 添加 Vue 实例方法,通过把它们添加到 Vue.prototype 上实现。

  6. 一个库,提供自己的 api,同时提供上面提到的一个或多个功能。如element-ui

提高Vue渲染性能,了解一下Object.freeze

当一个 Vue 实例被创建时,它将 data 对象中的所有的 property 加入到 Vue 的响应式系统中。当这些 property 的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。但是这个过程实际上是比较消耗性能的,所以对于一些有大量数据但只是展示的界面来说,并不需要将property加入到响应式系统中,这样可以提高渲染性能,怎么做呢,你需要了解一下Object.freeze。

在Vue官网中,有这样一段话:这里唯一的例外是使用 Object.freeze(),这会阻止修改现有的 property,也意味着响应系统无法再_追踪_变化。这段话的意思是,如果我们的数据使用了Object.freeze,就可以让数据脱离响应式系统,那么该如何做呢?

比如下面这个表格,因为只是渲染数据,这时候我们就可以通过Object.freeze来优化性能

<template>    <el-table :data="tableData" >      <el-table-column prop="date" label="日期" width="180" />      <el-table-column prop="name" label="姓名" width="180" />      <el-table-column prop="address" label="地址" />    </el-table>  </template>  <script>  export default {    data() {      const data = Array(1000)        .fill(1)        .map((item, index) => {          return {            date: '2020-07-11',            name: `子君${index}`,            address: '大西安'          }        })      return {        // 在这里我们用了Object.freeze        tableData: Object.freeze(data)      }    }  }  </script>

有的同学可能会有疑问,如果我这个表格的数据是滚动加载的,你这样写我不就没法再给tableData添加数据了吗?是,确实没办法去添加数据了,但还是有办法解决的,比如像下面这样

export default {    data() {      return {        tableData: []      }    },    created() {      setInterval(() => {        const data = Array(1000)          .fill(1)          .map((item, index) => {            // 虽然不能冻结整个数组,但是可以冻结每一项数据            return Object.freeze({              date: '2020-07-11',              name: `子君${index}`,              address: '大西安'            })          })        thisthis.tableData = this.tableData.concat(data)      }, 2000)    }  }

以上是“Vue使用技巧有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网VUE频道!

--结束END--

本文标题: Vue使用技巧有哪些

本文链接: https://www.lsjlt.com/news/84704.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue使用技巧有哪些
    小编给大家分享一下Vue使用技巧有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!数据不响应,可能是用法有问题前几天有朋友给我...
    99+
    2024-04-02
  • Vue有哪些使用技巧
    这篇文章主要介绍了Vue有哪些使用技巧,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 将 prop 限制为类型列表在 prop 定义中使用 validator 选项,你可...
    99+
    2023-06-25
  • Vue使用的技巧有哪些
    这篇文章主要介绍“Vue使用的技巧有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue使用的技巧有哪些”文章能帮助大家解决问题。1、将一个 prop 限制在一个类型的列表中使用 prop 定义...
    99+
    2023-06-30
  • Vue的使用技巧有哪些
    本篇内容介绍了“Vue的使用技巧有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 将一个 prop 限制在一个类型的列表中使用 pr...
    99+
    2023-06-29
  • vue有哪些实用技巧
    本篇内容主要讲解“vue有哪些实用技巧”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue有哪些实用技巧”吧!监听组件的生命周期比如有父组件 Parent 和子...
    99+
    2024-04-02
  • Vue开发技巧有哪些
    Vue开发技巧有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。路由参数解耦一般在组件内使用路由参数,大多数人会这样做:export&nbs...
    99+
    2024-04-02
  • Vue的小技巧有哪些
    这篇文章主要介绍“Vue的小技巧有哪些”,在日常操作中,相信很多人在Vue的小技巧有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue的小技巧有哪些”的疑惑有所帮助!接...
    99+
    2024-04-02
  • vue过渡效果使用的技巧有哪些
    本篇内容介绍了“vue过渡效果使用的技巧有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!概念在进入/离开的过渡中, 会有6个class的...
    99+
    2023-07-04
  • CSS使用技巧有哪些
    本篇内容主要讲解“CSS使用技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS使用技巧有哪些”吧!1、使用 :not() 为导航添加/取消边框很多人会这样给导航添加边框,然后给最后一...
    99+
    2023-06-04
  • LoadRunner使用技巧有哪些
    这篇文章主要讲解了“LoadRunner使用技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“LoadRunner使用技巧有哪些”吧!一、性能指标在做性能测试之前,简单说下性能指标:响...
    99+
    2023-06-05
  • Bash使用技巧有哪些
    本篇内容主要讲解“Bash使用技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Bash使用技巧有哪些”吧!要是你整天使用计算机,如果能找到需要重复执行的命令并记下它们以便以后轻松使用那就...
    99+
    2023-06-05
  • 使用CSS技巧有哪些
    这篇文章给大家分享的是有关使用CSS技巧有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、简单的方法调整博客图片大小 代码如下:content img { height:auto; width:500px;...
    99+
    2023-06-08
  • Linux使用技巧有哪些
    这篇文章主要为大家展示了“Linux使用技巧有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux使用技巧有哪些”这篇文章吧。1.快速跳转命令 - z要是每次都要进入一个目录很深的文件夹...
    99+
    2023-06-15
  • vsFTPd使用技巧有哪些
    这篇文章将为大家详细讲解有关vsFTPd使用技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、匿名服务器的连接(独立的服务器)在/etc/vsftpd/vsftpd.conf配置文件中添加如下几...
    99+
    2023-06-16
  • win7有哪些使用技巧
    今天小编给大家分享一下win7有哪些使用技巧的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。win7上手使用技巧一、鼠标的基本...
    99+
    2023-07-01
  • Excel使用技巧有哪些
    这篇文章给大家分享的是有关Excel使用技巧有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.一键设置下拉菜单下拉菜单用得好的话,效率秒提升!那么怎么设置下拉菜单呢?先选中...
    99+
    2024-04-02
  • vim使用技巧有哪些
    这篇文章将为大家详细讲解有关vim使用技巧有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、VIM常用操作1、插入命令a在光标所在字符后插入A在光标所在行尾插入i在光标所在字符前插入I...
    99+
    2023-06-05
  • ubantu使用技巧有哪些
    这篇文章给大家分享的是有关ubantu使用技巧有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。打开超级用户权限的运行程序对话框你也许已经知道用Alt+F2来打开”运行程序”对话框,然后可以输入任何命令行运行之...
    99+
    2023-06-16
  • ADO.NET使用技巧有哪些
    本篇内容主要讲解“ADO.NET使用技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ADO.NET使用技巧有哪些”吧!使用OleDbCommand的***实践 不同.NET框架数据提供程...
    99+
    2023-06-17
  • Laravel使用技巧有哪些
    今天小编给大家分享一下Laravel使用技巧有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.胖模型,瘦控制器如果我们...
    99+
    2023-07-04
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作