Vue组件间通信方式有哪些,第五种是哪一种?

摘要:vuex:集中式管理状态容器,可以实现任意组件之间通信!!! 核心概念:state、mutations、actions、getters、modules pinia:集中式管理状态容器,可以实现任意组件之间通信!!! 核心概念
//vuex:集中式管理状态容器,可以实现任意组件之间通信!!! //核心概念:state、mutations、actions、getters、modules //pinia:集中式管理状态容器,可以实现任意组件之间通信!!! //核心概念:state、actions、getters //pinia写法:选择器API、组合式API pinia使用 1、安装pinia npm install pinia 2、创建仓库文件 /src/store/index.ts //创建大仓库 import { createPinia } from 'pinia'; //createPinia方法可以用于创建大仓库 let store = createPinia(); //对外暴露,安装仓库 export default store; 3、main中引入使用 //引入仓库 import store from './store' // 创建app const app = createApp(App) app.use(store) // 挂载 app.mount('#app'); pinia写法:选择式API 创建小仓库文件/src/store/modules/info.ts //定义info小仓库 import { defineStore } from "pinia"; //第一个仓库:小仓库名字 第二个参数:小仓库配置对象 //defineStore方法执行会返回一个函数,函数作用就是让组件可以获取到仓库数据 let useInfoStore = defineStore("info", { //存储数据:state state: () => { return { count: 99, arr: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } }, actions: { //注意:函数没有context上下文对象 //没有commit、没有mutations去修改数据 updateNum(a: number, b: number) { this.count += a; } }, getters: { total() { let result:any = this.arr.reduce((prev: number, next: number) => { return prev + next; }, 0); return result; } } }); //对外暴露方法 export default useInfoStore; pinia写法:组合式API 创建小仓库文件/src/store/modules/todo.ts //定义组合式API仓库 import { defineStore } from "pinia"; import { ref, computed,watch} from 'vue'; //创建小仓库 let useTodoStore = defineStore('todo', () => { let todos = ref([{ id: 1, title: '吃饭' }, { id: 2, title: '睡觉' }, { id: 3, title: '打豆豆' }]); let arr = ref([1,2,3,4,5]); const total = computed(() => { return arr.value.reduce((prev, next) => { return prev + next; }, 0) }) //务必要返回一个对象:属性与方法可以提供给组件使用 return { todos, arr, total, updateTodo() { todos.value.push({ id: 4, title: '组合式API方法' }); } } }); export default useTodoStore; 前端使用:index.vue child.vue和child1.vue 点击查看代码 //index.vue文件=========================== <template> <div class="box"> <h1>pinia</h1> <div class="container"> <Child></Child> <Child1></Child1> </div> </div> </template> <script setup lang="ts"> import Child from "./Child.vue"; import Child1 from "./Child1.vue"; //vuex:集中式管理状态容器,可以实现任意组件之间通信!!! //核心概念:state、mutations、actions、getters、modules //pinia:集中式管理状态容器,可以实现任意组件之间通信!!! //核心概念:state、actions、getters //pinia写法:选择器API、组合式API </script> //child.vue文件=========================== <template> <div class="child"> <h1>{{ infoStore.count }}---{{infoStore.total}}</h1> <button @click="updateCount">点击我修改仓库数据</button> </div> </template> <script setup lang="ts"> import useInfoStore from "../../store/modules/info"; //获取小仓库对象 let infoStore = useInfoStore(); console.log(infoStore); //修改数据方法 const updateCount = () => { //仓库调用自身的方法去修改仓库的数据 infoStore.updateNum(66,77); }; </script> //child1.vue文件=========================== <template> <div class="child1"> {{ infoStore.count }} <p @click="updateTodo">{{ todoStore.arr }}{{todoStore.total}}</p> </div> </template> <script setup lang="ts"> import useInfoStore from "../../store/modules/info"; //获取小仓库对象 let infoStore = useInfoStore(); //引入组合式API函数仓库 import useTodoStore from "../../store/modules/todo"; let todoStore = useTodoStore(); //点击p段落去修改仓库的数据 const updateTodo = () => { todoStore.updateTodo(); }; </script>