vue3 setup语法糖,常用的几个:defineProps、defineEmits、defineExpose、

vue3和vue2组件之间传参的不同

<script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。

<script setup> 中的代码会在每次组件实例被创建的时候执行

任何在 <script setup> 声明的顶层的绑定 (包括变量,函数声明,以及 import 导入的内容) 都能在模板中直接使用,使用双花括号:{{自定义的声明}}。

在 <script setup> 中要使用动态组件的时候,应该使用动态的 :is 来绑定,结合三元运算符。

效果展示:

一、defineProps父传子

理论知识:

父组件通过 :传参名=“传递的数据” 向子组件传递参数

子组件通过 defineProps<{接收的数据}>() 来接收数据

在 script setup 中,引入的组件会自动注册,所以可以直接使用,无需再通过components进行注册。 

 代码:

父组件:

<div class="projects">实际已维修项目</div>
<AllTable:widthIndex="100":AllTableData="data.AllTableData":tableColumns="data.tableColumns":heights="data.heights":option="true"@changeTbaleData="changeTbaleData"
></AllTable>
<div class="isNewOpenD"><el-buttontype="primary"plainclass="mt-4"style="width: 100%"@click="handleNew">维修项目新增</el-button>
</div>

 

<script setup>
const changeTbaleData = (value) => {data.AllTableData = value;
};
const data = reactive({AllTableData:[],})
</script>

二、defineEmits子传父

在Vue 3中,可以使用 defineEmits 函数来声明子组件可以触发的事件。该函数需要在子组件中使用,并且需要在 setup 函数中调用 。

理论知识:

父组件通过@绑定子组件注册好的事件名,在父组件中进行处理子组件传过来的value

子组件通过两点:

1.defineEmits()函数用来声明子组件可以触发的事件

   语法:const 事件名 = difineEmits(['事件'])

2.在"事件"方法内部,使用注册好的事件,向父组件传参

   语法:声明的事件名('事件',传递的数据)

理论知识代码:

 

子组件:

//封装组件:AllTable.vue
<template><el-table :data="props.AllTableData" :height="props.heights" style="width: 100%":cell-style="{ textAlign: 'center' }" :header-cell-style="{ 'text-align': 'center' }"><el-table-column type="index" label="序号" :width="props.widthIndex" /><template v-for="(item, index) in props.tableColumns" :key="index"><el-table-column :prop="item.value" :label="item.name" width="" :show-overflow-tooltip="true"></el-table-column></template>
<el-table-column label="操作" v-if="props.option"><template #default="scope"><el-popconfirm title="你确定要删除吗?" confirm-button-text="确认" cancel-button-text="取消"@confirm="confirmOption(scope.$index)" @cancel="cancelOption(scope.$index)"><template #reference><el-button link type="danger" size="small">删除</el-button></template></el-popconfirm></template></el-table-column></el-table>
</template>
<script setup>
const emits = defineEmits(["changeTbaleData"])
const props = defineProps({widthIndex: {type: Number,default: 180},AllTableData: Object,tableColumns: Object,heights: String,option: {type:Boolean,default:false},
})
const confirmOption = (index) => {props.AllTableData.splice(index, 1)emits("changeTbaleData", props.AllTableData)
}
const cancelOption = (index) => {ElMessage({message: '取消。',type: 'warning',})
}
</script>

写到这儿,在vue开发中,常用的组件之间就上面两种方式。

但,当情景不止是父<——>子 之间通讯,可以考虑inject注入、defineExpose()暴露、pinia(或vuex) 

 三、defineExpose 获取子组件的实例和内部属性

子组件将方法、变量暴露给父组件使用,父组件才可通过 ref API拿到子组件暴露的数据。

效果展示:

参考链接:defineexpose的使用

在vue2中,通常会在子组件便签上加,ref来获取子组件的实例和属性方法,在 Vue3的script-setup 模式下,所有数据只是默认 return 给 template 使用,不会暴露到组件外,所以父组件是无法直接通过挂载 ref 变量获取子组件的数据。

如果要调用子组件的数据,需要先在子组件显示的暴露出来,才能够正确的拿到,defineExpose可以实现

1.父组件通过ref中访问子组件的方法、变量

2.子组件中,子组件的方法、变量需要通过defineExpose暴露出去

 代码:

