当前位置: 首页 > article >正文

Vue3组件通信概览

组件通信分为树组件跨组件通信

树组件就是有直接关联关系的组件,比如:父子组件、祖孙组件

跨组件没有关联关系的组件:在层级较深的组件调用顶级的组件,比如某个组件传值定义在App.vue里面的组件,比如全局弹窗组件

组件树通信有:

props/emit

父组件

<template>
  <div class="home">
    <user-card :user="user" @update-user="updateUser" />
  </div>
</template>
​
<script setup>
import { ref } from 'vue'
import userCard from '@/components/userCard.vue'
const user = ref({
  username: '张三',
  age: 18
})
const updateUser = (data) => {
  user.value = {
    ...user.value,
    ...data
  }
}
</script>

子组件

<template>
  <div class="user-card">
    <h2>用户信息</h2>
    <p>姓名:{{ user.username }}</p>
    <p>年龄:{{ user.age }}</p>
    <div class="info">
      <button @click="$emit('updateUser', { username: 'Alan', age: 23 })">修改用户信息</button>
    </div>
  </div>
</template>
​
<script setup>
defineProps({
  user: {
    type: Object,
    default: () => {}
  }
})
</script>

proive/inject和emit

父组件

<template>
  <div class="home">
    <user-card @updateUser="updateUser" />
  </div>
</template>
​
<script setup>
import { ref, provide } from 'vue'
import userCard from '@/components/userCard.vue'
const user = ref({
  username: '张三',
  age: 18
})
const updateUser = (data) => {
  user.value = {
    ...user.value,
    ...data
  }
}
provide('user', user)

子组件

<template>
  <div class="user-card">
    <h2>用户信息</h2>
    <p>姓名:{{ user.username }}</p>
    <p>年龄:{{ user.age }}</p>
    <div class="info">
      <button @click="$emit('updateUser', { username: 'Alan', age: 23 })">修改用户信息</button>
    </div>
  </div>
</template>
​
<script setup>
import { inject } from 'vue'
​
const user = inject('user', { username: 'xxx', age: 12 })
</script>

proive/inject和mitt

安装import mitt from 'mitt'

utils/emitter.js

import mitt from 'mitt'
const emitter = mitt()
export default emitter
父组件
<template>
  <div class="home">
    <user-card />
  </div>
</template>
​
<script setup>
import { ref, provide, onMounted, onUnmounted } from 'vue'
import userCard from '@/components/userCard.vue'
import emitter from '@/utils/mitter'
const user = ref({
  username: '张三',
  age: 18
})
onMounted(() => {
  emitter.on('updateUser', (data) => {
    user.value = {
      ...user.value,
      ...data
    }
  })
})
onUnmounted(() => {
  emitter.off('updateUser')
})
​
provide('user', user)
</script>

子组件

<template>
  <div class="user-card">
    <h2>用户信息</h2>
    <p>姓名:{{ user.username }}</p>
    <p>年龄:{{ user.age }}</p>
    <div class="info">
      <button @click="updateUser">修改用户信息</button>
    </div>
  </div>
</template>
​
<script setup>
import { inject } from 'vue'
import emitter from '@/utils/mitter'
const user = inject('user', { username: 'xxx', age: 12 })
const updateUser = () => {
  emitter.emit('updateUser', { username: 'Alan', age: 23 })
}
</script>
跨组件通信

使用mitt

使用mitt里面的on、emit、off等方法,组件树里面有介绍

使用pinia

import { ref, computed } from 'vue'
import { defineStore } from 'pinia'

export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
  const doubleCount = computed(() => count.value * 2)
  function increment() {
    count.value++
  }

  return { count, doubleCount, increment }
})

A组件

<template>
  <div class="home">
    <h1>数值是:{{ useCounter.count }}</h1>
  </div>
</template>

<script setup>
import { useCounterStore } from '@/stores/counter'
const useCounter = useCounterStore()
</script>

B组件

<template>
  <div class="user-card">
    <h2>数值变化</h2>
    <div class="info">
      <button @click="useCounter.increment()">+1</button>
    </div>
  </div>
</template>

<script setup>
import { useCounterStore } from '@/stores/counter'
const useCounter = useCounterStore()
</script>


http://www.kler.cn/a/289589.html

相关文章:

  • 文件输入输出——NOI
  • 学术论文写作丨机器学习与深度学习
  • 贪心算法入门(二)
  • 【Webpack实用指南】如何拆分CSS资源(2)
  • 冗余连接2 hard题 代随C#写法
  • Python多进程间通讯(包含共享内存方式)
  • [Raspberry Pi]如何利用docker執行motioneye,並利用Line Notify取得即時通知和照片?
  • 2024车牌识别系统十大品牌发布,车牌智能识别系统品牌哪家好?
  • 【408 数据结构】第1章绪论
  • 开发基础软件安装地址(持续更新中)
  • Spring Boot实战:运用享元模式优化微服务间共享资源
  • 使用VM创建centos7环境
  • 知识点复习3
  • 速盾:什么是高防cdn?高防cdn的特点和好处有哪些?
  • 微信小程序知识点(一)
  • 自然语言处理系列五十三》文本聚类算法》文本聚类介绍及相关算法
  • 【软件文档】系统安全保证措施(Word)
  • 【代码随想录训练营第42期 Day49打卡 - 接雨水和柱状图最大矩形问题
  • HTML基本概述
  • 2024升级zblog小程序开源源码/基于uniapp开发的(支持微信小程序、百度小程序、安卓APP)
  • linux文件的拓展属性
  • pod基础和镜像拉取策略
  • 《Few-shot Object Counting and Detection》CVPR2022
  • 学习笔记---自动驾驶
  • 风趣图解LLMs RAG的15种设计模式-第二课
  • 窖藏之秘:白酒在窖藏过程中经历了哪些变化?