tnblog
首页
视频
资源
登录

vue3 ts 方法传参,any使用。vue3 ts reactive 使用类型,定义具体类型。vue3 ts实现分组, 多字段作为key分组,二级分组,多级分组,子级分组

2493人阅读 2024/4/29 11:52 总访问:820414 评论:0 收藏:0 手机
分类: 前端

vue3 ts 方法传参,any使用

方法1:

  1. // 循环解析
  2. dataListToAppend.forEach((element: any) => {
  3. state.tasksPlanList.push(element)
  4. });

方法2:

  1. const deleteRow = (index: number, allotTaskID: number) => {
  2. }

方法3:

  1. const saveTaskPlan = (tasksPlanList: any) => {
  2. }

方法4:

  1. const state = reactive({
  2. taskCATList: [] as any[],
  3. }
  4. })

5:父子组件传参中关于any的使用

  1. const props = defineProps({
  2. schoolId: String,
  3. taskIds: {
  4. type: [] as any,
  5. default:[]
  6. }
  7. })

vue3 ts reactive 使用类型,定义类型

写法一

定义类型:

  1. interface keyFocusItem {
  2. teacherName: string;
  3. className: string;
  4. courseName: string;
  5. describe: string;
  6. classID: string;
  7. type: string;
  8. }

初始化:

  1. const state = reactive({
  2. // 初始化,并且指定了类型
  3. warring_exception_miniProgram:new Array<keyFocusItem>()
  4. })
写法二

定义一个类型:

  1. // 根据班级id与班级名称分组之后的类型
  2. interface GroupedItem {
  3. className: string;
  4. items: keyFocusItem[];
  5. }

在vue3 中指定类型:

  1. const state = reactive({
  2. warring_exception_miniProgram: new Array<keyFocusItem>(),
  3. // 给classGroupedItems指定类型
  4. classGroupedItems:{} as Record<string, GroupedItem>
  5. })
写法三

还可以考虑这种写法:

  1. const completeList = ref<Array<any>>([])

vue3 ts实现分组

单字段分组,根据classId分组

定义类型,与方法定义:

  1. const state = reactive({
  2. // 初始化,并且指定了类型
  3. warring_exception_miniProgram:new Array<keyFocusItem>()
  4. })
  5. interface keyFocusItem {
  6. teacherName: string;
  7. className: string;
  8. courseName: string;
  9. describe: string;
  10. classID: string;
  11. type: string;
  12. }
  13. const groupWay =
  14. {
  15. // 根据班级id分组
  16. groupByClassId(people: keyFocusItem[]): { [classID: number]: keyFocusItem[] } {
  17. return people.reduce((groups, person) => {
  18. // 如果当前班级组还不存在,则初始化一个空数组
  19. if (!groups[person.classID]) {
  20. groups[person.classID] = [];
  21. }
  22. // 将人添加到相应的班级组
  23. groups[person.classID].push(person);
  24. // 返回更新后的分组对象
  25. return groups;
  26. }, {} as { [classID: number]: keyFocusItem[] }); // 使用类型断言来明确返回值的类型
  27. }
  28. }

使用:

  1. console.log("看看分组之后的数据", groupWay.groupByClassId(warring_exception_miniProgram))

多字段作为key分组,根据classId与className分组,而且分组之后可以方便取出来className

示例代码如下:

  1. interface KeyFocusItem {
  2. teacherName: string;
  3. className: string;
  4. courseName: string;
  5. describe: string;
  6. classID: string;
  7. type: string;
  8. }
  9. interface GroupedItem {
  10. className: string;
  11. items: KeyFocusItem[];
  12. }
  13. function groupByClassIDAndClassName(items: KeyFocusItem[]): Record<string, GroupedItem> {
  14. return items.reduce((groups, item) => {
  15. // 组合 classID 和 className 作为分组键
  16. const key = `${item.classID}_${item.className}`;
  17. // 如果当前组还不存在,则初始化为一个空数组
  18. if (!groups[key]) {
  19. groups[key] = {
  20. className: item.className, // 存储 className
  21. items: [] // 存储该组的所有 items
  22. };
  23. }
  24. // 将当前项添加到对应的组中
  25. groups[key].items.push(item);
  26. // 返回更新后的分组对象
  27. return groups;
  28. }, {}); // 初始分组对象为空对象
  29. }
  30. // 示例使用
  31. const keyFocusItems: KeyFocusItem[] = [
  32. // ... 这里是你的 keyFocusItem 数组
  33. ];
  34. const groupedItems = groupByClassIDAndClassName(keyFocusItems);
  35. // 输出分组结果(仅用于演示)
  36. for (const [key, value] of Object.entries(groupedItems)) {
  37. console.log(`分组Group Key: ${key}`);
  38. console.log(`分组Class Name: ${value.className}`); // 直接访问 className
  39. console.log(value.items); // 访问该组的所有 items
  40. console.log('---');
  41. }

