Vue3的7种种组件通信详情

yizhihongxing

下面将详细讲解Vue3的7种组件通信方式的完整攻略。

1. 父子组件通信

父子组件通信是指从父组件向子组件传递数据或者事件。在Vue3中我们可以使用props属性向子组件传递变量,或使用$emit方法接收子组件的事件通知。

以下是一个简单的示例:

<!-- 父组件 -->
<template>
  <div>
    <!-- 父组件传递变量给子组件 -->
    <ChildComponent :message="message"></ChildComponent>
  </div>
</template>

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

export default {
  name: 'ParentComponent',
  components: { ChildComponent },
  data() {
    return {
      message: 'Hello from parent component'
    }
  }
}
</script>
<!-- 子组件 -->
<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  name: 'ChildComponent',
  props: {
    message: String
  },
  mounted() {
    console.log(this.message) // Hello from parent component
  }
}
</script>

2. 子父组件通信

子父组件通信是指从子组件向父组件传递数据或者事件。在Vue3中我们可以使用$emit方法向父组件传递一个自定义事件,并使用$on方法监听自定义事件。

以下是一个简单的示例:

<!-- 父组件 -->
<template>
  <div>
    <!-- 监听子组件自定义事件 -->
    <ChildComponent @child-message="handleChildMessage"></ChildComponent>
  </div>
</template>

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

export default {
  name: 'ParentComponent',
  components: { ChildComponent },
  methods: {
    handleChildMessage(message) {
      console.log(message) // Hello from child component
    }
  }
}
</script>
<!-- 子组件 -->
<template>
  <div>
    <button @click="sendMessage">Send message to parent</button>
  </div>
</template>

<script>
export default {
  name: 'ChildComponent',
  methods: {
    sendMessage() {
      this.$emit('child-message', 'Hello from child component')
    }
  }
}
</script>

3. 兄弟组件通信

兄弟组件通信是指在同一父组件中的两个子组件之间进行通信。在Vue3中我们可以使用一个空的Vue实例作为中央事件总线,以使两个组件之间可以通过该实例来共享数据。

以下是一个简单的示例:

<!-- 父组件 -->
<template>
  <div>
    <ChildComponent1></ChildComponent1>
    <ChildComponent2></ChildComponent2>
  </div>
</template>

<script>
import Vue from 'vue'
import ChildComponent1 from './ChildComponent1.vue'
import ChildComponent2 from './ChildComponent2.vue'

const eventBus = new Vue()

export default {
  name: 'ParentComponent',
  components: { ChildComponent1, ChildComponent2 },
  provide() {
    return {
      eventBus
    }
  }
}
</script>
<!-- 兄弟组件1 -->
<template>
  <div>
    <button @click="sendMessage">Send message to sibling</button>
  </div>
</template>

<script>
export default {
  name: 'ChildComponent1',
  inject: ['eventBus'],
  methods: {
    sendMessage() {
      this.eventBus.$emit('sibling-message', 'Hello from sibling 1')
    }
  }
}
</script>
<!-- 兄弟组件2 -->
<template>
  <div>{{ siblingMessage }}</div>
</template>

<script>
export default {
  name: 'ChildComponent2',
  inject: ['eventBus'],
  data() {
    return {
      siblingMessage: ''
    }
  },
  created() {
    this.eventBus.$on('sibling-message', message => {
      this.siblingMessage = message
    })
  }
}
</script>

4. 跨越多级父子组件通信

在多级父子组件的嵌套中,我们可以使用provide和inject来实现跨越多级父子组件的数据传递。可以在任何一个父组件中通过provide提供需要共享的数据,然后在任何一个子组件中使用inject来注入这些数据。

以下是一个简单的示例:

<!-- 祖父组件 -->
<template>
  <div>
    <ParentComponent></ParentComponent>
  </div>
</template>

<script>
import ParentComponent from './ParentComponent.vue'

const sharedData = {
  message: 'Hello from grandparent component',
  count: 0
}

export default {
  name: 'GrandparentComponent',
  components: { ParentComponent },
  provide() {
    return {
      sharedData
    }
  }
}
</script>
<!-- 父组件 -->
<template>
  <div>
    <ChildComponent></ChildComponent>
  </div>
</template>

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

export default {
  name: 'ParentComponent',
  components: { ChildComponent },
  inject: ['sharedData']
}
</script>
<!-- 子组件 -->
<template>
  <div>{{ sharedData.message }}</div>
</template>

<script>
export default {
  name: 'ChildComponent',
  inject: ['sharedData']
}
</script>

5. Vuex

Vuex是Vue的官方状态管理库,它可以全局管理应用程序中的状态,并且可以在任何组件中获取和改变状态。

以下是一个简单的示例:

import { createStore } from 'vuex'

const store = createStore({
  state() {
    return {
      message: 'Hello from Vuex store',
      count: 0
    }
  },
  mutations: {
    increment(state) {
      state.count++
    }
  },
  actions: {
    asyncIncrement({ commit }) {
      setTimeout(() => {
        commit('increment')
      }, 1000)
    }
  },
  getters: {
    doubleCount(state) {
      return state.count * 2
    }
  }
})

export default store
<!-- 组件中使用Vuex -->
<template>
  <div>
    <div>{{ $store.state.message }}</div>
    <div>{{ $store.getters.doubleCount }}</div>
    <button @click="$store.commit('increment')">Increment</button>
    <button @click="$store.dispatch('asyncIncrement')">Async Increment</button>
  </div>
</template>

<script>
export default {
  name: 'MyComponent'
}
</script>

6. $attrs和$listeners属性