<SelectMaterial ref="selectMaterial"></SelectMaterial>
const selectMaterial = ref();
const selectSystemMaterial = () => {//打开弹框selectMaterial.value.Open(true);
};

弹框组件:

//弹框组件封装<!-- >>> 打开新增弹框 --><MaintainTableDialogv-model:modelValue="data.isOpenDialog" //备注:弹框打开与否:footer="data.dialogTitle != '查看' ? data.isShowFooter : true":title="'维修项目新增'":dialogWidth="'50%'"><template #default><el-tableref="multipleTableRef":data="data.mytableData"  //备注:弹框表格的数据style="width: 100%"height="50vh":row-key="bindRowKeys"><el-table-columntype="selection"width="55":reserve-selection="true"></el-table-column><el-table-column type="index" label="序号" width="70" /><el-table-column prop="classifyName" label="设备分类" width="170" /><el-table-columnprop="no"label="项目编号"width="160":show-overflow-tooltip="true"/><el-table-columnprop="name"label="项目名称"width="190":show-overflow-tooltip="true"/><el-table-column prop="period" label="周期" width="100" /><el-table-column prop="manager" label="负责人" width="100" /></el-table></template><template #footer><div class="footer-btn"><el-buttontype="primary"@click="clickNewDialog":loading="data.isLoading"class="submit">确认</el-button><el-button @click="data.isOpenDialog = false">取消</el-button></div></template></MaintainTableDialog>
<script setup>
const Open = (isAdd) => {data.isOpenDialog = isAdd || true;data.mytableData = store.selectMaterilReqList;
};
//父组件中访问子组件的方法或者变量需要通过defineExpose暴露出去
defineExpose({Open,
});
</script>

写到这儿,以上就是difineExpose()的用法 。

以下是调取接口——数据回显——选中数据传参,可选看

 代码(打开弹框调取接口——数据回显):

const handleNew = () => {data.isOpenDialog = !data.isOpenDialog;const params = {shipGuid: data.ruleForm.shipGuid,category: 2,};console.log(data.AllTableData)api.getMaintainItems.post(params).then((res) => {// data.mytableData = res.data.data;//!!!提示:首先打开弹框把“多选”勾选的数据置空,因为在之后会赋值选中的效果multipleTableRef.value.clearSelection();let itemGuidLists=[]data.AllTableData.forEach(item=>{itemGuidLists.push(item.itemGuid)})console.log(itemGuidLists)data.mytableData=res.data.data.filter(item=>{if(itemGuidLists.indexOf(item.itemGuid)<0){//备注:只显示未勾选的。只显示未选择的return true  }else{return false}})// data.AllTableData.forEach((row) => {//   data.mytableData.map((item) => {//     if (row.itemGuid == item.itemGuid) {//备注:显示所有,并勾选计划内选中的。显示:有选中和未选择的//!!!提示:设为true,多选框选中//       multipleTableRef.value.toggleRowSelection(item, true);//     }//   });// });});
};

代码(选中传数据):

<el-buttontype="primary"@click="clickNewDialog":loading="data.isLoading"class="submit"
>确认
</el-button>
<script setup>
const clickNewDialog = (val) => {data.isOpenDialog = false;//关闭子弹框const selectData = multipleTableRef.value.getSelectionRows();//获取多选,选中的项,//比较子弹框传的 和 父列表展示的 ,不存在添加到父列表const guidData = data.AllTableData.map((item) => {return item.itemGuid;});selectData.map((item) => {// [].indexof() == -1 不存在if (guidData.indexOf(item.itemGuid) < 0) {data.AllTableData.push(item);}});
};
</script>

 四、inject注入式父子组件传参

父组件可以向子组件(无论层级)注入依赖,每个子组件都可以获得这个依赖,无论层级。

参考链接:依赖注入

 

代码:

//父组件
<script setup>
import { ref, provide } from 'vue'
import { fooSymbol } from './injectionSymbols'
provide('foo', 'bar')// 提供静态值
const count = ref(0)// 提供响应式的值
provide('count', count)
provide(fooSymbol, count)// 提供时将 Symbol 作为 key
provide('parentData', data.msg);// 提供默认值const data = reactive({msg: "我是父组件的数据",
})
</script>
//子组件
<script setup>
import { inject } from 'vue'
import { fooSymbol } from './injectionSymbols'// 注入不含默认值的静态值
const api = inject('parentData')
// 注入响应式的值
const count = inject('count')
// 通过 Symbol 类型的 key 注入
const foo2 = inject(fooSymbol)
// 注入一个值,若为空则使用提供的默认值
const bar = inject('foo', 'default value')
// 注入一个值,若为空则使用提供的函数类型的默认值
const fn = inject('function', () => {})</script>
<template><template><p>我是子组件</p><p>parent组件数据:{{api.parentData}}</p><p>parent组件数据:{{parentData}}</p>
</template>

