vue父子组件传参方式

Vue 父子组件传参方式

在 Vue 中,组件的通信是非常重要的。父子组件是两个比较常见的组件角色,如何在父组件和子组件之间传递数据呢?

本文将探讨 Vue 中父子组件传参的几种方式,包括:props、$emit 和 provide/inject。

Props

Props 是一种父组件向子组件传递数据的方式。在子组件中通过 props 定义属性,来声明要接收哪些父组件传递过来的数据。

<!-- Parent.vue -->
<template>
  <Child :message="myMessage" />
</template>
<script>
import Child from './Child.vue';
export default {
  components: { Child },
  data() {
    return {
      myMessage: 'Hello from parent'
    }
  }
}
</script>

<!-- Child.vue -->
<template>
  <div>{{ message }}</div>
</template>
<script>
export default {
  props: ['message']
}
</script>

以上代码中,父组件 Parent.vue 传递了一个 message 属性给子组件 Child.vue

在子组件中,通过 props: ['message'] 定义了一个 message 属性,接收父组件传递过来的数据。

在模板中,通过 {{ message }} 来输出这个属性。

$emit

除了从父组件向子组件传递数据,Vue 还提供了一种从子组件向父组件传递数据的方式——$emit。

在 Vue 中,每个组件实例都有一个 $emit 方法,用来触发当前组件实例上的自定义事件。在父组件中,用 v-on 来监听这个自定义事件。

<!-- Parent.vue -->
<template>
  <Child @myEvent="handleChildEvent" />
</template>
<script>
import Child from './Child.vue';
export default {
  components: { Child },
  methods: {
    handleChildEvent(message) {
      console.log(message); // 'Hello from child'
    }
  }
}
</script>

<!-- Child.vue -->
<template>
  <button @click="$emit('myEvent', 'Hello from child')">Click me</button>
</template>

以上代码中,子组件 Child.vue 中定义了一个点击事件 @click,每次点击时会触发 $emit('myEvent', 'Hello from child'),向父组件传递数据。

在父组件中,用 @myEvent="handleChildEvent" 来监听这个自定义事件,并传递参数 handleChildEvent(message)

Provide/Inject

另一种组件间通信的方式是 provide/inject。它允许一个祖先组件向其所有子孙组件注入一个依赖,不论组件层次有多深,并在所有子孙组件中可用。

<!-- Grandparent.vue -->
<template>
  <Parent></Parent>
</template>
<script>
import Parent from './Parent.vue'
export default {
  components: {
    Parent
  },
  provide() {
    return {
      grandParentMessage: this.message
    }
  },
  data() {
    return {
      message: 'Hello from grandparent'
    }
  }
}
</script>

<!-- Parent.vue -->
<template>
  <Child></Child>
</template>
<script>
import Child from './Child.vue'
export default {
  components: {
    Child
  }
}
</script>

<!-- Child.vue -->
<template>
  <div>{{ grandParentMessage }}</div>
</template>
<script>
export default {
  inject: ['grandParentMessage']
}
</script>

在上面这个示例中,Grandparent.vue 组件通过 provide 注入了属性 message 给它的后代组件。Parent.vue 组件并没有显示地定义组件的 props。

组件 Child.vue 中的 inject 选项表示在父组件一层层向上寻找名为 grandParentMessage 的 provide 对象,找到后注入到它的组件实例的 $options 对象中。然后就可以在模板中使用这个属性了。

总结

以上就是 Vue 父子组件传参的三种方式:props、$emit 和 provide/inject。我们可以根据实际情况选择合适的方式,来实现组件间的数据传递和通信。

如果您想深入了解组件间通信、Vue 的实现原理,可以阅读 Vue.js 官方文档以及相关书籍和博客,不断学习和实践,提高自己的技术水平。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue父子组件传参方式 - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • 前端算法题解leetcode114二叉树展开为链表

    关于前端算法题解leetcode114二叉树展开为链表,我给出完整的攻略如下: 问题概述 给定一个二叉树,原地将它展开为一个单链表。其中,展开后的单链表应该符合如下要求: 单链表的右节点指针为原先的二叉树中序遍历的后继节点。 单链表的左节点应该为空(因为右节点指针已经代替了左右子树指针)。 例如,给定如下二叉树: 1 / \ 2 5 / \ \ 3 4 6 …

    other 2023年6月27日
    00
  • object对象转为string数组

    以下是将object对象转为string数组的完整攻略: 将object对象转为string数组 在JavaScript中,您可以使用Object.keys()和Array.map()将object对象转为string数组。以下是实现效果的步骤: 使用Object.keys()方法获取object对象键。 javascript const = { a: 1,…

    other 2023年5月7日
    00
  • 用VBS将一篇txt后缀的内容保存为html格式

    当使用VBS(Visual Basic Script)将一个txt文件保存为html格式时,可以按照以下步骤进行操作: 创建一个新的VBS文件:首先,打开任意文本编辑器(例如记事本)并创建一个新的文件。将文件保存为.vbs文件扩展名(例如,save_as_html.vbs)。 打开txt文件并读取内容:在VBS文件中,使用FileSystemObject对象…

    other 2023年8月5日
    00
  • js如何判断是否在iframe中及防止网页被别站用iframe嵌套

    JS如何判断是否在iframe中及防止网页被别站用iframe嵌套 在JavaScript中,我们可以使用一些技术来判断当前页面是否在一个iframe中,并采取相应的措施来防止网页被别站用iframe嵌套。下面是一个完整的攻略,包含了两个示例说明。 判断是否在iframe中 要判断当前页面是否在一个iframe中,我们可以使用window对象的top属性。t…

    other 2023年7月28日
    00
  • vue-cli3+ts+webpack实现多入口多出口功能

    “vue-cli3+ts+webpack实现多入口多出口功能”需要做如下几个步骤: 初始化项目 使用vue-cli3初始化一个vue项目,这个项目作为主项目,用于引入其他模块。 vue create my-project 添加模块 在主项目中,通过npm或yarn安装其他需要接入主项目的模块,例如我们需要接入一个blog模块,通过以下命令安装: npm in…

    other 2023年6月27日
    00
  • Python实现扩展内置类型的方法分析

    Python是一门灵活而强大的编程语言,它提供了一系列内置类型来支持通用的编程需求,如列表,字符串和字典等。同时,Python也允许开发者通过扩展内置类型的方式来满足特定的业务需求。 本文将介绍如何通过Python实现扩展内置类型的方法,以下是详细步骤: 步骤一:确定需要扩展的内置类型 首先,我们需要确定我们要扩展的内置类型。Python支持很多内置类型,如…

    other 2023年6月26日
    00
  • css的!important规则对性能有影响吗

    CSS的!important规则对性能有影响吗? 在样式表中,有时我们需要强制某些样式优先生效,这时就可以使用!important规则。但是,在使用!important规则时,是否会影响CSS的性能呢? 事实上,当CSS文件的大小很小时,使用!important规则通常不会对浏览器的性能造成影响。但是,当CSS文件的大小逐渐增加时,使用!important规…

    其他 2023年3月28日
    00
  • ExtJS4 表格的嵌套 rowExpander应用

    { id: 1, name: ‘John Doe’, email: ‘john@example.com’, phone: ‘1234567890’, address: ‘123 Main St’ }, { id: 2, name: ‘Jane Smith’, email: ‘jane@example.com’, phone: ‘0987654321’, ad…

    other 2023年7月28日
    00
合作推广
合作推广
分享本页
返回顶部