vuejs2 - 为什么数据:Variable 对 Vue 中的 computed: property 中的 Variable 是反应性的
问题描述
我可能做错了什么,但我不明白以下结果。我从服务器获取产品数组(按名称排序)。现在我需要价格滑块的最低和最高价格,以便我使用计算属性。之后,完整的产品数组按价格排序,我不明白为什么?
data:
products: []
...
methods: {
loadProducts() {
...
this.products = response.data.elements; //array is sorted correct by name
}
},
computed:
maxPriceCalc: function() {
var products = this.products;
if(productss.length > 0) {
var maxPrice = productss.sort(compare); //at this point - this.products is sorted by price too
return maxPrice[0].calculatedPrice.totalPrice;
}
function compare(a, b) {
if (a.calculatedPrice.totalPrice > b.calculatedPrice.totalPrice)
return -1;
if (a.calculatedPrice.totalPrice < b.calculatedPrice.totalPrice)
return 1;
return 0;
}
...
也许任何人都有一个想法来解决它。
感谢时间和帮助。
解决方案
这里有两个原因(与 Vue 无关 - 只是普通的旧 JavaScript):
- Array 是通过引用处理的类型,因此您的局部
products
变量指向相同的数组this.products
- Array.prototype.sort()对数组进行就地排序(不创建新数组)
简单的解决方案是使用扩展运算符创建一个新数组。而不是var products = this.products
,使用var products = [...this.products]
. 这将创建一个与原始数组具有相同元素的全新数组...
forEach
虽然您同时需要最小值和最大值,但如果使用 扫描源数组、同时计算两个值并返回一个像这样的简单对象,那么在不进行任何排序的情况下实现这个计算属性会好得多{ minPrice: xx, maxPrice: yy }
推荐阅读
- javascript - ReactJS - 在 ReactJS 中创建一个 Util 函数以重用代码
- java - 这个 SQLite 查询是否有 RealmDB 替代方案?
- c# - 如何在 Asp.net Datalist 中使用图像按钮并绑定数据库中的数据
- c# - HttpContext GetEndpoint 修改请求路径.net 5
- asp.net-mvc - Html.EditorFor(DateTime) 的最小和最大限制
- apache-zookeeper - zookeeper 分布式锁总是得到较少数量的节点
- reactjs - 我的 handleCallback 不会意识到我试图从子组件传递给父组件的道具数据
- javascript - JavaScript 在打印时下载 pdf 文件
- javascript - Vue.Js:b-form-input 和 b-form-checkbox 不显示在 b-table 组件中
- java - 没有 CA 的 Java 中的安全套接字