写到这儿,以上就是注入依赖的用法。 

实际代码,可选看

在项目里,用到最多的是:

1、封装的axios,用于发起网络请求

2、封装的echart,用于调用原生的ecahrt

 在整个项目的main.js文件,

provide():提供一个值,可以被后代组件注入。

//main.js
import * as api from './api/index'
import * as echarts from 'echarts'
import App from './App.vue'
const app = createApp(App);
//演示:
app.provide('$api', api);
app.provide('$echarts', echarts);
app.mount('#app')

inject():注入一个由祖先组件或整个应用 (通过 app.provide()) 提供的值。 

//任何一个vue页面组件
<script setup>const api = inject("$api");//...调取接口api.某某const _echarts = inject("$echarts");myCharts = _echarts.init(myChart.value,{width:"100%",height:"100%",},{renderer: "svg",});window.addEventListener("resize", function () {myCharts && myCharts.resize();});
</script>

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/181865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卓越进行时 | 赛宁联合国家一流网络安全学院探索校企合作新模式

为进一步探索网络安全教育技术产业融合发展的新机制新模式&#xff0c;全方位培养适应行业企业需求的复合型、创新型高素质网络安全人才。11月28日&#xff0c;南京赛宁信息技术有限公司&#xff08;赛宁网安&#xff09;与东南大学以优化产教融合发展原则&#xff0c;决定加强…

C++设计模式——Bridge模式(下)

在上篇 《C设计模式——Bridge模式&#xff08;上&#xff09;》中我们对于桥接模式做了一些介绍。介于桥接模式在实际项目开发中使用广泛&#xff0c;而且也是面试中常问常新的话题。在本篇&#xff0c;我们专注bridge模式在具体的项目开发中的应用&#xff0c;举几个例子来说…

服务器修复

服务器修复 主要服务器漏洞展示未禁用sync、shutdown、halt默认账户。未创建系统管理员、审计管理员、安全管理员账户设置系统管理员设置安全管理员 设置审计管理员配置PASS_MAX_DAYS 99999、PASS_MIN_LEN 5未配置TMOUT值配置HISTSIZE0未配置登录失败/密码复杂度策略umask值022…

2021年2月18日 Go生态洞察:Go 1.16中的新模块变化

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

数字时代的表演艺术:TikTok如何重新定义舞台

在数字时代的潮流中&#xff0c;TikTok崭露头角&#xff0c;重新定义了表演艺术的舞台。这款短视频应用不仅改变了用户与内容的互动方式&#xff0c;也为艺术家和创作者提供了全新的表达平台。本文将深入探讨TikTok如何在数字时代重新定义舞台&#xff0c;以及它对表演艺术的深…

基于FPGA的五子棋游戏设计

基于FPGA的五子棋游戏设计 本文基于FPGA设计五子棋游戏&#xff0c;使用按键输入&#xff0c;使用VGA接口输出。五子棋的棋具与围棋相同&#xff0c;棋子分为黑白两色&#xff0c;棋盘为1010&#xff0c;棋子放置于棋盘线交叉点上。两人对局&#xff0c;各执一色&#xff0c;轮…

【IEEE出版】2024年第四届消费电子与计算机工程国际学术会议(ICCECE 2024)

2024年第四届消费电子与计算机工程国际学术会议&#xff08;ICCECE 2024&#xff09; 2024 4th International Conference on Consumer Electronics and Computer Engineering 进入21世纪以来&#xff0c;计算机技术的高速发展带来了消费电子产品的快速更迭。在技术迅速发展历…

关于免费SSL证书

JoySSL是一家提供免费SSL证书的服务商&#xff0c;它的免费SSL证书不仅包括单域名&#xff0c;还包括多域名和通配符的免费证书。这意味着&#xff0c;无论您是只有一个网站的个人用户&#xff0c;还是拥有多个子域名的企业用户&#xff0c;都可以在JoySSL找到适合您的免费SSL证…

