为什么vue更改特定数组成员而不更新dom

2023-11-26

我想知道为什么我更改了数组的特定项目而页面没有更新。我知道 vue.js 的文档指出:

由于 JavaScript 的限制,Vue 无法检测到数组的以下更改:

当您直接使用索引设置项目时,例如vm.items[indexOfItem] = newValue.

它说我们应该这样做,但我不知道为什么。我发现了一个类似的问题(Vue计算问题-什么时候再次计算) 关于那个。

这是上面问题中的一些代码:

// works well

data() {
  return {
    cart: {
      item: {
        nums: 10,
        price: 10,
      },
    },
  }
},
computed: {
  total() {
    return this.cart.item.nums * this.cart.item.price
  },
},
methods: {
  set() {
    //why it worked.
    this.cart.item = {
      nums: 5,
      price: 5,
    }
  },
},

// oops! not working!

data() {
  return {
    cart: [
      {
        nums: 10,
        price: 10,
      },
    ],
  }
},
computed: {
  total() {
    return this.cart[0].nums * this.cart[0].price
  },
},
methods: {
  set() {
    this.cart[0] = {
      nums: 5,
      price: 5,
    }
  },
},

我对问题的答案感到困惑:

如果出现以下情况,将重新计算总计this.cart被标记为已更改,this.cart[0]被标记为已更改或者如果this.cart[0].nums or this.cart[0].price被改变了。问题是您正在替换中的对象this.cart[0]。这意味着this.cart[0].price并且 nums 不会改变,因为它们仍然指向旧对象。

如果我已经替换了对象this.cart[0], why this.cart[0]没有标记为已更改?为什么this.cart[0].price and nums仍然指向旧对象?我已经改变了 this.cart[0]!正确的?

为什么在第一种情况下效果很好?也替换对象。这两种场景有什么区别?


Vue 对此非常明确。这是 JavaScript 的限制。 JavaScript 不支持检测数组元素何时更改,仅当数组因添加或删除元素而更改大小时才支持检测。因此更换元件是不可检测的。

Vue 在幕后所做的是设置机制来监视对象何时发生变化,这是 JavaScript 的事情does支持。因此,作为对象的数组元素是 Vue 可以检测到变化的东西。由于 Vue 无法检测到正在替换的数组元素,因此它不知道停止查看旧对象并开始查看新对象。

答案也是有据可查的:如果你想更新数组中的一个项目,那么使用Vue.set()。这使得 Vue 知道数组元素正在发生变化,因此它知道停止查看旧对象并开始查看新对象。

因此,解决方案看起来像这样:

Vue.set(this.cart, 0, {nums: 5, price: 5});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么vue更改特定数组成员而不更新dom 的相关文章