多字段作为key分组之后在vue3中解析

核心的ts逻辑:
  1. const state = reactive({
  2. // ....其他类型
  3. warring_exception_miniProgram: new Array<keyFocusItem>(),
  4. // 给classGroupedItems指定类型
  5. classGroupedItems:{} as Record<string, GroupedItem>
  6. })
  7. interface keyFocusItem {
  8. teacherName: string;
  9. className: string;
  10. courseName: string;
  11. describe: string;
  12. classID: string;
  13. type: string;
  14. }
  15. // 根据班级id与班级名称分组之后的类型
  16. interface GroupedItem {
  17. className: string;
  18. items: keyFocusItem[];
  19. }
  20. // 分组函数
  21. const groupWay =
  22. {
  23. // 根据班级id与班级名称分组
  24. groupByClassIDAndClassName(items: keyFocusItem[]): Record<string, GroupedItem> {
  25. return items.reduce((groups, item) => {
  26. // 组合 classID 和 className 作为分组键
  27. const key = `${item.classID}_${item.className}`;
  28. // 如果当前组还不存在,则初始化为一个空数组
  29. if (!groups[key]) {
  30. groups[key] = {
  31. className: item.className, // 存储 className
  32. items: [] // 存储该组的所有 items
  33. };
  34. }
  35. // 将当前项添加到对应的组中
  36. groups[key].items.push(item);
  37. // 返回更新后的分组对象
  38. return groups;
  39. }, {}); // 初始分组对象为空对象
  40. }
  41. }
  42. // 添加数据的内容,换成自己的具体逻辑
  43. state.warring_exception_miniProgram.push({
  44. teacherName: prodElement.teacherName, className: className, courseName: lessonName,
  45. describe: prodElement.prodName + "课程项目已结束,有" + prodElement.waiteAuditedCount + "个待审批项",
  46. classID: prodElement.classID,
  47. type: "exception"
  48. });
  49. console.log("看看处理的warring_exception_miniProgram数据", state.warring_exception_miniProgram);
  50. let classGroupedItems = groupWay.groupByClassIDAndClassName(state.warring_exception_miniProgram)
  51. console.log("看看分组之后的数据", classGroupedItems);
  52. state.classGroupedItems = classGroupedItems
  53. // 测试循环输出分组之后的内容
  54. for (const [key, value] of Object.entries(classGroupedItems)) {
  55. console.log(`分组key Group Key: ${key}`);
  56. console.log(`分组Class Name: ${value.className}`); // 直接访问 className
  57. console.log(value.items); // 访问该组的所有 items
  58. console.log(value.items.length); // items的长度
  59. console.log('---');
  60. }
在vue3页面中去解析数据:
  1. <view class="event-list">
  2. <uni-collapse accordion v-model="state.curOpen">
  3. <uni-collapse-item :class="{ 'waring': value.items.length >= 5 }" v-for="[key, value] in Object.entries(state.classGroupedItems)"
  4. :key="key" class="c-item" title-border="none" :border="false">
  5. <template v-slot:title>
  6. <view class="item-title">{{value.className}} 重点关注问题{{value.items.length}}个</view>
  7. </template>
  8. <view class="content">
  9. <view class="e-list-box">
  10. <view class="e-item" v-for="(ev, ei) in value.items" :key="ei + 'e-item'"
  11. :style="{ backgroundImage: `url(${CssImgPath}/imgs/waring.png)` }">
  12. <view class="e-course">{{ ei + 1 }}、{{ev.courseName}}({{ev.teacherName}}) </view>
  13. <view class="e-c-event">{{ev.describe}}</view>
  14. </view>
  15. </view>
  16. </view>
  17. </uni-collapse-item>
  18. </uni-collapse>
  19. </view>
