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

学习vue3 六,兄弟组件传参,provide/inject

Provide/Inject

通常父组件给子组件传递数据时,使用props的方式,如果是比较深得组件嵌套的话,就需要逐层的进行传递,这样的话,可能会比较麻烦

vue提过了一个api去简化这个操作

provide 可以在祖先组件中指定我们想要提供给后代组件的数据或方法,而在任何后代组件中,我们都可以使用 inject 来接收 provide 提供的数据或方法。 

祖先组件 

<script setup lang="ts">// 采用provide的方式,将祖先组件数据传递给子组件
import { provide,ref } from 'vue'
import A from "./components/A.vue"
const count = ref(0)
provide('count',count)
</script><template><div><h1>{{count}}</h1></div><A></A>
</template><style scoped></style>

在需要用到这个ref数据的时候,只需要inject接受即可

也可以采用readonly防止数据被更改

provide('count',readonly(count))

后代组件

<script setup lang="ts">
import {inject} from "vue";
const data = inject('count')
</script><template><div class="container"><div><span>请输入:</span><input type="text" v-model="data"></div></div>
</template><style scoped>
.container {width: 500px;height: 500px;background-color: #ccc;border: 1px solid grey;margin: 0 auto;
}
.header {height: 50px;background-color: #eee;border: 1px solid grey;
}
.body {height: 400px;background-color: #ddd;border: 1px solid grey;
}
.footer {height: 50px;background-color: #eee;border: 1px solid grey;
}
</style>

兄弟组件传参

有两种方式

1. 借助父组件传参

A组件提交一个事件用来传递参数,父组件接受这个事件拿到值,通过props的方式再转给B组件

案例:

父组件

<script setup lang="ts">
// 借助父组件,进行兄弟组件之间的通信
import A from './components/A.vue'
import B from './components/B.vue'
import {ref,Ref} from 'vue'
const title:Ref<string> = ref('hello')
const handleUpdate = (data:string):void => {title.value = data
}
</script><template><A @update="handleUpdate"></A><B :title="title"></B>
</template><style scoped></style>

A组件

<script setup lang="ts">
import { ref } from 'vue'
const data = ref('')
// let emit = defineEmits<{
//   (e: 'update', value: string): void
// }>()
const emit = defineEmits(['update'])
</script><template><div class="container"><div><span>请输入:</span><input type="text" v-model="data"></div><button @click="emit('update', data)">提交</button></div>
</template><style scoped></style>

B组件

<script setup lang="ts">
// 使用defineProps的js和ts写法
defineProps<{title: string
}>()
// const props = defineProps({
//   title:{
//     type:String,
//     default:''
//   }
// })
</script><template><div class="context"><h1>我是b组件</h1><div><span>{{title}}</span></div></div>
</template><style scoped></style>

2. Event bus

在vue3中$on,$off 和 $once 实例方法已被移除,组件实例不再实现事件触发接口,因此大家熟悉的EventBus便无法使用了。然而我们习惯了使用EventBus,对于这种情况我们可以使用Mitt库(其实就是发布订阅模式的设计)

安装:

npm install mitt -S

使用:

再main.ts中

import { createApp } from 'vue'
import App from './App.vue'
import "animate.css"
import Card from "./components/Card.vue";
import mitt from 'mitt';
const emitter = mitt();declare module "vue" {export interface ComponentCustomProperties {$Bus: typeof emitter}
}const app = createApp(App)
app.config.globalProperties.$Bus = emitter; // 全局事件总线
app.component("Card",Card).mount('#app')

A组件通过emit派发事件

<script setup lang="ts">
import { ref,getCurrentInstance } from 'vue'
const data = ref('')
const instance = getCurrentInstance()
function handleEmit() {instance?.proxy?.$Bus.emit('submit', data.value)
}
</script><template><div class="container"><div><span>请输入:</span><input type="text" v-model="data"></div><button @click="handleEmit">提交</button></div>
</template><style scoped>
.container {width: 500px;height: 500px;background-color: #ccc;border: 1px solid grey;margin: 0 auto;
}
.header {height: 50px;background-color: #eee;border: 1px solid grey;
}
.body {height: 400px;background-color: #ddd;border: 1px solid grey;
}
.footer {height: 50px;background-color: #eee;border: 1px solid grey;
}
</style>

B组件通过on去接受

<script setup lang="ts">
// 使用defineProps的js和ts写法
import {ref,getCurrentInstance} from "vue";
const title = ref('我是b组件的title')
const instance = getCurrentInstance()
// 接受兄弟组件通过mitt传递过来的数据
instance?.proxy?.$Bus.on('submit',(val:string)=>{title.value = val
})
</script><template><div class="context"><h1>我是b组件</h1><div><span>{{title}}</span></div></div>
</template><style scoped>
.context {width: 500px;height: 300px;background-color: #ccc;border: 1px solid grey;margin: 0 auto;
}h1 {text-align: center;
}
</style>

3使用方法通过emit派发, on 方法添加事件,off 方法移除,clear 清空所有

也可以通过on('*')的方式监控所有组件

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 一键登录,打造华为账号便捷新体验
  • npm vs pnpm 之幽灵依赖
  • qt客户端与服务端通信
  • 谷粒商城实战笔记-140-商城业务-nginx-搭建域名访问环境二(负载均衡到网关)
  • Roaringbitmap+Mysql构建标签--实际使用问题
  • CACTER直播预告:重保期间邮件网关与SMC2如何多维度防护
  • 常见的框架漏洞
  • 常见的CMS漏洞
  • Stable Diffusion绘画 | 图生图-上传重绘蒙版
  • Massa如何构建完全链上的去中心化网络?
  • 计算机学习
  • SQL Server数据库文件过大而无法直接导出解决方案
  • 开源威胁情报查询
  • 07.FreeRTOS列表与列表项
  • leetcode 234.回文链表
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【css3】浏览器内核及其兼容性
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • CentOS7简单部署NFS
  • go append函数以及写入
  • Hexo+码云+git快速搭建免费的静态Blog
  • IDEA 插件开发入门教程
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Redis的resp协议
  • Vue.js源码(2):初探List Rendering
  • 复杂数据处理
  • 高性能JavaScript阅读简记(三)
  • 给新手的新浪微博 SDK 集成教程【一】
  • 前端_面试
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 正则表达式
  • 2017年360最后一道编程题
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #微信小程序(布局、渲染层基础知识)
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (arch)linux 转换文件编码格式
  • (C++17) optional的使用
  • (LeetCode C++)盛最多水的容器
  • (ZT)出版业改革:该死的死,该生的生
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (九十四)函数和二维数组
  • (三)docker:Dockerfile构建容器运行jar包
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net wcf memory gates checking failed
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .NET中分布式服务
  • .Net中间语言BeforeFieldInit
  • @component注解的分类