这篇文章主要为大家介绍了vue的父子组件传值,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

现在距离vue3的诞生已经过了很长时间了,笔者也是近期才开始学习vue3。对比vue2来看,vue3在写法发生了不小的变化,最典型的例子就是vue3通过ref,或者reactive实现数据的响应式。因为ref和reactive的出现,使得vue3中父子组件的传值方式也发生了变化

咱们先看下vue2中的写法

父组件:

  1. <!-- 父组件 -->
  2. <template>
  3. <div>
  4. <children :title="title" @getChildren="getChildren"></children>
  5. <div>子组件说: {{ childrenAsk }}</div>
  6. </div>
  7. </template>
  8. <script>
  9. import children from "./children.vue"
  10. export default {
  11. data() {
  12. return {
  13. title: "我是父组件传过来的值",
  14. childrenAsk: ""
  15. }
  16. },
  17. methods: {
  18. getChildren(val) {
  19. this.childrenAsk = val
  20. }
  21. }
  22. }
  23. </script>

子组件:

  1. <!-- 子组件 -->
  2. <template>
  3. <div>
  4. <div>父组件传过来的值: {{ title }}</div>
  5. <button @click="askToFather">点击发送给父组件</button>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. props: {
  11. title: {
  12. type: String
  13. }
  14. },
  15. data() {
  16. return {
  17. askMsg: "这是我给父组件说的话"
  18. }
  19. },
  20. methods: {
  21. askToFather() {
  22. this.$emit("getChildren", this.askMsg)
  23. }
  24. }
  25. }
  26. </script>

在vue2中,子组件向父组件传值通过this.$emit的形式实现,但是vue3中,是不存在this的,vue3中将数据和函数都封装在了setup中,那么vue3是怎么实现的呢?

我们知道vue3中的setup接收两个参数,第一个参数是props,即父组件向子组件传递的props值,第二个值为context,这个值代表了当前的上下文对象,知道这个东西以后现在来实现vue3的父子组件传值

vue3中父传子和vue2中的父传子一样,再次不做过多阐述,下面重点关注的是vue3的子传父

父组件

  1. <template>
  2. <div style="color: aqua">父组件</div>
  3. <div>子组件对我说:{{ children_msg }}</div>
  4. <children :title="msg" @listen="listenToChildren"></children>
  5. {{ value }}
  6. </template>
  7. <script lang="ts">
  8. import children from "@/views/component_emit/children.vue"
  9. import { defineComponent, ref } from "vue"
  10. export default defineComponent({
  11. components: {
  12. children,
  13. },
  14. name: "father",
  15. setup() {
  16. let msg = "我是父组件"
  17. let children_msg = ref("") // ref的作用是实现响应式, 如果没有ref则不能实现响应式(引用数据类型用reactive)
  18. let listenToChildren = (val) => {
  19. children_msg.value = val // 使用ref包裹的数据,需要通过.value的形式访问他的值
  20. }
  21. return {
  22. msg,
  23. children_msg,
  24. listenToChildren,
  25. }
  26. },
  27. })
  28. </script>
  29. <style></style>

子组件:

  1. <template>
  2. <div style="color: brown">子组件</div>
  3. <!-- 父传子使用方法和vue2相同 -->
  4. <div>父组件传过来的值为:{{ title }}</div>
  5. <button @click="sayToFather">向父组件说话</button>
  6. </template>
  7. <script lang="ts">
  8. import { defineComponent } from "vue"
  9. export default defineComponent({
  10. name: "children",
  11. props: {
  12. title: {
  13. type: String,
  14. },
  15. },
  16. setup(props, context) {
  17. // context作用是获取上下文对象,
  18. // 如果setup写法为setup(props, { emit })的方式的话,下面的context可以省略
  19. const sayToFather = () => {
  20. const ask = "我是子组件,我对父组件说话"
  21. context.emit("listen", ask)
  22. }
  23. return {
  24. sayToFather,
  25. }
  26. },
  27. })
  28. </script>
  29. <style></style>

更多相关文章

  1. android实现音乐波动条形图
  2. Android截图功能实现
  3. Android(安卓)实现语音识别
  4. Android双向侧边滑动实现
  5. Android实现计时与倒计时(限时抢购)的几种方法
  6. Android的MediaPlayer架构介绍
  7. Android优秀开源项目
  8. Android(安卓)Jetpack系列之Lifecycle组件(一篇文章掌握Lifecycle
  9. Android——SQLite实现面向对象CRUD

随机推荐

  1. 每日前端夜话(0x04):2018年JavaScript状态
  2. LeetCode #27 移除元素
  3. 以B站C语言视频为基础的课后总结(一)
  4. LeetCode #26 删除排序数组中的重复项
  5. 排序算法 #5 归并排序
  6. 来自Kenneth Reitz大神的建议:避免不必要
  7. 满满的一篇,全是复杂度分析核心知识点
  8. LeetCode #80 删除排序数组中的重复项II
  9. 再聊聊Python中文社区的翻译
  10. Python对象的身份迷思:从全体公民到万物皆