父子组件的相互通信
1:父组件传递给子组件(Props)
父组件代码如下:
子组件只需要对父组件传递的值进行渲染即可,代码如下:
2:emit方式----子传父:
子组件代码如下:在子组件中点击【添加】按钮后,emit一个自定义事件,并将添加的值作为参数传递;
父组件代码如下:在父组件中只需要监听子组件自定义的事件,然后执行对应的添加操作;
3: 同胞传值(兄弟传值)---两个子组件依赖父组件传值
法一:子元素先逆向传值给父组件,父组件在正向传值给另一个子组件;
法二:通过中央事件总线(eventBus)的方式去传值;
中央事件总线: 就是凌驾在我们需要同胞传值的组件之上的一个空的vue实例
1.eventBus文件夹就是用来存放中央事件总线这个实例的。
2.在新建的文件夹与文件之间创建一个空的vue实例。
3.子元素a抛出到事件总线,子元素b从中央事件总线中接受从组件a中抛出的值。
抛: eventbus.$emit("apao",this.ziatext)
接:$on()监听实例上的自定义事件
$on("你要监听的自定义事件是什么".(val就是自定义事件上绑定的数据)=>{
监听到了自定义事件这个回调就会执行
})
不推荐使用中央事件总线实现组件通信,原因如下:
(1)Vue3中移除了事件总线,但是可以借助于第三方工具来完成,Vue官方推荐mitt[2]或tiny-emitter[3];
(2)在大多数情况下不推荐使用全局事件总线的方式来实现组件通信,虽然比较简单粗暴,但是长久来说维护事件总线是一个大难题,所以这里就不展开讲解了,具体可以阅读具体工具的文档;
4:状态管理工具 --- 数据仓库,可任意通信;
集中式存储所有组件的状态的小仓库,并且保持我们存储的状态以一种可以预测的方式发生变化。
vueX产生背景:
如果你的项目里有很多页面(组件/视图),页面之间存在多级的嵌套关系,此时,这些页面假如都需要共享一个状态的时候,此时就会产生以下两个问题,且vueX可以很好的解决;
多个视图依赖同一个状态
来自不同视图的行为需要变更同一个状态
vueX安装使用
(1)进入项目,在命令行中输入安装指令,回车
npm install vuex \--save
(2)配置 vuex,使其工作起来:在src路径下创建store文件夹,然后创建index.js文件,文件内容如下:
(3)修改main.js:
(4)最后修改App.vue:
(5)此时,启动项目npm run dev,即可在控制台输出刚才我们定义在store中的name的值。
官方建议使用:
(1)可将操作this.$store.state.XXX最好放在计算属性中:
(2)也可以如下写:
修饰器:Getter
在组件中使用:
修改值:Mutation
修改App.vue
以上是简单实现mutations的方法,是没有传参的,
传不固定的参数,修改store/index.js
修改App.vue
异步操作:Actions
Actions存在的意义是假设你在修改state的时候有异步操作;
修改store/index.js
修改App.vue
运行项目,查看控制台
5:refs方式
在使用选项式API时,我们可以通过this.$refs.name的方式获取指定元素或者组件,但是组合式API中就无法使用哪种方式获取。如果我们想要通过ref的方式获取组件或者元素,需要定义一个同名的Ref对象,在组件挂载后就可以访问了。
父组件示例代码如下:
子组件示例代码:
setup组件默认是关闭的,也即通过模板ref获取到的组件的公开实例,不会暴露任何在**<script setup>**中声明的绑定。如果需要**公开需要通过****defineExpose**** API暴露**