performance - 从 Vue 方法内部多次调用计算属性是否会影响性能?
问题描述
关于计算属性和性能,我在构建用 Vue 编写的代码时遇到了问题。我想使用计算属性——不违反 DRY 规则——但我担心它可能会影响性能。
我需要解决一个 UI 问题,它很大程度上与 div 高度有关。所以我通过访问 $refs 来获取高度值:
var divHeight = this.$refs.divRef.clientHeight;
然后我必须在我的组件方法中多次使用 divHeight 。
基本上我现在有三个选择。查看此代码段以了解我的意思: CodePen。
解决这个问题的最佳方法是什么?
解决方案
首先,我想提一下,无论您最终使用哪种方法,都不太可能产生显着的性能改进。如果性能是您最关心的问题,那么您应该分析您的网页以确定哪种方法最有效。大多数时候,我更喜欢代码的可读性/可维护性而不是性能。
1. 无计算属性,divHeight
在每个方法中单独声明。
methods: {
firstMethod() {
var divHeight = this.$refs.divRef.clientHeight;
...
},
secondMethod() {
var divHeight = this.$refs.divRef.clientHeight;
...
}
}
如果 div 的高度可以更改,则最好这样做,因此您确实希望每次调用方法时都获取正确的高度,以防高度发生更改。
2.divHeight
创建计算属性,无论如何将其声明为方法内的变量。
computed: {
divHeight() {
return this.$refs.divRef.clientHeight;
}
},
methods: {
firstMethod() {
var divHeight = this.divHeight;
...
},
secondMethod() {
var divHeight = this.divHeight;
...
}
}
divHeight
将只计算一次,即第一次访问该属性时。如果 div 的高度发生变化,则divHeight
不会重新计算。此解决方案不适合这种情况,因为计算属性通常在该属性依赖于该组件的其他可观察数据属性时使用(this.$refs.divRef.clientHeight
Vue 不可观察)。
3. 制作divHeight
计算属性,this.divHeight
在一个方法中多次使用。
computed: {
divHeight() {
return this.$refs.divRef.clientHeight;
}
},
methods: {
firstMethod() {
this.divHeight/this.divWidth = something;
this.divHeight... other operations.
},
secondMethod() {
this.divHeight/this.divWidth = something;
this.divHeight... other operations.
}
}
这与 #2 相同,除了您this.divHeight
在每种方法中多次访问。与#2相比,唯一的“改进”是避免访问属性,这可以忽略不计;但是如果你在一个方法中使用this.divHeight
了很多次,那么#2 最好避免this.
到处都有。
我建议这样做:
methods: {
divHeight() {
return this.$refs.divRef.clientHeight;
},
firstMethod() {
var divHeight = this.divHeight();
...
},
secondMethod() {
var divHeight = this.divHeight();
...
}
}
这与 #1 基本相同,只是它更短一些,因为您不必在this.$refs.divRef.clientHeight
任何地方输入。
推荐阅读
- wordpress - Wordpress 插件无法更新:无法创建目录
- mysql - 如何在 MySQL 查询中显示非零值
- vb.net - how to manage pass value set by dialog box in VB form application to its caller
- github - Github 页面仅适用于第一个存储库,不适用于新项目
- python - 使用 discord.py 在 Flask python 中向用户发送 DM
- python - 如何在 RMarkdown 中渲染 Python 绘图?
- swift - 从符合协议的通用交互器传递已发布的 var
- c - 用gdb调试的时候,有时候gdb显示的运行位置很奇怪?
- python - 如何使用此代码在 Python 中重复一个程序?
- android - 我的应用程序关闭后如何让警报管理器执行?