通过子进程改变 Vue prop 有多危险?

VeG*_*h5i 5 javascript prop mutation vue.js

Vue 允许改变 props,但不推荐。在文档(https://vuejs.org/guide/components/props.html#one-way-data-flow)中我发现

作为最佳实践,您应该避免此类突变 [通过子级改变嵌套 props],除非父级和子级在设计上紧密耦合。

对我来说,这听起来不是一个好的做法,但没关系。然而,在我发现的所有论坛帖子中,他们都说“永远不要这样做!”之类的话。并且父组件的重新渲染甚至可能会损坏数据(即Vue 2 - Mutating props vue-warn)。

如果由我决定,我会坚持建议,而不是争论这一点。然而,我工作的团队广泛使用 prop 突变。

目前为止还可以,但是我担心将来可能会出现问题。在未来的版本中,Vue 是否真的会禁止这样做?或者他们应用了仅与遵循建议的代码兼容的细微更改?

我想知道的是,其他人如何处理对象深处发生变化的情况。当通过发出来完成此操作时,在其间的所有组件中也需要大量发出。

了解道具突变的做法是多么不常见也很有趣。你们中有人也这样做吗?

IVO*_*LOV 3

有两种突变 - 当您突变原始值(字符串、数字、布尔值)时以及当您突变对象时。

一旦子对象重新渲染,改变子对象内部的原始值 prop 将恢复来自父对象的原始值。
这有多危险完全取决于你的用例 - Vue 只能警告你“伙计,确保你知道你在做什么”。最终,在下一个 Vue 版本中,他们可能会用错误替换警告 - 但即使是维护人员也不知道这种情况何时以及是否会发生。

改变一个对象实际上是改变它的属性,并且由于对象是通过引用而不是值来访问的 - 来自子对象的所有改变都将持续存在并会影响父对象(父对象可能不会预料到这样的副作用)。同样,这完全取决于您的用例 - 但有时直接变异比通过发出事件向父级发出信号更方便,特别是当变异数据在对象中更深时。

对您来说唯一的风险是您应该监视您的应用程序(和浏览器的控制台)以捕捉来自 Vue 的这些警告变成错误的时刻。
最好的做法是尝试说服您的同事重构代码并尽可能避免这些突变(您可能无法摆脱所有突变)。