如何将VueJS中的属性对象传递给组件来修改它?

2024-03-25

将 VueJS 中的属性对象传递给组件并在那里修改它的最佳实践是什么?

例如,人员表(姓名、名字、年龄、性别等),单击某个条目后,会弹出一个对话框,您可以在其中修改该条目。

如果我通过 props 将条目传递给组件并修改它,我会收到“错误消息:避免直接改变 prop,因为只要父组件重新渲染,该值就会被覆盖。相反,请使用基于道具的价值。”

使用计算值(这是许多教程等提出的可能解决方案)也不起作用,因为在 getter 函数中我返回属性值,而在 setter 函数中我将新值设置为传递的属性,然后“避免变异……”显然又出现了。

我想到的是将条目存储在 Vuex.Store 状态中,并将其与计算属性一起使用。但它为每个表创建了大量代码。对我来说看起来不干净。

还有其他解决方案吗?对我来说似乎是一个基本问题。


只需将对象作为一个整体传递(类型的单个 propObject) 现在您可以根据需要修改子组件中对象的属性。

是的,许多人认为这是反模式。他们的论点是,如果突变遍布代码库,则很难推理代码。坦白说,我不相信这种说法。如果我创建该组件并将其命名为“PersonEditor”(例如),那么该组件的作用非常清楚,并且可以合理地预期它会修改传入的数据......

使用 Vuex(或 Pinia ...尝试一下,太棒了!)也有它的价值(中央存储、时间旅行调试等),但在简单的情况下,编写(和维护)大量样板代码是不合理的坚持一些教条...

此外,在大多数现实生活场景中,当您需要编辑某些“记录”时,您还需要其他功能。例如,“取消”按钮(必须还原用户所做的所有更改)或不将中间值(由于用户与表单交互的过程而可能无效)传播到父级或商店。完美的解决方案是复制对象/记录(例如使用展开运算符 - 如果对象不包含深度嵌套值),将其传递给组件并在用户单击“保存”时使用事件将其取回。现在“编辑器”组件的代码要简单得多,但父组件负责“提交”更改(用新对象替换原始对象)

Update

只是要明确一点。有两种不同(但相似)的错误消息。一个是在运行时来自 Vue 本身 - 如果你做了类似的事情this.propA = 3在孩子身上。这很好,因为这确实是一个问题......

另一个可以来自 ESLint,特别是它的Vue 插件/规则 https://github.com/vuejs/eslint-plugin-vue。规则vue/no-mutating-props https://eslint.vuejs.org/rules/no-mutating-props.html#vue-no-mutating-props。即使你做了类似的事情,这个也会咬你this.propA.someProperty = 3这在技术上是正确的,但它是反对的“规则” https://vuejs.org/style-guide/rules-use-with-caution.html#implicit-parent-child-communication

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

