Vue props:我应该传递对象或其属性吗?有什么区别吗?

2023-12-27

假设我的应用程序是一个用 Vue 构建的精简电子表格。关键组件是TableCollection, Table, Row and Field. The TableCollection有一个包含多个的数组Table对象。每个Table有一个包含多个的数组Row对象。每个Row有一个包含多个的数组Field对象。

当在表模板中使用行组件时,我可以绑定单个行属性(:row="row"),或者我可以为每列绑定一个单独的属性(:col1="col1" :col2="col2" :col3="col3")。哪种方法是首选方法,为什么?

传递单个属性不太冗长,但从行组件内引用它则更冗长,因此它们(大致)相互抵消。单一属性的一个优点是我可以通过推送到数组来动态添加一个字段。

还有其他因素需要考虑吗?例如,它是否影响 Vue 生成的 getter 和 setter?


在重新阅读文档并进行一些测试后,我发现将 props 作为对象传递与对象属性传递之间存在重要区别。

此页面清楚表明两者都可以,https://v2.vuejs.org/v2/guide/components-props.html#Passing-an-Object https://v2.vuejs.org/v2/guide/components-props.html#Passing-an-Object

但是,如果您传递该对象,那么您在组件中所做的任何更改也将反映在父级中。这是有道理的,根据本节底部的评论,https://v2.vuejs.org/v2/guide/components-props.html#One-Way-Data-Flow https://v2.vuejs.org/v2/guide/components-props.html#One-Way-Data-Flow

上面写着:

请注意,JavaScript 中的对象和数组是通过引用传递的,因此如果 prop 是数组或对象,则在子组件内改变对象或数组本身将影响父状态。

为了证明这一点,您将以下代码放入 html 页面中:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue Test</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app"></div>

<script>

    Vue.component('propTest', {
        props : ['scalar', 'object', 'other'],
        template: `<div>Scalar is <input type="text" v-model="scalar"><br>
                        Object field 1 is <input type="text" v-model="object.field1"><br>
                        Object field 2 is <input type="text" v-model="other"></div>`
    });

    var app = new Vue({
        el: '#app',
        data: {
            scalarVal : 'SCALAR',
            objectVal : {
                field1 : 'FIELD ONE',
                field2 : 'FIELD TWO'
            }
        },
        template : '<div><prop-test :scalar="scalarVal" :object="objectVal" :other="objectVal.field2"></prop-test></div>'
    })

</script>
</body>
</html>

正如您所看到的,它向子级传递了三个属性:标量值、对象和作为标量值的对象属性。它们在每个 v 模型的子级中都有双向绑定。

更新网页上的三个值,然后检查您的 Vue 开发工具以查看:

  • 标量在子级中更新,但根中不更新
  • 当传递一个对象并更新一个字段时,它会反映在子级和根级中
  • 当对象字段作为其自己的单独属性传递时,更新会显示在子项中,而不是根中
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue props:我应该传递对象或其属性吗?有什么区别吗? 的相关文章

