超实用vue中组件间通信的6种方式(最新推荐)

超实用vue中组件间通信的6种方式(最新推荐)

Vue是一个组件化的框架,组件间的通信是非常重要的部分。本文总结了6种超实用的Vue组件间通信的方式,分别是props和$emit、$parent和$children、$refs、事件总线、Vuex和provide和inject。

方式一:props和$emit

props和$emit是vue中非常基础中的通信方式,适用于父子组件通信。父组件通过props向子组件传递数据,子组件通过$emit触发自定义事件与父级通信。

<!-- 父组件 -->
<template>
  <div>
    <h2>父组件</h2>
    <p>子组件传递的数据: {{message}}</p>
    <ChildComponent :message="message" @change="handleChange" />
  </div>
</template>

<script>
import ChildComponent from './child.vue';

export default {
  data() {
    return {
      message: 'hello world'
    };
  },
  components: {
    ChildComponent
  },
  methods: {
    handleChange(value) {
      console.log(value);
    }
  }
};
</script>
<!-- 子组件 -->
<template>
  <div>
    <h3>子组件</h3>
    <input type="text" v-model="message" @input="handleChange">
  </div>
</template>

<script>
export default {
  props: {
    message: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      message: ''
    };
  },
  methods: {
    handleChange(e) {
      const value = e.target.value;
      this.$emit('change', value);
    }
  }
};
</script>

方式二:$parent和$children

$parent和$children是Vue提供的组件实例属性,用于父子组件通信。子组件通过$this.$parent获取父组件实例,父组件通过$children获取子组件实例。

<!-- 父组件 -->
<template>
  <div>
    <h2>父组件</h2>
    <ChildComponent />
  </div>
</template>

<script>
import ChildComponent from './child.vue';

export default {
  components: {
    ChildComponent
  },
  mounted() {
    console.log(this.$children[0].message);
  }
};
</script>
<!-- 子组件 -->
<template>
  <div>
    <h3>子组件</h3>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'hello world'
    };
  },
  mounted() {
    console.log(this.$parent.message);
  }
};
</script>

方式三:$refs

$refs是在vue2.0中引入的,用于在子组件中获取父组件中DOM元素或组件实例。通过$refs获取到DOM或组件实例,通过组件内部的方法操作DOM或组件实例。

<!-- 父组件 -->
<template>
  <div>
    <h2>父组件</h2>
    <button ref="btn" @click="handleClick">获取子组件中的按钮</button>
    <ChildComponent />
  </div>
</template>

<script>
import ChildComponent from './child.vue';

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleClick() {
      console.log(this.$refs.child.message);
    }
  }
};
</script>
<!-- 子组件 -->
<template>
  <div>
    <h3>子组件</h3>
    <button ref="btn">按钮</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'hello world'
    };
  }
};
</script>

方式四:事件总线

事件总线(Event Bus)是Vue中非常常见的一种组件通信方式。通过一个空的Vue实例作为事件中心,用它来触发事件和监听事件,组件之间直接进行事件的发布和订阅。

<!-- EventBus -->
<script>
import Vue from 'vue';

// 创建一个空的Vue实例作为事件中心
const bus = new Vue();

// 将创建的实例导出
export default bus;
</script>
<!-- 父组件 -->
<template>
  <div>
    <h2>父组件</h2>
    <button @click="handleClick">触发事件</button>
  </div>
</template>

<script>
import EventBus from './EventBus';

export default {
  methods: {
    handleClick() {
      EventBus.$emit('event', 'hello world');
    }
  }
};
</script>
<!-- 子组件 -->
<template>
  <div>
    <h3>子组件</h3>
  </div>
</template>

<script>
import EventBus from './EventBus';

export default {
  mounted() {
    EventBus.$on('event', message => {
      console.log(message);
    });
  }
};
</script>

方式五:Vuex

Vuex是Vue的一个状态管理工具,也是组件间通信的一种方式。数据以全局单例模式管理,组件内部通过getters获取state,通过触发mutations中的方法修改state。

<!-- store -->
<script>
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    message: 'hello world'
  },
  mutations: {
    setMessage(state, message) {
      state.message = message;
    }
  }
});
</script>
<!-- 父组件 -->
<template>
  <div>
    <h2>父组件</h2>
    <button @click="handleClick">触发事件</button>
    <p>{{message}}</p>
  </div>
</template>

<script>
import store from './store';

export default {
  computed: {
    message() {
      return store.state.message;
    }
  },
  methods: {
    handleClick() {
      store.commit('setMessage', 'new message');
    }
  }
};
</script>
<!-- 子组件 -->
<template>
  <div>
    <h3>子组件</h3>
  </div>
</template>

<script>
import store from './store';

