在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发。下面有一些我在日常开发的时候用到的小技巧

data 和 Object.freeze

每个Vue实例都会代理其data对象里所有的属性,这些被代理的数据是响应式的,在其数据改变时视图也会随之更新。

在每个vue组件中都有一个data对象,不要把所有数据都放在data中。只把需要做响应式的数据放在data对象中;原因是:如果一个数据存在于data中,数据会被劫持,vue会给数据添加一个getter(获取数据),一个setter(设置数据),性能不会高。

可以把一些不需要响应的数据直接放到实例上,而不是在data里

data(){
// 不需要做响应的数据
this.list=[...] return {
list2:[...]
}
}

Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象

对于一些不需要响应列表数据,也可以用 Object.freeze() 处理

data(){
return {
list: []
}
},
created () {
let listData = Object.freeze([
{ value: 1 },
{ value: 2 }
])
// 冻结 listData
this.list = listData; // 界面不会有响应
this.list[0].value = 100; // 下面两种做法,界面都会响应,只是冻结 listData 没有冻结 this.list
this.list = [
{ value: 100 },
{ value: 200 }
];
this.list = Object.freeze([
{ value: 100 },
{ value: 200 }
]);
}

优雅处理事件监听和移除

有时候我们会遇到这样的场景,需要自己去监听一些事件什么的,可能会像下面这个写,但是有时候可能因为mounted和destroyed不再一个位置啥的,导致忘记清除对事件监听。可以利用 hook 去监听钩子事件将它们写在一起

mounted() {
window.addEventListener('resize', this.func)
},
destroyed() {
window.removeEventListener('resize', this.func)
},
methods:{
func(){ }
}

更改后

mounted() {
window.addEventListener('resize', this.func)
this.$once("hook:beforeDestroy", ()=> {
window.removeEventListener('resize', this.func)
});
},
methods:{
func(){ }
}

.sync 修饰符

在有些情况下,我们可能需要对一个 prop 进行“双向绑定”。 不幸的是,真正的双向绑定会带来维护上的问题,因为子组件可以修改父组件,且在父组件和子组件都没有明显的改动来源。这也是为什么我们推荐以 update:myPropName 的模式触发事件取而代之。举个例子,在一个包含 show prop 的假设的组件中,我们可以用以下方法表达对其赋新值的意图:

this.$emit('update:show', newShow)

父组件可以监听那个事件并根据需要更新一个本地的数据

<dialog  v-bind:title="show"  v-on:update:show="show = $event"></dialog>

使用 .sync 简写

<dialog :title.sync="doc.title"></dialog>

属性事件传递

有时候需要对一些组件进行更高层次封装,例如有一个普通表格组件,需要实现能有行内编辑等一些功能时候,就需要对表格进行二次封装。像表格组件属性较多时,需要一个个去传递,非常不友好并且费时

<template>
<BaseTable v-bind="$props" v-on="$listeners"> <!-- ... --> </BaseTable>
</template> <script>
import BaseTable from "./BaseTable"; export default {
components: {
BaseTable
}
};
</script>

可以看到传递属性和事件的方便性,而不用一个个去传递,还有$attrs(props、class、style 除外的其他 attribute )可以使用

Watch的初始立即执行

当 watch 一个变量的时候,初始化时并不会执行,如下面的例子,你需要在created的时候手动调用一次。

created() {
this.search();
},
watch: {
searchText(){
this.search()
},
}

上面这样的做法可以使用,但很麻烦,我们可以添加immediate属性,这样初始化的时候就会自动触发(不用再写created去调用了),然后上面的代码就能简化为

watch: {
searchText: {
handler(){
this.search()
},
immediate: true
}
}

