javascript - Vue.js。子组件中的变异道具不会触发警告。想知道为什么
问题描述
我注意到道具突变(Vue 2.6)有些奇怪。
应避免直接在子组件中更改 props,这会触发以下著名警告
“避免直接改变道具,因为值将被覆盖......”
所以如果在我的父组件中我有一个像
exemple: "Hello World"
我作为道具传递给子组件。如果在那个子组件中我做类似的事情
this.exemple = "Hello World!"
我收到警告。很公平。现在我注意到如果父级中的数据是一个像
exemple : {message : "Hello World"}
在孩子身上我会做类似的事情
this.exemple.message = "Hello World!"
这不会触发任何警告,而且父组件中的数据会更新
我想知道为什么。为什么 prop 突变在一种情况下会传播到父级,而在另一种情况下不会传播到父级?它可能与javascript如何存储这些变量有关吗?使用该技巧是一种好习惯吗?
解决方案
为什么 prop 突变在一种情况下会传播到父级,而在另一种情况下不会传播到父级?它可能与javascript如何存储这些变量有关吗?
是的。JavaScript引用变量(例如对象和数组)在您改变它们的属性/值时不会改变它们的引用。这意味着父级也可以访问更改的属性,因为它也可以访问引用。并且 Vue 只有在引用发生变化时才会给出 prop 突变警告。
警告:
this.prop = {}
无警告:
this.prop.id = 5
使用该技巧是一种好习惯吗?
不,这又违反了一种数据流方式,其中数据通过道具向下传递(到孩子)并通过事件向上传递(到父母)。
好的,但是为什么 Vue 不对这些更改发出警告呢?
考虑一个有 1000 个属性的对象或一个有 1000 个项目的数组。Vue 必须深入检查所有 1000 个更改,并且没有快速的方法可以做到这一点,因为每个项目都必须单独与旧值进行比较。这会对性能产生影响,并可能使许多应用程序无法使用。
以下是Vue 团队成员Bolerodan对该主题的评论:
一般来说你不应该那样做。这可能/可能会导致代码中出现意外错误。一般来说,你应该复制你的对象,修改它,然后向上发射到父级(正如你在上一段中提到的,我相信)。这是我采取的方法,也是自上而下、自上而下的普遍共识。
推荐阅读
- astropy - 如何将 SkyCoord 目录转换为 ra 和 dec 对数组
- r - 无论如何要改变R(geom_point)中ggplot中值的大小?
- javascript - 如何在不显示在网站上的情况下从 html 为 php 赋予特殊字符?
- java - 将 Spring Boot 与 MySQL 数据库一起使用的问题
- powerapps - 使用 CDS 中的实体过滤 PowerApps 中的库
- javascript - 我在设置 javascript cron 时遇到问题
- ruby-on-rails - 从 Rails 中的 ActiveRecord::AssociationRelation 获取不同的值
- database - 为什么保留重复记录时h2复合主键不起作用?
- django - 如何在 Django 中使用 TinyMCE 5?
- python - seaboarn散点图中的预定义点颜色