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日

相关文章

  • 浅析vue中常见循环遍历指令的使用 v-for

    下面我会详细讲解“浅析vue中常见循环遍历指令的使用 v-for”的完整攻略。 1. v-for指令概述 在Vue中使用v-for指令可以轻松地把一个数组或对象渲染为一组DOM元素,循环渲染过程中用户也可以做很多自定义操作,这是Vue的一大特色之一。 2. v-for指令的工作原理 v-for指令的工作原理非常简单,它只需要迭代数据源并生成每一项DOM元素,…

    Vue 2023年5月27日
    00
  • Vue 内置指令梳理总结

    “Vue 内置指令梳理总结”是一篇介绍 Vue 框架内置指令的文章。在这篇文章中,我将会讲解 Vue 框架内置指令包括 v-model、v-show、v-if、v-for 等等的用法,以及每个指令的使用场景、注意事项等等。下面是本篇文章的详细攻略。 1. 指令的基本概念 指令是指 Vue 框架提供的一种特殊的 HTML 属性,通过以 v- 开头的命名来表示。…

    Vue 2023年5月27日
    00
  • 详解vue-cli脚手架中webpack配置方法

    以下是详解vue-cli脚手架中webpack配置方法的完整攻略。 1. 什么是Vue-cli脚手架和Webpack 1.1 Vue-cli脚手架 Vue-cli是Vue.js官方提供的一个包含脚手架工具和预设的完整系统。它可以帮助我们快速搭建Vue.js开发环境、开发模板及Webpack打包工具。 1.2 Webpack Webpack是一款模块化的打包工…

    Vue 2023年5月28日
    00
  • Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能

    下面是详细的“Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能”的攻略: 1. 安装iView 要使用iView日期选择器,首先需要在Vue.js项目中安装iView UI库。可以使用npm进行安装: npm install iview –save 安装完成后,在Vue.js项目的main.js文件中引入: import iView f…

    Vue 2023年5月28日
    00
  • vue+axios+promise实际开发用法详解

    vue+axios+promise实际开发用法详解 什么是axios和promise axios axios是一个基于Promise用于浏览器和node.js的HTTP客户端。它具有以下特征: 支持浏览器和 node.js 支持 Promise API 拦截请求和响应 转换请求和响应数据 Promise Promise是一种用于异步编程的语言特性,它可以让我…

    Vue 2023年5月28日
    00
  • 关于引入vue.js 文件的知识点总结

    下面来详细讲解一下“关于引入vue.js文件的知识点总结”: 引入Vue.js文件的方法 在使用Vue.js时,我们必须通过引入Vue.js文件才能使用其提供的功能。下面介绍两种引入Vue.js文件的方法。 直接引入 使用script标签可以直接引入Vue.js库文件,一般情况下我们使用的是Vue.js的生产版本,代码如下: <!– 生产版本,压缩后…

    Vue 2023年5月28日
    00
  • vue3 setup() 高级用法示例详解

    下面我来为您详细讲解“vue3 setup() 高级用法示例详解”的完整攻略。 什么是vue3 setup()函数 setup()是Vue3中的一个新函数,用来替代Vue2中的data、computed、methods等选项,用于组件的数据响应、计算属性、方法等快速开发,同时还可以在其中访问props、context等组件相关对象。setup()函数是Vue…

    Vue 2023年5月28日
    00
  • 记一次用ts+vuecli4重构项目的实现

    让我来详细讲解一下“记一次用TypeScript + Vue CLI 4重构项目”的完整攻略。 准备工作 在进行 TypeScript 重构之前,需要先安装必要的工具和依赖库。以下是准备工作的步骤: 安装 Node.js。 安装 Vue CLI 4。 npm install -g @vue/cli 创建一个新的 Vue 项目,并选择 TypeScript 选…

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