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日

相关文章

  • 超简单的Vue.js环境搭建教程

    超简单的Vue.js环境搭建教程 1. 确认开发环境 在开始之前,需要确认本地电脑是否已经安装了 Node.js,如果没有,请下载并安装它。安装完成后,使用命令 node -v和npm -v 确认是否安装成功。 2. 安装Vue的脚手架 在Vue中我们可以使用脚手架工具vue-cli快速构建项目,首先需要使用npm安装vue-cli。在命令行中输入下面的命令…

    Vue 2023年5月28日
    00
  • 分析ES5和ES6的apply区别

    关于分析ES5和ES6的apply区别,我们从以下几个方面来讲解。 ES5 apply 在 ES5 中,apply 是函数的一个方法,它是为了使函数支持传递数组作为参数而存在的,它的语法如下: func.apply(thisArg, [argsArray]) 其中,thisArg 指定了函数被执行时所绑定的 this 对象,argsArray 则是一个数组,…

    Vue 2023年5月28日
    00
  • Vue2.0脚手架搭建

    Vue2.0脚手架搭建 什么是Vue脚手架 Vue脚手架通常是指在开始Vue项目开发时所使用的一个基础模板,它会为我们预先搭好项目的基础结构,例如自动引入Vue,预定义一些常用文件夹例如views、utils等,还会自动配置webpack等工具,从而可以省去我们手动搭建项目基础结构的时间和精力。当前比较常用的Vue脚手架工具有Vue-cli 2.x和Vue-…

    Vue 2023年5月28日
    00
  • Vue3 + Vue-PDF 实现PDF 文件在线预览实战

    让我为你详细讲解如何使用Vue3和Vue-PDF实现PDF文件在线预览。 1. 安装依赖 首先,我们需要创建一个Vue3项目,并安装Vue-PDF的依赖。 vue create vue-pdf-demo cd vue-pdf-demo npm install vue-pdf –save 2. 引入PDF文件 接下来,在Vue组件中引入要预览的PDF文件。 …

    Vue 2023年5月28日
    00
  • 前端vue+express实现文件的上传下载示例

    我们来详细讲解一下“前端vue+express实现文件的上传下载示例”的完整攻略。 1. 准备工作 首先,我们需要安装node.js和npm,这两个东西是在建立一个web应用程序时必要的要素。安装好这两个以后,我们可以使用npm安装express和vue-cli。 # 安装express npm install express –save # 安装vue-…

    Vue 2023年5月28日
    00
  • vue的指令和插值问题汇总

    当我们使用Vue.js创建前端应用程序时,我们经常会使用指令和插值。指令是Vue.js提供的一种特殊语法,用于通过指定元素的行为方式来扩展HTML。而插值用于将数据绑定到HTML模板,以构建动态页面。 下面我们将详细讲解Vue.js指令和插值的用法,以及常见的问题汇总,并提供两个示例进行说明。 指令 Vue.js指令是Vue.js提供的一个扩展HTML的语法…

    Vue 2023年5月28日
    00
  • 解决vue中reader.onload读取文件的异步问题

    解决Vue中reader.onload读取文件的异步问题可以考虑以下两种方法: 方法一:使用Promise 当我们想要在Vue中对reader.onload事件进行操作时,由于它是异步的,我们可以使用Promise将其转换为同步的操作。具体步骤如下: 创建一个方法,用于处理异步操作: function readMyFile(file) { return ne…

    Vue 2023年5月28日
    00
  • vue项目中使用eslint+prettier规范与检查代码的方法

    使用 Eslint 和 Prettier 来规范和检查 Vue 项目的代码是很有必要的,可以提高代码质量和可维护性,这里提供一个完整的攻略。 安装 Eslint 和 Prettier 首先,需要在项目中安装 Eslint 和 Prettier。可以使用 npm 或者 yarn 来安装。 npm install eslint prettier eslint-p…

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