随机推荐

  • 将 python 中的嵌套列表中的每个元素从 string 转换为 int [重复]

    这个问题在这里已经有答案了 我有带有嵌套列表的 python 数据 其中一部分如下所示 data 214 205 0 14 710 1813494849 0 214 204 0 30 710 1813494856 0 214 204 0 3
  • 如何从 ast.FunctionDef 节点创建函数对象?

    我试图了解 python 代码的执行过程 假设源有一个函数定义 使用ast parse 我将其解析为一个 ast 其中将包含一个实例FunctionDef节点类 该节点实例不是可调用的 并且与函数对象不同 如何从这个 ast 创建函数对象及
  • Linq 异常:只能从 linq to 实体调用函数

    我有一个StudentReceipts存储的表ReceiptNo as string 001 002 003 099 我想要获取最后一张收据的详细信息 以便增加下一笔交易的收据编号 这是我尝试过的 var lastGeneratedRecD
  • 将html表导出到Excel javascript函数特殊字符已更改

    我有以下将 html 导出到 Excel 的函数 function generateexcel tableid var table document getElementById tableid var html table outerHT
  • 删除 Github 中的自定义域

    我想从 Github 中删除自定义域 请提供任何帮助 其实我想得到https myaseen208 github io DialelAnalysisR 而不是http www myaseen208 com DialelAnalysisR 如
  • 亿级记录批量插入

    将 2 37 亿条记录插入具有规则 用于跨子表分配数据 的表中的最快方法是什么 我曾经尝试过或考虑过 插入语句 事务性插入 BEGIN and COMMIT The COPY FROM命令 http pgbulkload projects
  • HTML5 CANVAS 绘制图像

    这是我的问题 我有点不明白下面函数中的 sx 和 sy 是什么意思 context drawImage 图像 sx sy sw sh dx dy dw dh 我真正的意思是 如果我们改变 sx 和 sy 的值 并将 dx 和 dy 设置为固
  • 从 HttpServletRequest 对象获取发布的 XML

    我有一个接收 HttpServletRequest 的过滤器 该请求是一个 POST 其中包含一个我需要读入过滤器方法的 xml 从 HttpServletRequest 对象获取发布的 xml 的最佳方法是什么 这取决于客户如何发送它 如
  • 尽管元组是不可变的,但它们在交互模式下存储在不同的地址中。为什么?

    t 1 2 3 t1 1 2 3 print id t print id t1 上面几行代码在Python中的脚本模式下给出了相同的地址 但在交互模式下它输出了不同的地址 谁能解释一下原因吗 当编译脚本时 编译器可以搜索所有等效的元组并生成
  • Vue.js 如何在 v-for 循环中使用单选按钮

    我正在尝试使用单选按钮 以便用户可以选择其中一张照片作为他们的个人资料照片 ul li div div div photo id p imgId div div div li ul
  • 如何在 R 中同时按两列对行进行排序?

    以下是根据 v2 列进行排名的代码 x lt data frame v1 c 2 1 1 2 v2 c 1 1 3 2 x rank1 lt rank x v2 ties method first 但我真的想根据 v2 和 然后 v1 进行
  • SQL 中的分层标记

    我有一个 PHP Web 应用程序 它使用 MySQL 数据库进行对象标记 其中我使用了被接受为答案的标记结构这个问题 我想实现一个标签层次结构 其中每个标签都可以有一个唯一的父标签 然后 搜索父标签 T 将匹配 T 的所有后代 即 T 父
  • Roslyn 分析器规则不会使构建失败

    继从this来自 MS 的教程 我为 Roslyn 创建了一个分析器 根据页面 您可以将规则标记为DiagnosticSeverity Error 这将导致构建中断 在声明规则字段的行中 您还可以将要生成的诊断的严重性更新为错误而不是警告
  • 如何从pom.xml获取属性值?

    我在 pom xml 中添加了一个节点
  • 将 2D javascript 数组导出到 Excel 工作表

    我知道 这里有数百个关于这个主题的问题 但经过一天的搜索 我仍然找不到满意的答案 我有一个 2D javascript 数组 我想将其下载为 Excel 工作表 这是我迄今为止得到的代码的一个小提琴 https jsfiddle net 3
  • ThreeJS 3D 对象的 2D 边界框

    我需要找出我的 3D 对象使用的屏幕区域 我尝试用谷歌搜索答案 但没有成功 功能geometry computeBoundingBox 仅返回 3D 边界框 我怎样才能将其转换为二维边界框 您只需将所有顶点转换为屏幕空间并根据它们创建 2D
  • SwiftUI 全屏 UIImagePickerController(相机)

    我提出一个UIImagePickerController在我的应用程序中 通过在 a 中呈现逻辑sheet修饰符 简而言之 以下三种类型处理显示和消除实例UIImagePickerController里面的一个UIViewControlle
  • Err.Raise() 忽略自定义描述和源

    我有一个带有 Let 函数的类模块 该函数会引发自定义错误 示例如下所示 Private pValue As Double Public Property Let Value v As Double If v lt 0 Then Err R
  • MySQL在group by中选择最大记录

    我正在尝试在包含约 500 000 条记录和约 50 或 60 列的表中创建一个查询 我需要的是将这些记录整理成组并选择每个组中的最大记录 为了简化问题我有一个表格如下 id external id group id mypath 1 10
  • 为什么vue更改特定数组成员而不更新dom

    我想知道为什么我更改了数组的特定项目而页面没有更新 我知道 vue js 的文档指出 由于 JavaScript 的限制 Vue 无法检测到数组的以下更改 当您直接使用索引设置项目时 例如vm items indexOfItem newVa