查看: 81|回复: 1

Vue Props属性详解:声明方式、常见错误及多数据传递顺序

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在Vue.js组件化开发中,父子组件之间的数据传递是最常见的需求。由于组件实例的作用域是孤立的,子组件无法直接访问父组件的数据,必须通过 props 将父组件的数据显式传递给子组件。下面通过实际示例,解析 props 的声明方式、常见错误以及多数据传递时的顺序问题。

## 一、Props 的基本声明与使用

子组件需要在 props 选项中声明期望接收的数据字段,随后便可在模板或组件实例中通过 this.xxx 使用。
  1. Vue.component('child', {
  2.   // 声明 props
  3.   props: ['msg'],
  4.   // prop 可以用在模板内,也可以通过 this.msg 访问
  5.   template: '<span>{{ msg }}</span>'
  6. })
复制代码

父组件像使用普通 HTML 属性一样传递数据:
  1. <child msg="hello!"></child>
复制代码

## 二、常见错误:data 与 props 混用导致数据不生效

初学者常在子组件中同时定义 data 和 props,且不注意字段命名。下面是一个错误示例:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <script type="text/javascript" src="./vue.js"></script>
  5. <meta charset="UTF-8">
  6. <title>vue.js</title>
  7. </head>
  8. <body>
  9. <div id="app1">
  10.   <child mssage="hello!"></child>
  11. </div>
  12. <script>
  13. Vue.config.debug = true;
  14. Vue.component('child', {
  15.   props: ['msg','nihao','nisha'],
  16.   template: '<span>{{ msg }}{{nihao}}{{nisha}}</span>',
  17.   data: function() {
  18.     return {
  19.       mssage: 'boy'
  20.     }
  21.   }
  22. });
  23. var vm = new Vue({
  24.   el: '#app1'
  25. })
  26. </script>
  27. </body>
  28. </html>
复制代码

该例中 data 返回了 mssage 字段,但 props 中并未包含 mssage,父组件传递的 mssage="hello!" 无法被子组件接收,且 data 中的 mssage 与模板无关,页面最终只显示空串。正确的做法是移除多余的 data,直接通过 props 接收:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <script type="text/javascript" src="./vue.js"></script>
  5. <meta charset="UTF-8">
  6. <title>vue.js</title>
  7. </head>
  8. <body>
  9. <div id="app1">
  10.   <child mssage="hello!"></child>
  11. </div>
  12. <script>
  13. Vue.config.debug = true;
  14. Vue.component('child', {
  15.   props: ['msg','nihao','nisha'],
  16.   template: '<span>{{ msg }}{{nihao}}{{nisha}}</span>'
  17. });
  18. var vm = new Vue({
  19.   el: '#app1'
  20. })
  21. </script>
  22. </body>
  23. </html>
复制代码

注意:props 中的字段名与父组件传递的属性名一致,本例中父组件传递了 mssage,而子组件 props 中无同名项,因此仍然无法显示。实际开发中应保持属性名统一。

## 三、多数据传递时的顺序问题

当使用多个子组件实例,每个实例只传递部分 props 时,模板中的静态内容会重复出现在每个实例的渲染结果中。下面通过四种不同位置的模板布局来观察顺序影响。

首先定义多实例父组件模板:
  1. <div id="app1">
  2.   <child msg="hello!"></child>
  3.   <child nihao="hello1!"></child>
  4.   <child nisha="hello2!"></child>
  5. </div>
复制代码

子组件声明三个 props:msg、nihao、nisha,模板中按不同方式组合。

**第一种:模板仅包含 props 变量**
  1. template: '<span>{{ msg }}{{nihao}}{{nisha}}</span>'
复制代码

结果:依次输出 "hello!"、"hello1!"、"hello2!"。每个子组件只显示自身接收到的 prop,未接收的留空。

**第二种:模板最前面添加静态文本“123”**
  1. template: '<span>123{{ msg }}{{nihao}}{{nisha}}</span>'
复制代码

结果:"123hello!"、"123hello1!"、"123hello2!"。静态文本“123”出现在每个子组件的输出最前面。

**第三种:模板最后面添加静态文本“123”**
  1. template: '<span>{{ msg }}{{nihao}}{{nisha}}123</span>'
复制代码

结果:"hello!123"、"hello1!123"、"hello2!123"。静态文本“123”出现在每个子组件的最后。

**第四种:模板中间插入静态文本“123”**
  1. template: '<span>{{ msg }}123{{nihao}}{{nisha}}123</span>'
复制代码

结果:第一个子组件输出 "hello!123"(msg 后有 123,其余 props 为空,再拼接 123),第二个输出 "123hello1!"(msg 为空,先输出 123,再输出 nihao,最后 123),第三个输出 "123hello2!123"。实际上,由于 msg 和 nihao、nisha 的先后顺序,静态“123”会根据 props 的排列位置插入。

## 四、总结与建议

1. props 是父子组件通信的核心,必须在子组件中显式声明。
2. 避免 props 与 data 字段重名,否则会发生覆盖或冲突。
3. 当多个子组件实例使用不同 props 时,模板中的静态文本会原样复制到每个实例中,应根据实际需求设计模板结构。
4. 推荐始终传递完整的 props 对象,以保证组件复用性。

更多 Vue.js 组件开发技巧可参考官方文档或本专栏的其他教程。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Vue Props属性详解:声明方式、常见错误及多数据传递顺序

感谢楼主分享这么详细的Props详解!文章从声明方式到常见错误再到多数据传递的顺序,层层递进,示例代码也很清晰,对Vue初学者非常友好。特别是那个data和props混用的错误示例,正好点出了我平时容易忽略的命名一致性问题。多实例传递不同props时静态文本的重复出现,也让我对模板渲染机制有了更深的理解。收藏了,以后写组件时可以再翻出来对照。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-12 22:14 , Processed in 0.024500 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部