export default {
  computed: {
    message() {
      return store.state.message;
    }
  }
};
</script>

方式六:provide和inject

Vue2.2.0后提供了provide和inject用于父子组件通信,父组件通过provide提供数据,子组件通过inject注入数据。

<!-- 父组件 -->
<template>
  <div>
    <h2>父组件</h2>
    <ChildComponent />
  </div>
</template>

<script>
import store from './store';

export default {
  provide: {
    message: 'hello world'
  },
  components: {
    ChildComponent
  }
};
</script>
<!-- 子组件 -->
<template>
  <div>
    <h3>子组件</h3>
    <p>{{message}}</p>
  </div>
</template>

<script>
export default {
  inject: ['message']
};
</script>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:超实用vue中组件间通信的6种方式(最新推荐) - Python技术站

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

相关文章

  • Vue学习之组件用法实例详解

    Vue学习之组件用法实例详解 1. 组件的定义与引用 组件是一种抽象的概念,它可以将一些共用的逻辑和界面封装起来,形成一个独立的组件,供其他部分进行复用。在Vue中,组件既可以全局注册,也可以按需注册。 1.1 全局注册组件 全局注册组件是指在Vue实例化之前定义好组件,这样后面的任何Vue实例都可以使用这个组件。 Vue.component(‘compon…

    Vue 2023年5月27日
    00
  • javascript 导出数据到Excel(处理table中的元素)

    下面是详细讲解“javascript 导出数据到Excel(处理table中的元素)”的完整攻略,过程中将包含两个示例说明。 1. 简介 在 web 开发中,有时需要将 table 数据导出为 Excel 文件。本文将介绍如何使用纯 javascript 处理 table 中的元素,并将 table 数据导出为 Excel 文件。 2. 代码实现 首先,我们…

    Vue 2023年5月28日
    00
  • Vue分页器实现原理详解

    首先让我们来了解什么是分页器以及为什么要使用它。分页器通常用于长列表数据(比如搜索结果、文章列表等)的分页展示,它将这些数据分割成多个页面,每页呈现一定数量的内容。当用户需要查看其他页面时,分页器可以快速地进行切换。 Vue分页器的实现原理基于Vue组件化开发思想。实现分页器的过程中,我们需要创建一个Vue组件。在组件的data对象中,我们需要定义一个ite…

    Vue 2023年5月28日
    00
  • vue 动态样式绑定 class/style的写法小结

    那我来详细讲解“Vue 动态样式绑定 class/style 的写法小结”。 1. 绑定 class Vue.js 提供了一种叫做:class的指令,可以通过数据绑定的方式动态地设置一个 HTML 元素的类名。语法为: <div :class="{ className: condition }"></div> 其中…

    Vue 2023年5月27日
    00
  • Uniapp全局消息提示以及其组件的实现方法

    Uniapp是一个跨端开发框架,使得我们可以非常方便地开发和部署多种移动端应用。在开发移动应用时,全局消息提示是一个必不可少的功能,这可以让用户在操作后接收到系统的反馈以便更好地交互。 Uniapp提供了一个uni.showToast()的API方法,可以让我们在全局范围内显示消息提示。下面是如何使用该API的方法: uni.showToast({ titl…

    Vue 2023年5月28日
    00
  • vue axios post发送复杂对象问题

    当使用 Vue.js 结合 axios 提交一个复杂对象时,我们可能会遇到一个问题,即该请求传输时无法正确解析该对象。这可能是因为该对象被序列化成了字符串,导致后端无法正确解析该请求。下面将详细介绍如何解决这一问题。 问题原因 axios 内部使用了 JSON.stringify 将该对象进行序列化,并将其存储在请求正文中。这样,后端无法正确解析该请求。 解…

    Vue 2023年5月28日
    00
  • vue中动态添加style样式的几种写法总结

    当我们在Vue中需要动态添加样式时,我们可以使用以下几种方法: 使用class绑定 Vue中可以使用:class或者:v-bind指令将一个变量与class属性绑定起来,这样我们可以通过改变变量的值来改变元素的class属性,从而改变样式。 <template> <div :class="{ ‘selected’: isSelec…

    Vue 2023年5月27日
    00
  • vue.js的简单自动求和计算实例

    下面为大家讲解一下“Vue.js的简单自动求和计算实例”的完整攻略。 思路概述 首先,我们需要使用 Vue.js 组件化的思想,将输入框和显示框拆分成独立的组件,这样方便我们进行状态管理和更新视图。 其次,我们需要监听输入框的值变化,并对输入的数据进行求和计算,最后将结果显示在显示框中。 示例说明一 下面我们通过一个实例进一步说明上述思路: 在 HTML 中…

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