如何将VueJS中的属性对象传递给组件来修改它? 的相关文章

  • 如何使用 vue-cli 3 创建两个单独的包?

    我想构建两个独立的 vue 应用程序 它们将在 Express 应用程序中的两条不同路径上提供服务 公共 vue 应用程序和 管理 vue 应用程序 这两个应用程序有自己的路由器和商店 但它们共享许多自定义组件 如何编辑默认的 webpac
  • Lighthouse:无法在本地主机上运行生成报告

    正如标题所示 我正在尝试为本地提供的 nuxt 应用程序生成报告 如果我通过 DevTools 生成报告 则需要非常长的时间 并且给我的评分非常差 与在部署的同一站点上生成报告相比 如果我尝试使用灯塔扩展 生成报告 按钮将被禁用 我是否会犯
  • Workbox:构建项目时无法缓存所有文件

    I use Vuejs我用workbox webpack plugin为了使我的网站离线 我想缓存一个包含我所有文件 3个文件 的文件夹 如下图所示 但是当我构建我的项目时 使用Laravel mix The main js 包含 Vue
  • 如何使用 Vuejs 加载 url

    我正在建立一个包含几篇文章的网站 我正在使用 Vue Router 目前我的文章的 url 看起来像 article id 例如 http localhost 8080 article 85 如何在 URL 中添加文章标题 以便它可以htt
  • 导入目录中的所有文件,无需显式指定每个文件

    我想导入文件夹中的所有组件 有没有一种方法可以做到这一点而无需创建index js文件并单独导入然后导出每个组件 有批量的方法吗 文件夹结构 src templates Foo vue Bar vue Baz vue src App vue
  • Konvajs/Vue-Konva 使用连接器动态连接形状

    我在用Konvajs Vue Konva在我的内Vuejs Nuxt应用 使用Konva我正在创建Rect在运行时动态形状 现在我想用某种Connectors连接不同的Rect Shapes这样我就可以得到其逻辑source Rect哪个是
  • 组件可以知道 vue-router 中的子路由吗

  • 如何在Vue.js中添加一堆全局过滤器?

    我想在 Vue js 应用程序中使用一些全局过滤器 我知道我需要在主 Vue 实例之前定义它们 但从代码组织的角度来看 将它们全部放在 main js 文件中对我来说似乎并不正确 我怎样才能将定义放在一个单独的文件中 导入到 main js
  • 如何从vue3中的“setup”方法中“发出”事件?

    我知道我可以打电话给emit方法从setup方法 但是有没有办法从任何其他函数发出事件而不传递emit设置方法中的方法 不是中的功能 methods选项 但是一个useXXX功能 setup函数有两个参数 第一个是props 第二个是con
  • Vue.js $children 按组件名称

    我正在尝试按名字访问特定的孩子 目前 由于孩子所在的位置 我这样称呼孩子 this root children 0 没关系 只要那个孩子总是 0 但如果有一种方法可以做类似的事情那就太好了 this root children detail
  • 如何在 Vue.js 中使用“img src”? [复制]

    这个问题在这里已经有答案了 我的 Vue js 模板中有这个 img src media avatars joke avatar alt 它位于一个呈现笑话的循环内 其他字段渲染得很好 但对于图像 我在控制台中收到此错误 src media
  • Vuetify v-select 组件宽度改变

    My v select组件应该有固定的宽度 60px 它们适合表格单元格 我想防止它们在选择值后更改宽度 它们会更改宽度 并且下拉箭头在选择后会向右移动 因此如果有办法减小图标或其填充 边距的大小 可能会有所帮助 真的不知道如何获取这个箭头
  • Whatsapp 预览链接上未显示缩略图和说明

    我知道也有类似的问题here https stackoverflow com questions 19778620 provide an image for whatsapp link sharing and here https stac
  • Vue Test Utils 中的“存根子组件”是什么?

    Vue 测试工具 https vue test utils vuejs org有一个名为的 API 方法shallowMount https vue test utils vuejs org api shallowmount that 创建
  • 完全丢失:Django Rest Framework 中的序列化器和更新的多对多

    我已经研究这个问题几个小时了 但没有找到解决方案 我只是不明白 我有一个有很多孩子的父母 我创建了一个视图 允许我获取父级的所有子级 现在我想结束该列表 并使用新的子列表对父列表进行 PATCH 我明白我需要写一个自定义update方法 但
  • Axios-一次发出多个请求(vue.js)

    如何使用 axios 和 vue 并行发出多个请求 由于 axios 可以被 React 和 Vue 使用 因此代码几乎相同 请务必阅读axios 文档 https github com axios axios 你可以从那里理解它 无论如何
  • Cosmos DB 中的向后分页

    我正在尝试在我的 Vue 前端上使用 c 和 cosmos 实现一个简单的分页系统 但我不确定当用户想要返回时实现分页的最佳方法 为了前进 我使用延续令牌 所以 Cosmos 知道我已经到了哪里 但我不太确定向后工作的最佳方法 或者如果用户
  • 如何更改 vuetify v2 中 scss 中的断点?

    我正在使用 scss 文件 我想更改 vuetify v2 中 css 端的断点 我在 vuetify 升级指南中找不到任何参考 在 1 5 版本中我做了 style x styl grid breakpoints xs 0 sm 476p
  • 以编程方式将焦点设置在 Vuetify 中的按钮上

    我试图在每次打开 v 对话框时将操作按钮集中在 v 对话框中 我尝试使用自动对焦 但它只能工作一次 通常在 Vuetify 中 您可以通过添加引用然后调用 focus 函数来将焦点设置在元素上 如下所示
  • 如何在Nuxt Js中使用Google Map API?

    下面是我在 Nuxt Js 中获取 API 的代码 我已经编写了用于调用 API 的代码 但没有得到结果 我也没有得到任何与此相关的资源 async created const config headers Accept applicati

随机推荐