Skip to content

需要返回函数的计算属性 ​

本节目标:理解“需要返回函数的计算属性”的核心思路,并能把它用于实际开发或面试表达。 如果模板中的计算属性需要index作为参数来计算值,我们一般会传入一个index给返回函数的计算属性,但还有一个方法就是,直接计算所有数组元素的值,在模板中直接使用index取用。

在你的组件中,itemStyle(idx) 方法被多次调用来计算每个项目的样式。这种重复调用可能会影响性能,特别是在项目列表较长且每次滑动时都需要重新计算样式的情况下。为了优化这一部分,可以在渲染每个项目之前计算并存储所有项目的样式,这样就避免了重复计算的性能损耗。

一种实现方法是使用计算属性来生成一个包含所有项目样式的数组。这样,你可以直接从该数组中获取每个项目的样式,而不需要在模板中多次调用itemStyle(idx)。

以下是如何实现这个优化的代码示例:

1. 增加一个计算属性 ​

在你的组件的 computed 部分增加一个新的属性,例如 itemStyles,来预计算所有项目的样式:

javascript
computed: {
// 现有的计算属性保持不变

itemStyles() {
return this.gridGroupList.flat().map((item, idx) => {
const height = this.itemWidth / this.aspectRatio;
const rightMargin =
idx % this.columns === this.columns - 1 ? 0 : this.gap;
const topMargin = Math.floor(idx / this.columns) === 0 ? 0 : this.gap;

return {
width: `${this.itemWidth}px`,
height: `${height}px`,
marginRight: `${rightMargin}px`,
marginTop: `${topMargin}px`,
};
});
},
},

2. 修改模板使用预计算的样式 ​

在你的模板中,直接引用这个新的计算属性来获取每个项目的样式,而不是调用方法:

html
<swiper
:style="{ height: swiperHeight + 'px' }"
circular
:indicator-dots="false"
:autoplay="false"
@change="onSwiperChange"
>
<swiper-item v-for="(group, index) in gridGroupList" :key="index">
<view class="swiper-item-inner">
<view
v-for="(item, idx) in group"
:key="idx"
:style="itemStyles[idx]"
class="item"
@click="handleItemClick(idx, item)"
>
<view class="item-content">
<slot :item="item" :width="itemStyles[idx].width" :height="itemStyles[idx].height" />
</view>
</view>
</view>
</swiper-item>
</swiper>

这种方法可以减少重复的样式计算,提高渲染效率。记得在项目数据或相关依赖属性变化时,确保计算属性可以正确更新。这种优化尤其适用于渲染大量数据项的情况。

本站总访问 — 次