解析出来的效果图

二级分组,多级分组,子级分组

就是分组里边还需要分组的情况,直接贴代码。这里的例子是先通过不同接口出来的数据,合并成一个新的数据后,先根据班级分组,然后在根据课程分组,所以就需要处理两级分组的情况。

  1. watchPostEffect(() => {
  2. state.stid = prop.curSchool.stid
  3. return Promise.all([
  4. ac.getKeyFocusLabRoomTeacher(),
  5. ac.getKeyFocusEvalTeacher(),
  6. ]).then((res: any) => {
  7. console.log("看看合并出来的数据。。。。。", state.keyFocusItemList)
  8. let classGroupData = groupWay.groupByClassID(state.keyFocusItemList)
  9. console.log("看看根据班级分组后的数据。。。。。", classGroupData)
  10. // 处理一下子级的分组,根据课程分组之后的数据
  11. for(let item in classGroupData)
  12. {
  13. classGroupData[item].courseGroups = groupWay.groupByCourseID(classGroupData[item].items)
  14. }
  15. console.log("看看二级分组之后的数据",classGroupData)
  16. })
  17. })
  18. // 根据班级id与班级名称分组之后的类型
  19. interface GroupedItem {
  20. className: string;
  21. items: keyFocusItem[];
  22. // 根据课程分组之后存储的数据
  23. courseGroups:Record<string, CourseGroupedItem>;
  24. }
  25. // 根据课程分组之后的数据
  26. interface CourseGroupedItem {
  27. courseName: string;
  28. items: keyFocusItem[];
  29. }
  30. interface keyFocusItem {
  31. classID: string;
  32. className: string;
  33. lessionId: string;
  34. courseName: string;
  35. describe: string;
  36. // 类型 1:评估,2:实验,3:产教 (为了方便后续排序弄成一个数字)
  37. type: string;
  38. goalAchievementRate: number;
  39. }
  40. // 分组函数
  41. const groupWay =
  42. {
  43. // 根据班级id分组
  44. groupByClassID(items: keyFocusItem[]): Record<string, GroupedItem> {
  45. return items.reduce((groups, item) => {
  46. const key = item.classID;
  47. if (!groups[key]) {
  48. groups[key] = {
  49. className: item.className,
  50. items: []
  51. };
  52. }
  53. groups[key].items.push(item);
  54. return groups;
  55. }, {});
  56. },
  57. // 根据课程id分组
  58. groupByCourseID(items: keyFocusItem[]): Record<string, CourseGroupedItem> {
  59. return items.reduce((groups, item) => {
  60. const key = item.lessionId;
  61. if (!groups[key]) {
  62. groups[key] = {
  63. courseName: item.courseName,
  64. items: []
  65. };
  66. }
  67. groups[key].items.push(item);
  68. return groups;
  69. }, {});
  70. },
  71. }
  72. const ac = {
  73. getKeyFocusLabRoomTeacher: function () {
  74. return Http.get('/labroom/api/xx/GetKeyFocusTeacher', { StdetailID: state.stid, IncludeAll: false }).then((res: any) => {
  75. console.log("实验老师重点关注数据:", res)
  76. state.teachingDynamics = res.data
  77. for (let index = 0; index < res.data.length; index++) {
  78. const element = res.data[index];
  79. for (let courseIndex = 0; courseIndex < element.keyFocusTeacherOutPuts.length; courseIndex++) {
  80. const courseItem = element.keyFocusTeacherOutPuts[courseIndex];
  81. state.keyFocusItemList.push({
  82. classID: element.classID,
  83. className: element.className,
  84. lessionId: courseItem.lessonID,
  85. courseName: courseItem.courseName,
  86. describe: courseItem.describe,
  87. type: "1",
  88. goalAchievementRate: courseItem.mustDoGoalAchievementRate
  89. })
  90. }
  91. }
  92. })
  93. },
  94. getKeyFocusEvalTeacher: function () {
  95. return Http.get('/evaluation/api/yy/GetKeyFocusTeacher', { STID: state.stid }).then((res: any) => {
  96. console.log("评估老师重点关注数据:", res)
  97. for (let index = 0; index < res.data.length; index++) {
  98. const element = res.data[index];
  99. for (let courseIndex = 0; courseIndex < element.childList.length; courseIndex++) {
  100. const courseItem = element.childList[courseIndex];
  101. state.keyFocusItemList.push({
  102. classID: element.classID,
  103. className: element.className,
  104. lessionId: "fc95c4d9c1e54a198ef2173f584fa9f8",
  105. // lessionId:courseItem.lessonID,
  106. courseName: courseItem.lessonName,
  107. describe: courseItem.remark,
  108. type: "0",
  109. goalAchievementRate: courseItem.planCompletePr
  110. })
  111. }
  112. }
  113. })
  114. }
  115. }