vue 使用中的小技巧 (一)的更多相关文章

  1. Vue 使用中的小技巧

    在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发.下面有一些我在日常开发的时候用到的小技巧,在下将不定期更新~ 1.多图表resize事件去中心化 ...

  2. Vue 使用中的小技巧(山东数漫江湖)

    在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发.下面有一些我在日常开发的时候用到的小技巧,在下将不定期更新~ 1. 多图表resize事件去中心 ...

  3. 关于Vue的一些小技巧

    前言 用Vue开发一个网页并不难,但是也经常会遇到一些问题,其实大部分的问题都在文档中有所提及,再不然我们通过谷歌也能成功搜索到问题的答案,为了帮助小伙伴们提前踩坑,在遇到问题的时候,心里大概有个谱知 ...

  4. 总结一下vue里一些小技巧

    官方里的我就不细说了,自个撸文档就成,下面是实践里常用的几个小技巧或者说是遇到的坑,若有错误望大家指正)1.当用a标签设置新窗口打开页面,设置url时,建议给href进行v-bind绑定,然后写相对路 ...

  5. Altium Designer 使用中的小技巧1

    在布线的过程中所学到的一点技巧:在没有画原理图的情况下,直接绘制PCB板,需要敷铜Ppolygon pour,但没有网络标号,就无法连上要连的网络,焊盘,怎么办呢?需要事先将需要连接在一起的元器件(焊 ...

  6. 整理一些css在使用中的小技巧(进行中)

    1. 消除li排列display:inline-block的间隙 ul{ font-size:; } ul li{ display:inline-block; }

  7. Mac 开发使用中的小技巧收集

    1. mac 下ssh连接到 linux 服务器管理,同putty,无需第三方 Mac 下打开终端,输入: ssh 登录用户名@ip地址 如: ssh root@142.138.1.89 如有询问是否 ...

  8. 在Android中使用am和input命令在实际使用中的注意事项以及小技巧

    在Android使用到am和进行一些操作是非常方便的,比如一个重复自动的操作,具体用来实现一些什么是看个人需求了,接下来说对于am和input的使用. 本文适用于已经大概去了解了am和input的朋友 ...

  9. vue小技巧之偷懒的文件路径——减少不必要的代码

    众所周知,我们写vue项目的时候都会创建很多个文件,尤其是一些中大型项目,会有很深的文件夹,当你去引入的时候,要写很长的路径比如我要引入一个css文件, 必须得 import  '../../../s ...

随机推荐

  1. pytest文档51-内置fixture之cache使用

    前言 pytest 运行完用例之后会生成一个 .pytest_cache 的缓存文件夹,用于记录用例的ids和上一次失败的用例. 方便我们在运行用例的时候加上--lf 和 --ff 参数,快速运行上一 ...

  2. 面试官:为什么MySQL的索引要使用B+树,而不是其它树?比如B树?

    InnoDB的一棵B+树可以存放多少行数据? 答案:约2千万 为什么是这么多? 因为这是可以算出来的,要搞清楚这个问题,先从InnoDB索引数据结构.数据组织方式说起. 计算机在存储数据的时候,有最小 ...

  3. 全宇宙首个.NET5+Vue.js前后端分离以及业务模块化快速开发框架【NetModular】发布~

    最近.Net圈子很热闹啊,我也来凑凑,今天中午耗时长达半小时,把NetModular升级到了.NET5,详情查看分支https://github.com/iamoldli/NetModular/tre ...

  4. localStorage.getItem得到的是[object Object] 的解决方案

    设计背景: 购物车要实现本地存储,避免刷新页面数据丢失 实现方案: 1,本地储存,进入页面获取本地数据,在进行数据操作 2,每操作一次数据就将数据传给后台进行保存,(操作数据多,用户量大对服务器造成压 ...

  5. Spring Boot学习笔记(一)——Eclipse安装STS插件

    一.简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配 ...

  6. 文件中pe到内存中pe

    前言 学pe的时候被困扰了很久,终于在某处给我找到了,打算打出来读一读代码 这边我们是从文件中的pe转到运行中的pe,然后再缩小存储到文件的pe 这边我们需要知道内存中对齐是0x1000,文件对齐是0 ...

  7. iOS 14 egret 游戏卡顿问题分析和部分解决办法

    现象 总体而言,iOS 14 渲染性能变差,可以从以下三个测试看出. 测试1:简单demo,使用egret引擎显示3000个图(都是同一个100*100 png 纹理),逐帧做旋转.(博客园视频播放可 ...

  8. 关于GIT配置公私钥

    问题:pull代码时显示 原因:公钥与私钥对不上,或者没有配置导致 解决: 1.生成私钥:TortoiseGIT → PuttyGen → Generate(点击后鼠标晃动会加速)→Save Priv ...

  9. 解放双手,不写SQL!一个开源mybatis神器

    什么是通用 Mapper? 它是一个可以方便的使用 Mybatis 进行单表的增删改查优秀开源产品.它使用拦截器来实现具体的执行 Sql,完全使用原生的 Mybatis 进行操作.在 Github 上 ...

  10. spring mvc 中获取HttpServletRequest ,HttpServletResponse

    spring中的bean最常用的 singleton 模式 如果要在springmvc Controller 中获取  HttpServletRequest ,HttpServletResponse ...