在Vue3中,父组件可以向子组件传递任意的HTML属性或事件。可以在子组件中将这些属性和事件绑定到特定的元素或组件。

以下是一个简单的示例:

<!-- 父组件 -->
<template>
  <div>
    <ChildComponent color="red" @click="handleClick"></ChildComponent>
  </div>
</template>

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

export default {
  name: 'ParentComponent',
  components: { ChildComponent },
  methods: {
    handleClick() {
      console.log('clicked in parent component')
    }
  }
}
</script>
<!-- 子组件 -->
<template>
  <div :style="{color: color}" @click="$emit('click')">
    <slot></slot>
  </div>
</template>

<script>
export default {
  name: 'ChildComponent',
  props: {
    color: String
  }
}
</script>

7. provide和inject

provide和inject是Vue3中新的特性,它能实现任意层级组件之间的数据传递。provide提供一个对象,所包含的属性在其所有子组件中都可用。而在其子组件中,我们可以使用inject来注入这些属性。

以下是一个简单的示例:

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

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

const sharedState = {
  message: 'Hello from parent component'
}

export default {
  name: 'ParentComponent',
  components: { ChildComponent },
  provide() {
    return {
      sharedState
    }
  }
}
</script>
<!-- 子组件 -->
<template>
  <div>{{ sharedState.message }}</div>
</template>

<script>
export default {
  name: 'ChildComponent',
  inject: ['sharedState']
}
</script>

以上是Vue3中的7种组件通信方式的详细攻略,其中包括了父子组件通信、子父组件通信、兄弟组件通信、跨越多级父子组件通信、Vuex、$attrs和$listeners属性,以及provide和inject。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue3的7种种组件通信详情 - Python技术站

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

相关文章

  • vue实现加载页面自动触发函数(及异步获取数据)

    实现加载页面自动触发函数及异步获取数据,可以使用Vue的生命周期钩子函数和异步请求。 步骤一:编写需要加载的函数代码 在Vue组件中的 methods 选项中编写需要加载的函数代码。 例如: methods: { fetchData() { axios.get(‘http://api.example.com/data’) .then(response =&g…

    Vue 2023年5月28日
    00
  • 基于java实现websocket协议过程详解

    基于Java实现WebSocket协议过程详解 什么是WebSocket WebSocket是HTML5规范中的协议,它允许在客户端和服务器之间建立一种双向通信的协议,即WebSocket连接。该连接是基于TCP的,它通过在HTTP/1.1之上进行协商升级,可以在客户端和服务器之间创建持久性的连接,实现低延迟、高效率的实时通信。 WebSocket连接的建立…

    Vue 2023年5月28日
    00
  • Rainbond对前端项目Vue及React的持续部署

    首先,我们需要了解一下Rainbond是什么。Rainbond是一个企业级的容器云平台,可以对各种类型的应用进行持续部署、运维和监控。它提供了一套完整的容器管理和应用编排体系,并支持大规模的分布式架构。 Rainbond对前端项目Vue及React的持续部署需要以下几个步骤: 1. 创建应用 在Rainbond中,首先需要创建一个应用来进行持续部署。可以通过…

    Vue 2023年5月28日
    00
  • vue3.0生命周期的示例代码

    首先,需要说明的是Vue 3.0的生命周期函数与Vue 2.x版本有所不同,具体地,Vue 3.0之前的版本生命周期分为8个部分,而Vue 3.0则只有6个部分。此外,Vue 3.0的生命周期函数名称也有所变化。下面,我们来介绍Vue 3.0的生命周期函数。 beforeCreate 这个阶段是在组件实例化之前,此时组件的数据和方法都没有被初始化,因此在这个…

    Vue 2023年5月28日
    00
  • 用Vue.js开发网页时钟

    要用Vue.js开发网页时钟,可以按照以下步骤进行操作: 步骤1:创建Vue项目 首先需要在本地安装Vue.js。如果已经安装了,那么就可以运行以下命令创建新的Vue项目: vue create clock 此处以clock为项目名。 创建后可以进入项目目录: cd clock 步骤2:创建时钟组件 接下来需要创建一个时钟组件,用来展示时间。 在compon…

    Vue 2023年5月29日
    00
  • 详解Vue中状态管理Vuex

    详解Vue中状态管理Vuex 在Vue的大型应用中,数据状态的管理变得异常重要。Vuex是Vue中一个集中式的状态管理器,可以帮助我们方便地管理不同组件之间共享的数据。 Vuex核心概念 State Vuex使用单一状态树,即用一个对象来包含全部应用层级的状态。所有组件的状态存储在一个对象中,这个对象我们称之为state。Vuex的state是响应式的,当s…

    Vue 2023年5月27日
    00
  • vue watch监听方法总结

    Vue Watch监听方法总结 在Vue应用中,我们经常需要对数据进行监听,当数据发生改变时,我们需要对其做出相应的操作,这时我们可以使用Vue提供的watch监听方法。本文将对Vue的watch监听方法进行详细讲解,并通过示例说明。 Vue Watch监听方法用法 Vue的watch监听方法主要是用于监听数据的变化。当监听的数据发生变化时,Vue会自动调用…

    Vue 2023年5月28日
    00
  • 移动端调试神器vConsole使用详解

    我们来详细介绍一下“移动端调试神器vConsole使用详解”的完整攻略。 一、vConsole是什么? vConsole是一款专为移动端开发者设计的前端调试工具。它可以在移动端页面中弹出一个虚拟的控制台,帮助开发者方便地查看页面的错误信息,进行调试和测试。 二、使用vConsole 2.1 引入vConsole 在head标签中引入vConsole的css,…

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