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

vue 入门:组件通讯

跨组件通讯图
在这里插入图片描述

Props(父 → 子)

本质:父组件通过属性向子组件传递数据。
特点:单向数据流,子组件不能直接修改 props。
示例:

<!-- 父组件 -->
<Child :title="parentTitle" />

<!-- 子组件 -->
<script>
export default {
  props: ['title'] // 接收父组件数据
}
</script>

$emit + v-on(子 → 父)

本质:子组件通过事件向父组件传递数据。
示例:

<!-- 子组件 -->
<button @click="$emit('update', newValue)">提交</button>

<!-- 父组件 -->
<Child @update="handleUpdate" />

provide / inject(依赖注入)

本质:祖先组件提供数据,后代组件注入使用。
特点:适合深层嵌套,但数据流向不透明。
示例:

// 祖先组件
export default {
  provide() {
    return { theme: 'dark' }; // 提供数据
  }
}

// 后代组件
export default {
  inject: ['theme'] // 注入数据
}

任意组件通信(全局状态)

Vuex 是 Vue 官方提供的状态管理库,适用于复杂应用的全局状态管理。它通过一个全局的 store 来管理应用的状态,允许跨组件共享和修改数据。

API官网

核心概念:

  • state:存储数据。
  • mutations:同步修改数据。
  • actions:异步操作。
  • getters:计算属性。

安装

npm install vuex@3 --save

创建 Store

// store.js
import { createStore } from 'vuex';

export default createStore({
  state: {
    globalMessage: 'Hello from Vuex'
  },
  mutations: {
    updateMessage(state, newMessage) {
      state.globalMessage = newMessage;
    }
  },
  actions: {
    updateMessage({ commit }, newMessage) {
      commit('updateMessage', newMessage);
    }
  },
  getters: {
    globalMessage: (state) => state.globalMessage
  }
});

在主应用中引入 Store:

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import store from './store';

createApp(App).use(store).mount('#app');

在组件中使用:

// 组件中
this.$store.dispatch('updateMessage', 'New Message');
console.log(this.$store.getters.globalMessage);

Pinia 是 Vue 3 推荐的状态管理库,是 Vuex 的替代品,提供了更好的类型支持和更简

安装

npm install pinia

创建 Store

// store.js
import { defineStore } from 'pinia';

export const useMessageStore = defineStore('message', {
  state: () => ({
    message: 'Hello from Pinia'
  }),
  actions: {
    updateMessage(newMessage) {
      this.message = newMessage;
    }
  }
});

在主应用中引入 Store:

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import { createPinia } from 'pinia';

const app = createApp(App);
app.use(createPinia());
app.mount('#app');

在组件中使用:

// 组件中
import { useMessageStore } from './store';

const store = useMessageStore();
store.updateMessage('New Message');
console.log(store.message);

相关文章:

  • Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数(决策树、逻辑回归、KNN、SVM)
  • C++STL——容器-list(含模拟实现,即底层原理)(含迭代器失效问题)(所有你不理解的问题,这里都有解答,最详细)
  • python:audioFlux 使用教程
  • 【maxENT】最大熵模型(Maximum Entropy Model)R语言实现
  • 双系统win11 + ubuntu,如何完全卸载ubuntu系统?
  • Flutter中如何判断一个计算任务是否耗时?
  • 封装Tcp Socket
  • Pinocchio中data、model接口介绍
  • Echarts跨平台设备适配详解
  • ssh 三级跳
  • C语言中数组与指针:差异、应用及深度剖析
  • 【unity游戏开发入门到精通——UGUI】CanvasScaler画布缩放器组件
  • 探索 Go 与 Python:性能、适用场景与开发效率对比
  • MySQL中的UNION和UNION ALL【简单易懂】
  • 深入解析@Validated注解:Spring 验证机制的核心工具
  • 层归一化(Layer Normalization) vs 批量归一化(Batch Normalization)
  • mysql 有哪些存储引擎、区别是什么
  • 行星际激波在日球层中的传播:Propagation of Interplanetary Shocks in the Heliosphere (第二部分)
  • Maven工具学习使用(十一)——部署项目到仓库
  • 3.4 函数单调性与曲线的凹凸性
  • 河北6人在河道倒污泥被控污染环境案撤诉后,已拿到国赔决定书
  • 国家发改委谈整治“内卷式”竞争:加力破除地方保护和市场分割,遏制落后产能无序扩张
  • 国家发改委:大部分稳就业稳经济政策将在6月底前落地
  • 全球前瞻|特朗普19日将与俄乌总统分别通话,英国脱欧后首开英欧峰会
  • 网文书单|推荐4本网文,可以当作《绍宋》代餐
  • 2025年上海科技节开幕,人形机器人首次登上科学红毯