Vue父子组件传值的一些坑

本文将为大家详细介绍Vue中父子组件传值的注意事项和实现方式。我们会从以下几个方面进行讲解:

1.父组件向子组件的传值
2.子组件向父组件的传值
3.中央事件总线(Event Bus)方式传值
4.Vuex状态管理方式传值

  1. 父组件向子组件的传值

父组件向子组件传值的方式有两种,一种是通过Props方式,一种是通过$children访问子组件的方式。

  • Props方式

父组件可以通过props方式将数据传递给子组件。子组件通过props的方式接收数据,进行处理和渲染。

<template>
  <div>
    <child-component :message="messageFromParent"></child-component>
  </div>
</template>

<script>
import ChildComponent from "./ChildComponent.vue";

export default {
  name: "ParentComponent",
  data() {
    return {
      messageFromParent: "Hello, child component!"
    };
  },
  components: {
    ChildComponent // 注册子组件
  }
};
</script>
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  name: "ChildComponent",
  props: ["message"] // 定义Props
};
</script>
  • $children访问子组件的方式

另一种方式是通过$children访问子组件实例的方式传递数据。这种方式需要注意的是,使用$children需要等到子组件渲染完毕之后才能生效,否则会出现undefined的情况。

<template>
  <div>
    <button @click="changeValueInChild">子组件中的值加一</button>
    <child-component ref="child"></child-component>
  </div>
</template>

<script>
import ChildComponent from "./ChildComponent.vue";

export default {
  name: "ParentComponent",
  methods: {
    changeValueInChild() {
      this.$refs.child.value++;
    }
  },
  components: {
    ChildComponent
  }
};
</script>
<template>
  <div>
    <p>子组件中的值:{{ value }}</p>
  </div>
</template>

<script>
export default {
  name: "ChildComponent",
  data() {
    return {
      value: 0
    };
  }
};
</script>
  1. 子组件向父组件的传值

子组件向父组件传值的方式有两种,一种是通过emit方式发送事件,一种是通过\$parent访问父组件实例的方式进行传递数据。

  • emit方式

子组件通过Vue中的emit方法,向父组件发送自定义事件,并且可以携带数据。父组件监听该事件,获取子组件的数据。

<template>
  <div>
    <button @click="sendToParent">将子组件中的值传递给父组件</button>
  </div>
</template>

<script>
export default {
  name: "ChildComponent",
  data() {
    return {
      value: 0
    };
  },
  methods: {
    sendToParent() {
      this.$emit("increment", this.value);
    }
  }
};
</script>
<template>
  <div>
    <p>父组件中的值:{{ parentValue }}</p>
    <child-component @increment="getValueFromChild"></child-component>
  </div>
</template>

<script>
import ChildComponent from "./ChildComponent.vue";

export default {
  name: "ParentComponent",
  data() {
    return {
      parentValue: 0
    };
  },
  methods: {
    getValueFromChild(value) {
      this.parentValue += value;
    }
  },
  components: {
    ChildComponent
  }
};
</script>
  • \$parent访问父组件实例的方式

另一种方式是通过\$parent访问父组件实例的方式进行传递数据。可以直接修改父组件的数据,从而达到传值的目的。这种方式需要注意的是,访问父组件实例时需要等到父组件渲染完毕之后才能生效,否则会出现undefined的情况。

<template>
  <div>
    <button @click="sendToParent">将子组件中的值传递给父组件</button>
  </div>
</template>

<script>
export default {
  name: "ChildComponent",
  data() {
    return {
      value: 0
    };
  },
  methods: {
    sendToParent() {
      this.$parent.parentValue += this.value;
    }
  }
};
</script>
<template>
  <div>
    <p>父组件中的值:{{ parentValue }}</p>
    <child-component></child-component>
  </div>
</template>

<script>
import ChildComponent from "./ChildComponent.vue";

export default {
  name: "ParentComponent",
  data() {
    return {
      parentValue: 0
    };
  },
  components: {
    ChildComponent
  }
};
</script>
  1. 中央事件总线(Event Bus)方式传值

中央事件总线是一种Vue中比较常用的数据传递方式。通过创建Vue实例作为中央事件总线,实现父组件和子组件之间的通信。子组件通过总线\$emit自定义事件,并通过总线\$on方法监听事件,父组件通过总线实例去监听事件,从而获得子组件传过来的值。

<template>
  <div>
    <button @click="sendEvent">将子组件中的值传递给父组件</button>
  </div>
</template>

<script>
export default {
  name: "ChildComponent",
  data() {
    return {
      value: 0
    };
  },
  methods: {
    sendEvent() {
      this.$bus.$emit("increment", this.value);
    }
  }
};
</script>
<template>
  <div>
    <p>父组件中的值:{{ parentValue }}</p>
  </div>
</template>

<script>
export default {
  name: "ParentComponent",
  data() {
    return {
      parentValue: 0
    };
  },
  mounted() {
    this.$bus.$on("increment", value => {
      this.parentValue += value;
    });
  }
};
</script>

在使用中央事件总线的方式传值时需要注意的是,如果不注意及时移除监听事件,在组件销毁后还会接收到子组件的数据。因此,在组件销毁前一定要通过\$off方法将事件监听移除。

  1. Vuex状态管理方式传值

Vuex是Vue中官方推荐使用的状态管理器,因此在使用Vue的过程中有些情况下也可以通过Vuex来实现组件之间通信。

Vuex中的mutation和action可以改变state中的数据,因此可以将需要传递的值存储在state中,从而实现父组件和子组件之间的通信。父组件通过dispatch调用action,从而触发mutation来改变state中的值,子组件通过$store来获取需要的值。

