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

yizhihongxing

超实用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日

相关文章

  • 详解CocosCreator消息分发机制

    下面是详解Cocos Creator消息分发机制的完整攻略: 什么是消息分发机制 Cocos Creator中的消息分发机制是一种基于观察者模式实现的机制。通俗地说,就是当一个对象的状态发生变化时,会通知所有相关的观察者,以便他们能够及时做出相应的处理。在Cocos Creator中,这个机制被广泛地使用,例如在UI控件之间进行通信、各种游戏物体之间进行交互…

    Vue 2023年5月28日
    00
  • Vue中computed计算属性和data数据获取方式

    下面是关于Vue中computed计算属性和data数据获取方式的完整攻略。 1. 什么是computed计算属性 在Vue中,computed计算属性是一种特殊的属性。它的值不是直接提供的,而是通过计算而来的。computed计算属性是基于它所依赖的数据属性的值进行计算。当依赖的数据属性的值发生改变时,计算属性的值会自动刷新。 computed计算属性常用…

    Vue 2023年5月28日
    00
  • 在项目中封装axios的实战过程

    在项目中封装axios能够使代码更加简洁易读,并且可以统一管理请求接口、请求头等信息,提高代码的可维护性和可拓展性。下面是封装axios的完整攻略: 步骤一:安装axios并创建实例 首先需要在项目中安装axios依赖包,通过npm仓库下载、或者使用CDN链接在html文件中引入。 安装命令:npm install axios 接着,我们需要在项目中创建一个…

    Vue 2023年5月28日
    00
  • Vue实现输入框回车发送和粘贴文本与图片功能

    下面是Vue实现输入框回车发送和粘贴文本与图片功能的完整攻略。 步骤一:引入依赖 在Vue项目中引入vue-clipboard2和vue-filepond这两个库。 npm install vue-clipboard2 vue-filepond 步骤二:注册组件和事件 <template> <div> <input type=&…

    Vue 2023年5月27日
    00
  • 八个一看就觉得很棒的Vue开发技巧分享

    来讲解一下“八个一看就觉得很棒的Vue开发技巧分享”的完整攻略。 八个一看就觉得很棒的Vue开发技巧分享 1. 用组件名前缀 在构建大型的应用程序过程中,可能会有许多个不同的组件文件。为了使组件更易于管理和组织,我们可以通过组件名前缀来对它们进行分类。例如,所有的表格组件都以table-作为前缀,所有的表单组件都以form-作为前缀。这样做可以避免组件命名冲…

    Vue 2023年5月27日
    00
  • 一步步从Vue3.x源码上理解ref和reactive的区别

    当我们在使用Vue3.x的时候,ref和reactive这两个API很常用,但是也经常容易搞混。这篇攻略将介绍ref和 reactive的区别,并且通过源码分析来更加深刻理解这两者之间的差异。 1. reactive reactive是用于将对象转为响应式的API。我们一般使用这个API来将普通的对象转成可以响应式地监听的对象。使用方法如下所示: impor…

    Vue 2023年5月28日
    00
  • vue和js中实现模糊查询方式

    下面给出实现模糊查询方式的完整攻略。 一、实现原理 要想实现模糊查询,需要的是对输入的关键字进行处理,将其与数据源进行匹配。可以利用JS的字符串操作方法来进行模糊匹配,例如使用indexOf方法来判断一个字符串中是否含有某个子串,如果存在,则匹配成功,可以将其作为搜索结果之一。 在Vue中,我们可以利用计算属性来实现模糊查询的应用逻辑,当数据源或者输入的关键…

    Vue 2023年5月27日
    00
  • Vue (Vuex)中 store 基本用法

    Vue 提供了 Vuex 这个基于 Flux 架构的状态管理工具。使用 Vuex,我们可以在应用程序的任何组件中非常方便的存储和更新应用的状态数据。这里我们来讲解一下 Vuex 中 store 的基本用法,包括 state、getters、mutations 和 actions 四个部分。 创建 store 我们需要先创建一个 Vuex.store,这个 s…

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