vue中父组件给子组件传递数据

  1. 基本原理

    • 在Vue中,父组件向子组件传递数据是通过自定义属性(props)来实现的。props是一个数组或对象,用于接收从父组件传递过来的数据。
  2. 使用步骤

    • 定义子组件的props属性

      • 在子组件的JavaScript部分(可以是Vue.extend方式创建组件或者ES6export default方式)定义props

      • 例如,有一个简单的子组件ChildComponent.vue,它接收一个名为message的数据:

        javascript 复制代码
        export default {
          props: {
            message: {
              type: String,
              required: true
            }
          },
          // 组件的其他选项,如模板、方法等
          template: '<div>{{ message }}</div>'
        }
      • 这里props中的message定义了接收的数据类型为String,并且是必须的(required: true)。如果数据不是必须的,可以设置required: false,并且可以设置默认值default,例如:

        javascript 复制代码
        export default {
          props: {
            count: {
              type: Number,
              default: 0
            }
          },
          template: '<div>Count: {{ count }}</div>'
        }
    • 在父组件中使用子组件并传递数据

      • 在父组件的模板中使用子组件,并通过自定义属性的方式传递数据。例如,有一个父组件ParentComponent.vue

        html 复制代码
        <template>
          <div>
            <ChildComponent :message="parentMessage" />
          </div>
        </template>
        <script>
        import ChildComponent from './ChildComponent.vue';
        export default {
          components: {
            ChildComponent
          },
          data() {
            return {
              parentMessage: 'Hello from parent'
            };
          }
        };
        </script>
      • 在父组件的模板中,<ChildComponent :message="parentMessage" />这一行就是使用子组件并传递数据。:v - bind的缩写)用于动态绑定数据,将父组件中的parentMessage数据传递给子组件的message属性。

  3. 动态传递数据

    • 除了传递静态数据,还可以动态传递数据。例如,当父组件中的数据根据用户交互或者其他事件发生变化时,传递给子组件的数据也会随之更新。

    • 假设父组件中有一个按钮,点击按钮可以改变传递给子组件的数据:

      html 复制代码
      <template>
        <div>
          <button @click="changeMessage">Change Message</button>
          <ChildComponent :message="parentMessage" />
        </div>
      </template>
      <script>
      import ChildComponent from './ChildComponent.vue';
      export default {
        components: {
          ChildComponent
        },
        data() {
          return {
            parentMessage: 'Initial Message'
          };
        },
        methods: {
          changeMessage() {
            this.parentMessage = 'New Message';
          }
        }
      };
      </script>
      • 这里定义了一个changeMessage方法,当按钮被点击时,会改变parentMessage的值,子组件接收到的message数据也会相应地更新,因为Vue会自动检测数据的变化并更新DOM。
  4. 对象和数组的传递

    • 可以传递对象和数组等复杂数据类型。例如,父组件传递一个包含用户信息的对象给子组件:

      html 复制代码
      <template>
        <div>
          <ChildComponent :user="userInfo" />
        </div>
      </template>
      <script>
      import ChildComponent from './ChildComponent.vue';
      export default {
        components: {
          ChildComponent
        },
        data() {
          return {
            userInfo: {
              name: 'John',
              age: 30
            }
          };
        }
      };
      </script>
      • 在子组件中,可以像访问普通属性一样访问对象的属性:

        javascript 复制代码
        export default {
          props: {
            user: {
              type: Object,
              required: true
            }
          },
          template: '<div>Name: {{ user.name }}, Age: {{ user.age }}</div>'
        }
    • 对于数组的传递也是类似的,父组件传递一个数组,子组件通过props接收并使用。例如,父组件传递一个商品列表给子组件:

      html 复制代码
      <template>
        <div>
          <ChildComponent :products="productList" />
        </div>
      </template>
      <script>
      import ChildComponent from './ChildComponent.vue';
      export default {
        components: {
          ChildComponent
        },
        data() {
          return {
            productList: [
              {
                id: 1,
                name: 'Product 1',
                price: 10.0
              },
              {
                id: 2,
                name: 'Product 2',
                price: 20.0
              }
            ]
          };
        }
      };
      </script>
      • 子组件可以遍历数组并显示商品信息:

        javascript 复制代码
        export default {
          props: {
            products: {
              type: Array,
              required: true
            }
          },
          template: '<div v - for="product in products">{{ product.name }} - ${{ product.price }}</div>'
        }
相关推荐
愚公搬代码19 分钟前
【愚公系列】《Web应用安全》001-VMware的安装
前端·安全
xiaohaiAIgeo19 分钟前
【2026年】HG/T 20656-2024化工暖通空调设计规范:新版标准的变化与影响
java·前端·javascript·科普知识
立少→万能汉编22 分钟前
用“立少→超文本”写静态网页,标签<倍>
服务器·前端·javascript
weixin_4316004430 分钟前
NestJS 入门(7):生命周期钩子——构造函数和 `OnModuleInit` 差在哪?
前端·后端·学习·node.js·nest.js
你挚爱的强哥1 小时前
【chromeDownload】自定义组件:多用于登录框底部提供下载Chrome谷歌浏览器的链接
前端·vue.js·chrome
cindershade1 小时前
用原生 HTML5 视频与 Canvas 实现浏览器端视频抽帧封面
前端
笨鸟先飞,勤能补拙1 小时前
Web 服务器与计算机网络全景原理
运维·服务器·前端·网络·人工智能·计算机网络·web安全
NutShell Wang2 小时前
Wails v3 Beta 实战:用显式对象模型重写你的第一个 Go 桌面应用
前端·人工智能·go·vibe coding
daols882 小时前
vue 甘特图 vxe-gantt 任务条拖拽自动更新日期
javascript·vue.js·甘特图
cindershade2 小时前
前端国际化工程实践:语言包拆分、动态加载与日期数字格式统一
前端