Vue3的7种种组件通信详情

下面将详细讲解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日

相关文章

  • Vue3项目中引用TS语法的实例讲解

    引入 TypeScript 是 Vue3 项目中的一种常见选择,它有助于提高代码质量和开发效率。下面将提供一个完整的指南,帮助你在 Vue3 项目中引入 TypeScript。 第一步:安装依赖 在 Vue3 项目中使用 TypeScript,首先需要安装一些必要的依赖。在项目根目录下,运行以下命令: npm install –save-dev types…

    Vue 2023年5月27日
    00
  • vue3组合式API中setup()概念和reactive()函数的用法

    Vue 3的组合式API是一种全新的API,可以帮助我们更好地组织代码,以及管理组件内的状态和逻辑。其中,setup()是一个非常重要的概念,而reactive()则是其核心函数之一。 什么是setup()函数 setup()函数是组合式API中的一个重要概念,它允许我们在组件初始化时进行一些设置,例如定义变量、创建函数等等。这个函数在组件实例化之前被调用,…

    Vue 2023年5月28日
    00
  • element-ui中页面缩放时table表格内容错位的解决

    为了解决element-ui中页面缩放时table表格内容错位的问题,我们可以采用以下措施: 1. CSS调整 在表格的父元素中添加CSS样式,使其在缩放时保持宽度不变: .parent { overflow: auto; white-space: nowrap; } 其中,overflow: auto表示在缩放时出现滚动条;white-space: now…

    Vue 2023年5月28日
    00
  • vue3的hooks用法总结

    当谈到Vue 3中新的功能时,不得不提的是它的Hooks。Hooks是一种新的组件API,它可以让我们在函数组件中使用状态和其他React类组件中使用的功能。它在处理组件逻辑时很实用,特别是在实现可重用性和分离关注点方面。 在Vue 3中,我们可以使用若干个Hooks,包括setup、ref、reactive、watch、computed、provide、i…

    Vue 2023年5月28日
    00
  • vue数据响应式原理重写函数实现数组响应式监听

    这里我为大家详细讲解一下“Vue数据响应式原理重写函数实现数组响应式监听”这个话题。 什么是Vue数据响应式原理 首先,我们要了解Vue的数据响应式原理。Vue可以实现数据的自动化更新,是因为它采用了数据劫持和发布订阅模式的方式。 Vue在读取数据时,会通过 Object.defineProperty 方法来劫持该数据的 getter 和 setter,一旦…

    Vue 2023年5月28日
    00
  • vue.prototype和vue.use的区别和注意点小结

    下面我将详细讲解一下“vue.prototype和vue.use的区别和注意点”。 1. vue.prototype的作用 vue.prototype是用来向vue实例注入自定义方法或者属性的。 通过Vue.prototype添加的属性和方法可以在每个Vue组件或者Vue实例中使用,而不需要在每个组件中进行重复的定义。 比如,我们要在每个Vue实例中都添加一…

    Vue 2023年5月27日
    00
  • 基于Vue方法实现简单计时器

    我来详细讲解一下如何基于Vue方法实现简单计时器。 前置知识 在学习本攻略前,需要你掌握以下内容: Vue.js基础知识,包括组件、数据绑定、生命周期等 Vue方法,包括计算属性、监听器、函数以及方法的使用 准备工作 在开始编写计时器之前,需要在Vue项目中创建一个组件,用来接收我们的计时器代码。 <template> <div> &…

    Vue 2023年5月29日
    00
  • vue请求本地自己编写的json文件的方法

    介绍如下: 一、准备JSON文件 首先,需要准备好本地的JSON文件,示例文件可以参考以下结构: { "data": [ { "id": 1, "title": "文章1", "content": "这是文章1的内容" }, { &quot…

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