Vue 常见的几种通信方式(总结)

前言

Vue的通信方式,相信各位小伙伴都已经滚瓜烂收了,但是我估计咱们平常用到的就那么几个,那么剩余的哪些具体是怎么使用的,或者再去温习一下,我觉得也是很有必要的。

1.props/emit

父组件

html 复制代码
<template>
  <h2>props传递和emit传递</h2>
  <CustomPropsEmits :title="pageTitle" @update-title="handleTitleUpdate"></CustomPropsEmits>
</template>

<script setup>
import { ref} from 'vue'
import CustomPropsEmits from './components/customPropsEmits.vue'

// 父组件的状态
const pageTitle = ref('父组件的值')

// 父组件处理子组件的事件
const handleTitleUpdate = (newTitle) => {
  pageTitle.value = newTitle
}

</script>

子组件

html 复制代码
<template>
  <div>
    <h3>{{ props.title }}</h3>
    <el-button @click="updateTitle">Update 父组件</el-button>
  </div>
</template>

<script setup>
import { defineProps } from 'vue'
// 使用 defineProps 接收父组件传递的 prop
const props = defineProps({
  title: {
    type: String,
    required: true
  }
})

// 定义 emit 用于发射事件
const emit = defineEmits(['update-title'])

// 点击按钮时发射事件
const updateTitle = () => {
  emit('update-title', '子组件去改变')
}
</script>

2.v-model

父组件

html 复制代码
<template> 
 <h2>v-model传值</h2>
  <p>{{ message }}</p>
  <CustomVodel v-model="message"></CustomVodel>
</template>

<script setup>
import {ref} from 'vue'
import CustomVodel from './components/customVodel.vue'


const message = ref('Hello, World!')
</script>

子组件

html 复制代码
<template>
  <div>
    <input v-model="localValue" />
  </div>
</template>

<script setup>
import { defineProps, ref, watch } from 'vue'
// 使用 defineProps 接收父组件传递的 prop
const props = defineProps({
  modelValue: {
    type: String,
    required: true
  }
})

// 定义 emit 用于发射事件
const emit = defineEmits(['update:modelValue'])

// 创建一个局部变量,保存 modelValue 的值
const localValue = ref(props.modelValue)

// 监听 localValue 的变化,并发射事件通知父组件
watch(localValue, (newValue) => {
  emit('update:modelValue', newValue)
})
</script>

3.refs

父组件

html 复制代码
<template>  
<h2>refs 子向父通信</h2>
  <el-button @click="callChildMethod">Call Child Method</el-button>
  <CustomRef ref="childRef"></CustomRef>s
</template> 

<script setup>
import { ref, provide } from 'vue'-
import CustomRef from './components/customRef.vue'
const childRef = ref(null)
// 调用子组件的方法
const callChildMethod = () => {
  if (childRef.value) {
    childRef.value.sayHello() // 调用子组件的方法
  }
}

子组件一定要搭配defineExpose使用

html 复制代码
<template>
  <div>
    <p>Hello, I'm the Child Component!</p>
  </div>
</template>

<script setup>
import { defineExpose } from 'vue'

// 定义子组件的方法
// eslint-disable-next-line no-unused-vars
const sayHello = () => {
  console.log('Hello from Child Component!')
}
defineExpose({ sayHello })
</script>

4.provide/inject

父组件

javascript 复制代码
import { ref, provide } from 'vue'

provide('sharedData', 'This is provided data')

子组件

html 复制代码
<template>
  <div>{{ injectedData }}</div>
  <p>这里是传递下来的组件</p>
</template>

<script setup>
import { inject } from 'vue'

const injectedData = inject('sharedData')
</script>

5.eventBus

父向子通信(Vue3移除) 【官方推荐使用 mitt 或 tiny-emitter,使用pubsub-js也可以】

6.状态管理器Vuex/Pinia

注意要配合一个插件才可以实现持久化存储

"pinia-plugin-persistedstate"

这里的代码我只写仓库里的代码

javascript 复制代码
// 此商店用于存放全局的一些状态
import { defineStore } from 'pinia'

export const useAllStore = defineStore('all', {
  state: () => ({
    isCollapse: false,
    defaultActive: '1-1'
  }),
  actions: {
    SetIsCollapseInfo(data) {
      this.isCollapse = data
    },
    setDefaultActive(data) {
      this.defaultActive = data.toString()
    }
  },
  persist: {
    paths: ['isCollapse', 'defaultActive'] //只有 isCollapse,defaultActive被持久化保存
  }
})

7.本地存储也可以

基本也就这些,如果有好的方法欢迎评论区来讨论。

相关推荐
冻感糕人~8 分钟前
【珍藏必备】ReAct框架实战指南:从零开始构建AI智能体,让大模型学会思考与行动
java·前端·人工智能·react.js·大模型·就业·大模型学习
程序员agions12 分钟前
2026年,“配置工程师“终于死绝了
前端·程序人生
alice--小文子18 分钟前
cursor-mcp工具使用
java·服务器·前端
晚霞的不甘27 分钟前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
小迷糊的学习记录36 分钟前
0.1 + 0.2 不等于 0.3
前端·javascript·面试
ۓ明哲ڪ43 分钟前
网页视频倍速播放.
html
空&白1 小时前
vue暗黑模式
javascript·vue.js
梦帮科技1 小时前
Node.js配置生成器CLI工具开发实战
前端·人工智能·windows·前端框架·node.js·json
VT.馒头2 小时前
【力扣】2695. 包装数组
前端·javascript·算法·leetcode·职场和发展·typescript
css趣多多2 小时前
一个UI内置组件el-scrollbar
前端·javascript·vue.js