vue.js开发优化技巧(持续更新)

本文介绍了在Vue应用中如何重置数据、冻结对象提升性能、使用计算属性和解构注入参数、通过.sync操作符共享数据以及处理数据更新后视图未更新的情况,提供了实用的开发技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、使用this.$option.data()重置数据

export default {
    props: {
        P: Object
    },
    data () {
        return {
            A: {
                a: this.methodA
            },
            B: this.P
        };
    },
    methods: {
        resetData () { // 更新时调用
            Object.assign(this.$data, this.$options.data()); // 有问题!!!
        },
        methodA () {
            // do sth.
        },
        methodB () { // 通过用户操作调用
            this.A.a && this.A.a(); // this.A.a is undefined, this.B is undefined!!!
        }
    }
}


resetData () { // 更新时调用
		// 正常使用
		Object.assign(this.$data, this.$options.data())
		// 如果data中引用了props,methods等其他this里面的属性,需要用call方法绑定一下当前this
    Object.assign(this.$data, this.$options.data.call(this))
}
2、使用Object.freeze()冻结对象/数组,阻住vue将其变为响应式对象,提升性能(适用于不需要响应式的场景)
/**
* @description 查询检查项目详情
*/
async getItemDetils() {
  this.$toast.loading('加载中...')
  const { data: { resultCode, content } } = await getItemDetils(this.item.packageItemId)
  if (resultCode === 0) {
    this.$toast.clear()
    this.itemDetail = Object.freeze(content)
  }
},
3、计算属性使用解构方式注入参数
computed: {
        columns({ list, keyword }) {
				// const list = this.list
				// const keyword = this.keyword
            return keyword ? list.filter(i => i.mainPartName.includes(keyword)) : list
        }
}
4、使用this.$attrs获取多个props
// 父组件
<home title="这是标题" width="80" height="80" imgUrl="imgUrl"/>

// 子组件
mounted() {
  console.log(this.$attrs) //{title: "这是标题", width: "80", height: "80", imgUrl: "imgUrl"}
},
5、使用.sync操作符,不打破单向数据流让子组件修改父组件的数据
// 父组件
<home :title.sync="title" />
//编译时会被扩展为
<home :title="title"  @update:title="val => title = val"/>

// 子组件
// 所以子组件可以通过$emit 触发 update 方法改变
mounted(){
  this.$emit("update:title", '这是新的title')
}
6、数据更新后视图没有发生变化的处理方案
1this.$forceUpdate()

2this.$set()

3、修改key值,diff算法
// 数据更新update视图的时候会比较新旧节点是否为相同节点
function sameVnode(a, b) {
  return (
    a.key === b.key &&
    a.asyncFactory === b.asyncFactory &&
    ((a.tag === b.tag &&
      a.isComment === b.isComment &&
      isDef(a.data) === isDef(b.data) &&
      sameInputType(a, b)) ||
      (isTrue(a.isAsyncPlaceholder) && isUndef(b.asyncFactory.error)))
  )
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值