<template>
  <div>
    <button @click="sendToParent">将子组件中的值传递给父组件</button>
  </div>
</template>

<script>
export default {
  name: "ChildComponent",
  data() {
    return {
      value: 0
    };
  },
  methods: {
    sendToParent() {
      this.$store.dispatch("changeParentValue", this.value);
    }
  }
};
</script>
<template>
  <div>
    <p>父组件中的值:{{ parentValue }}</p>
    <child-component></child-component>
  </div>
</template>

<script>
import ChildComponent from "./ChildComponent.vue";

export default {
  name: "ParentComponent",
  computed: {
    parentValue() {
      return this.$store.state.parentValue;
    }
  },
  methods: {
    changeParentValue(value) {
      this.$store.commit("changeParentValue", value);
    }
  },
  components: {
    ChildComponent
  }
};
</script>
// store.js

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

const state = {
  parentValue: 0
};

const mutations = {
  changeParentValue(state, value) {
    state.parentValue += value;
  }
};

const actions = {
  changeParentValue({ commit }, value) {
    commit("changeParentValue", value);
  }
};

export default new Vuex.Store({
  state,
  mutations,
  actions
});

总结:

以上就是Vue中父子组件传值的一些注意事项和实现方式,通过对这些方式的了解和掌握,我们可以更好地实现组件之间的通信,提高Vue的开发效率。同时,在使用不同的传值方式时也需要根据具体情况进行权衡选择,以达到最佳的开发体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue父子组件传值的一些坑 - Python技术站

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

相关文章

  • vue3常用响应式对象的api,你全用过了吗

    下面是关于Vue3常用响应式对象的API的完整攻略。 Vue3常用响应式对象的API ref ref 是 Vue3 中创建响应式数据的函数。可以用来包装基本类型的数据,例如数字、字符串等。ref 函数返回一个具有 value 属性的对象,该属性的值为传入的初始值,并且它是响应式的。 示例1: import { ref, reactive } from ‘vu…

    Vue 2023年5月28日
    00
  • 使用VUE+SpringBoot+EasyExcel 整合导入导出数据的教程详解

    使用VUE+SpringBoot+EasyExcel 整合导入导出数据的教程详解 简介 数据的导入导出是一个web应用中很重要的功能,在开发中,往往需要对数据进行批量导入和导出。本文将介绍如何使用Vue+SpringBoot+EasyExcel进行数据的导入导出。 技术栈 前端:Vue.js 后端:SpringBoot 数据导入导出库:EasyExcel 准…

    Vue 2023年5月28日
    00
  • vue.js整合vux中的上拉加载下拉刷新实例教程

    Vue.js整合Vux中的上拉加载下拉刷新实例教程 Vux是一个基于Vue.js的UI组件库,提供了大量易用的组件和工具。其中,上拉加载和下拉刷新是常用的功能,本文将介绍如何使用Vux实现上拉加载和下拉刷新。 准备工作 首先,需要安装Vux和Vue.js。 npm install vux vue –save 然后,在Vue.js中引入Vux: import…

    Vue 2023年5月27日
    00
  • vue实现微信公众号h5跳转小程序的示例代码第1/3页

    实现微信公众号H5页面跳转小程序可以使用微信JS-SDK中的wx.miniProgram.navigateTo()方法,下面是Vue实现微信公众号H5跳转小程序的示例代码: 引入微信JS-SDK 首先需要在index.html中引入微信JS-SDK的js文件,其地址为: 调用wx.miniProgram.navigateTo() 在组件中调用wx.miniP…

    Vue 2023年5月27日
    00
  • Vue.JS入门教程之处理表单

    下面就来详细讲解如何处理表单的相关内容。 一、表单基础 1.1 表单元素 表单是Web应用程序中不可或缺的组成部分,它允许用户输入数据并将其提交给服务端进行处理。表单由一个或多个表单元素组成,常见的表单元素包括: input:文本输入框、复选框、单选框等 select:下拉框 textarea:文本域 button:提交按钮、重置按钮等 label:表单元素…

    Vue 2023年5月27日
    00
  • vue props default Array或是Object的正确写法说明

    对于“vue props default Array或是Object的正确写法说明”,主要包括以下内容: 使用函数返回值作为默认值 使用工厂函数生成默认值 示例一:使用函数返回值作为默认值 对于Array类型的props,可以使用函数返回默认值。以下是一个示例: props: { list: { type: Array, default: function(…

    Vue 2023年5月28日
    00
  • vue运行卡死的问题

    当我们在使用 Vue 进行开发时,有时候会遇到页面暂时无法响应,或者整个页面都卡死的情况。这种情况可能是由于 Vue 中存在的一些错误所引起的,接下来我将讲解几种可能引起卡死的问题,并提供解决方法。 1. 大量数据循环渲染 如果你在 Vue 中使用列表渲染时,如果列表数据的数据量非常大,比如几百上千条数据,那么页面渲染的速度就会非常缓慢,甚至会卡死。 解决方…

    Vue 2023年5月27日
    00
  • 深入解读VUE中的异步渲染的实现

    深入解读VUE中的异步渲染的实现 Vue中的异步渲染主要是采用了Next Tick机制,将数据的变化尽可能异步处理,从而防止同步过程中出现性能问题。 Next Tick 的实现 Next Tick 是指在下一次事件循环之前执行的操作。Vue 中使用了 microtask(微任务) 实现 Next Tick 机制。在具体实现中,使用了 setImmediate…

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