更多使用可以参考阿里云盘的实例存储


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

vue3 ts 类型never 上不存在属性

这样解决就行了: const state = reactive({ taskList: [] as any[], // 如果是对象集合这样写 detail: null as any...

vue3 ts uni-app 微信小程序 生命周期函数。uni-app 动态修改页面的titleheader里边的title

vue3 ts uni-app 生命周期函数import { onLoad, onShow,onUnload } from &#39;@dcloudio/uni-app&#39; onLoad(() =&gt; ...

vue3 ts uni-app 微信小程序 抽屉菜单的使用。抽屉菜单的打开关闭。基本模板。解决抽屉菜单的滚动穿透

代码如下: &lt;template&gt; &lt;!-- 解决滚动穿透 --&gt; &lt;page-meta :page-style=&quot;&#39;overflow:&...

NET Core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

使用OLEDB读取不同版本Excel的连接字符串设置

使用OleBD读取excel的时候,excel不同的版本,连接字符串的写法也会不一样。///&lt;summary&gt; ///读取excel ///&lt;/su...

C 使用CancellationTokenSource取消多线程

有时间我们在使用多线程的时候,需要取消线程的执行,可以使用CancellationTokenSource来取消对Task开辟多线程的取消如下:...

使用爬虫刷csdn博客访问量

首先了解一下常见反爬虫的检测方法频率监测:有些网站会设置一种频率监测的机制,对于同一IP,若在一定时间内访问的速度超...

Idea下使用maven搭建SSM(一):SpringMVC

Spring MVC是一款基于MVC架构模式的轻量级Web框架,其目的是将Web开发模块化,对整体架构进行解耦,简化Web开发流程。下面...

Idea下使用maven搭建SSM(二):MyBatis

开发Web应用,数据的存储和处理往往离不开数据库和SQL语句。在使用Java开发的Web应用中,自然也少不了连接数据库的步骤。在...

使用 微软自带语音合成类库

//引入语音合成名称空间 usingSystem.Speech.Synthesis; classA { voidtest1() { //实例化并指定字符串播放合成读音 ...

如何使用图标像使用文字一样使用文本图标的方法

1.首先在Iconfont-阿里巴巴矢量图标库上面找到你需要的图标然后加入你的购物车然后选择图标;注意:每个类型的图标会大小不...

使用七牛云的cdn服务提高图片的加载速度

CDN介绍CDN的全称是Content Delivery Network,即内容分发网络。CDN加速主要是加速静态资源,如网站上面上传的图片、媒体,...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

使用OutLook发送邮件

publicstaticvoidOutlook(stringSubject,stringTextBody,stringFromAdd,stringFromPass,stringTo,stringCC,List&lt;string&...

SQL Server 中使用游标

--声明一个游标 DECLAREMyCursorCURSOR FORSELECTTOP5FBookName,FBookCodingFROMTBookInfo//定义一个叫MyCursor的游标,...
这一生多幸运赶上过你.
排名
8
文章
219
粉丝
7
评论
7
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术