随机推荐

  • VS Code 中是否有光标覆盖/覆盖模式?

    我似乎找不到任何方法将光标置于 覆盖 模式 就像当您按下插入键并且新键入的字符会覆盖现有的内联字符一样 我没有在网上找到任何关于 VS Code 中省略或包含此类功能的参考 但它似乎是一个相当常用的功能 这存在吗 我也错过了 Visual
  • Sparql - 如果任何一个变量未绑定,则串联失败

    您好 我正在使用 AllegroGraph 和 Sparql 查询来检索结果 这是重现我的问题的示例数据 考虑下面的数据 其中一个人有名字 中间名和姓氏
  • 为什么我在输出文件中看不到计算结果?

    这是后续如何对制表符分隔的数据文件中的列值进行平均 忽略标题行和左列 https stackoverflow com questions 9677533 how do i average column values from a tab s
  • 我的 SQL2008 实例在哪个端口上运行?

    Check out this pic of my SQL 2008 Management Configuration screen for TCP 我需要知道我正在哪个端口上运行 基于上一篇文章 https stackoverflow co
  • 无法在 Ubuntu 13.04 的 R 3.0 中安装 rJava

    我无法打电话rJava封装在R 3 0 我收到以下消息 Error package rJava was built before R 3 0 0 please re install it 当我尝试重新安装时出现错误rJava包裹 我已经提供
  • Pandas 数据框左合并而不重新索引

    想知道是否有更直观的方法来合并数据框 In 140 df1 pd DataFrame data 1 2 3 4 10 4 5 6 columns A B index 1 3 5 7 In 141 df1 Out 141 A B 1 1 2
  • cocos2d游戏如何实现暂停/恢复?

    我的问题是寻找cocos2d游戏期间暂停 恢复状态 包括所有需要保存的数据信息 的设计解决方案 包括但不限于以下情况 1 用户选择退出 然后弹出一个对话框供用户选择 直接退出 暂停 2 有人打电话进来 弹出对话框供用户选择 退出 或 暂停
  • Haskell:单个函数中的多个 Case 语句

    我想在 Haskell 函数中包含多个 case 语句 请参阅下面的假设函数示例 然而 它不是合法的 Haskell 完成同样事情的更好方法是什么 此外 如果 case 语句不返回任何内容 而只是设置某个值 那么为什么在函数中使用多个 ca
  • 如何将我的 JAR 库添加到 ubuntu 中的 tomcat7 安装中

    我正在尝试使用 tomcat7 设置 ubuntu 服务器 我使用以下命令安装了 tomcat7sudo apt get install tomcat7在Ubuntu中 我的应用程序中有一些共享库 例如 JSTL 和其他内容 因此我想将它们
  • 如何从映射它的所有 PTE 中取消映射结构页

    我希望能够从页面缓存中删除页面 以便下次访问该页面 通过任何进程 将触发页面错误 我是从内核执行此操作的 并且我有一个指向struct page我想删除 从页面缓存中删除很容易 通过 delete from page cache 但我不知道
  • PreferenceScreen 中的文本大小

    我有一个 xml 文件 它定义了一些首选项屏幕 如下例所示
  • 使用 Geopy 和 Python 进行地理编码

    我正在尝试对一个 CSV 文件进行地理编码 其中包含位置名称和解析出的地址 其中包括地址号 街道名称 城市 邮政编码 国家 地区 我想通过 Geopy 使用 GEOPY 和 ArcGIS Geocodes 我想创建一个代码 循环遍历 500
  • 如何访问 riot.js 中的子元素

    如果我有一个习惯riot带有一个标签p像这样
  • 在Python中向字典中添加元素?

    我是新来的 所以请告诉我是否有什么我应该知道的或者我犯的任何错误 我试图通过随机选择将内容添加到字典中 但我的代码似乎不起作用 文件 体育 txt Soccer Joshua Lacrosse Naome Lee Soccer Kat Va
  • 基于 Div 高度百分比但仍在滚动

    首先 类似但从未回答过的问题 基于百分比的垂直滚动高度 垂直边距 codepen 示例 https stackoverflow com questions 15572988 vertically scrolling percentage b
  • 在Rails中生成VAPID公钥并将其传递给Javascript

    为了将 Push API 与 VAPID 一起使用 我需要一个applicationServerKey serviceWorkerRegistration pushManager subscribe userVisibleOnly true
  • MVC4 - 在视图中显示 JSON 结果属性

    首先 我是 MVC 新手 我想在 html 视图中显示 JSON 响应的属性 例如 我想从 JSON 响应中获取页面点赞数 并仅显示页面上的点赞数 任何帮助深表感谢 GET Facebook public ActionResult Inde
  • 服务器请求期间不显示忙碌对话框

    我正在开发一个 UI5 应用程序 我想在 ajax 请求期间阻止 UI 表单用户 我添加了以下代码 var dialog new sap m BusyDialog text this languageModel getModelProper
  • 什么是 PixelFormat.RGBX_888

    正如标题所说 有人知道什么是RGBX 8888像素格式吗 和RGBA 8888有什么区别 RGBA 8888 是否提供 Alpha 通道 但 RGBX 8888 不提供 不幸的是 android 文档没有提供太多这方面的信息 Thanks
  • Vue props:我应该传递对象或其属性吗?有什么区别吗?

    假设我的应用程序是一个用 Vue 构建的精简电子表格 关键组件是TableCollection Table Row and Field The TableCollection有一个包含多个的数组Table对象 每个Table有一个包含多个的