当前位置: 首页 > 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

相关文章:

  • 持续集成 01|Gitee介绍、Pycharm使用Gitee
  • 【Rust自学】12.4. 重构 Pt.2:错误处理
  • cursor重构谷粒商城02——30分钟构建图书管理系统【cursor使用教程番外篇】
  • AWS Lambda
  • 【后端面试总结】tls中.crt和.key的关系
  • 【Kafka】Linux+KRaft集群部署指南
  • [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种设计模式-第二课
  • 窖藏之秘:白酒在窖藏过程中经历了哪些变化?