\n\r:解析java中的\r、\n、\r\n、\n\r的区别

1 \r 1.1 内容 回车符,将光标定义到当前行行首 1.2 在idea中测试 1.2.1 表现形式 在\r后有新内容时,会先删除之前以前存在过的文本,即只打印\r后面的内容 1.2.2 示例代码 package Work; public class Test05 { public static void main(String[] args) { System.…

windows环境下载安装Nginx并配置防火墙

1、下载Nginx Nginx官网 下载稳定版 2、下载之后&#xff0c;解压 3、启动Nginx&#xff0c;命令&#xff1a;start nginx 最小化该窗口 主要&#xff0c;不要关闭&#xff0c;如果关闭&#xff0c;表示nginx服务关闭了 4、测试是否启动成功 在浏览器中输入http://localhos…

2021年09月 Scratch图形化(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 程序中要使用不确定的数值,这时要用到的是?( ) A、图章 B、变量 C、广播 D、随机数 答案:D 第2题 执行下列程序后,角色会说?( ) A、3 B、6 C、10 D、15 答案:D 第3题…

广州华锐视点:基于VR元宇宙技术开展法律法规常识在线教学,打破地域和时间限制

随着科技的飞速发展&#xff0c;人类社会正逐渐迈向一个全新的时代——元宇宙。元宇宙是一个虚拟的、数字化的世界&#xff0c;它将现实世界与数字世界紧密相连&#xff0c;为人们提供了一个全新的交流、学习和娱乐平台。在这个充满无限可能的元宇宙中&#xff0c;法律知识同样…

关于MongoDB

MongoDB介绍 MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。它支持的数据结构非常松散&#xff0c;因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大&#xff0c;其…

Panorama SCADA平台助力智能建筑管理,掌控未来建筑!

来源&#xff1a;宏集科技 工业物联网 宏集方案 Panorama SCADA平台助力智能建筑管理&#xff0c;掌控未来建筑&#xff01; 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 前言 在现代智能建筑管理中&#xff0c;随着设施管理&#xff08;FM&#xff09;、建筑管理…

数据结构与算法--特殊的完全二叉树--堆,堆排序,利用堆解决topk的问题

目录 前言 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树&#xff1a; 2.3 特殊的二叉树&#xff1a; 2.4 二叉树的性质 …

YOLOv7独家原创改进:自研独家创新MSAM注意力,通道注意力升级,魔改CBAM

💡💡💡本文自研创新改进:MSAM(CBAM升级版):通道注意力具备多尺度性能,多分支深度卷积更好的提取多尺度特征,最后高效结合空间注意力 1)作为注意力MSAM使用; 推荐指数:五星 MSCA | 亲测在多个数据集能够实现涨点,对标CBAM。 在道路缺陷检测任务中,原始ma…

基于STM32+定时器中断和定时器外部时钟(标准库函数讲解)

前言 本篇博客主要学习了解定时器的标准库函数&#xff0c;以及定时器中断进行LED灯的反转&#xff0c;还有定时器外部时钟获取脉冲计数功能。本篇博客大部分是自己收集和整理&#xff0c;如有侵权请联系我删除。 本篇博客主要是对通用定时器来讲解&#xff0c;功能适中比较常…

Java高级技术(注解)

一&#xff0c;注解 二&#xff0c;案例 三&#xff0c;注解原理 四&#xff0c;元注解 五&#xff0c;案例 六&#xff0c;解析注解 七&#xff0c;案例

unity UI特效遮罩

using System.Collections; using System.Collections.Generic; using UnityEngine;/**UI特效遮罩 1.需要将ScrollRect 的遮罩Mask 换为 2D Mask2.将特效的Render里面的 Masking 设置为*/ public class UIParticleMaskControll : MonoBehaviour {// Start is called before …

低代码平台:房企建造领域数字化转型的必备利器

在数字化浪潮的推动下&#xff0c;越来越多的行业开始向数字化转型迈进&#xff0c;房地产建筑管理也不例外。低代码平台作为一种新兴的技术趋势&#xff0c;正逐渐成为推进房地产建筑管理数字化转型的重要工具。 房地产建筑管理作为一个庞大而复杂的行业&#xff0c;数字化转…