vue ts 应用梳理

文章目录

  • 前言
  • 一、页面传值
    • 1.1 [props](https://cn.vuejs.org/guide/components/props.html)
    • 1.2 [emit](https://cn.vuejs.org/guide/components/events.html)
    • 1.3 [store](https://pinia.vuejs.org/zh/getting-started.html)
  • 二、实时计算
    • 2.1 [watch](https://cn.vuejs.org/guide/essentials/watchers.html)
    • 2.2 [computed](https://cn.vuejs.org/guide/essentials/computed.html)
    • 2.3 [nextTick](https://cn.vuejs.org/api/general.html#nexttick)
  • 三、数据处理
    • 3.1 foreach
    • 3.2 map
  • 四、[el-form校验](https://element-plus.org/zh-CN/component/form.html)
  • 总结


前言

基于ts vue 应用梳理

一、页面传值

父子组件相互传值调用相关

1.1 props

<script setup lang="ts" name="taskDelivery">
interface PropsType {eventData: { [key: string] };tableDisplay?: boolean;
}const props = withDefaults(defineProps<PropsType>(), { tableDisplay: true });
</script>
  • 定义子组件需要的参数,并默认tableDisplay为true
  • props在子组件中不可以被修改
  • tableDisplay?: boolean;表示父组件引用时改参数非必须
  • 参数定义的是驼峰格式,但是父组件引用传参需要用-的形式传入 :event-data="eventData"

1.2 emit

自定义事件,类似自定义一个click

  1. 父组件直接触发子组件定义事件。如A(父)组件要实现B(子)组件定义的按钮触发方法
<!-- 子组件事件定义 -->
<button @click="$emit('someEvent')">click me</button>
<!-- 父组件实现 -->
<MyComponent @some-event="callback" />
  1. 父组件实现事件响应,子组件自定义事件并使用
<!-- 子组件事件定义 -->
<script setup lang="ts">
const emit = defineEmits(['inFocus', 'submit'])function buttonClick() {emit('submit')
}
</script>
<!-- 父组件实现 -->
<MyComponent @submit="impl-submit(params)" />

1.3 store

persist.ts

import { PersistedStateOptions } from "pinia-plugin-persistedstate";/*** @description pinia 持久化参数配置* @param {String} key 存储到持久化的 name* @param {Array} paths 需要持久化的 state name* @return persist* */
const piniaPersistConfig = (key: string, paths?: string[], params?: {}) => {const persist: PersistedStateOptions = {key,// storage: localStorage,storage: sessionStorage,paths,...params};return persist;
};export default piniaPersistConfig;
import { defineStore } from "pinia";
import piniaPersistConfig from "@/stores/helper/persist";
import { getEventDetail } from "@/api/modules/eventServer";export const EventDataStore = defineStore({id: "eventData",state: () => ({eventData: {eventId: "",longitude: 0,latitude: 0,districtCode: ""}}),getters: {// 获取事件IDgetEventId: state => state.eventData.eventId},actions: {setEventData(info) {this.eventData = info;},async updateEventData() {const { data } = await getEventDetail(this.eventData.eventId);this.eventData = data;},async setEventDataByEventId(eventId) {const { data } = await getEventDetail(eventId);this.eventData = data;}},persist: piniaPersistConfig("eventData")
});
const eventDataStore = EventDataStore();function reportCreate() {analysisReportCreate(eventDataStore.eventData.eventId, "20").then(res => {if (res.status == 200) {ElMessage.info("报告生成成功");}});
}

将事件数据eventData保存到store中,供全局调用,并支持任何场景更新store

二、实时计算

2.1 watch

监听器,使用 watch 函数在每次响应式状态发生变化时触发回调函数

export interface ProTableProps {initParam?: any; // 初始化请求参数 ==> 非必传(默认为{})noWatchParam?: boolean; // 更改了initParam数据不请求接口
}// 接受父组件参数,配置默认值
const props = withDefaults(defineProps<ProTableProps>(), {initParam: {}
});
// 监听页面 initParam 改化,重新获取表格数据
watch(() => props.initParam,() => {if (props.noWatchParam) return;getTableList();},{ deep: true }
);

2.2 computed

计算属性描述依赖响应式状态的复杂逻辑,简单的计算逻辑<span>{{ author.books.length > 0 ? 'Yes' : 'No' }}</span>

<script setup>
import { reactive, computed } from 'vue'const author = reactive({name: 'John Doe',books: ['Vue 2 - Advanced Guide','Vue 3 - Basic Guide','Vue 4 - The Mystery']
})// 一个计算属性 ref
const publishedBooksMessage = computed(() => {return author.books.length > 0 ? 'Yes' : 'No'
})
</script><template><p>Has published books:</p><span>{{ publishedBooksMessage }}</span>
</template>

Vue 的计算属性会自动追踪响应式依赖。它会检测到 publishedBooksMessage 依赖于 author.books,所以当 author.books 改变时,任何依赖于 publishedBooksMessage 的绑定都会同时更新。

2.3 nextTick

当你在 Vue 中更改响应式状态时,最终的 DOM 更新并不是同步生效的,而是由 Vue 将它们缓存在一个队列中,直到下一个“tick”才一起执行。这样是为了确保每个组件无论发生多少状态改变,都仅执行一次更新。

nextTick() 可以在状态改变后立即使用,以等待 DOM 更新完成。你可以传递一个回调函数作为参数,或者 await 返回的 Promise。

三、数据处理

3.1 foreach

const topData = ref([{label: "点对点叫应",value: 38,img: chat,class: "team-traffic"},{label: "语音叫应",value: 29,img: audio,class: "expert-traffic"},{label: "视频叫应",value: 55,img: video,class: "resource-traffic"},{label: "短信通知",value: 12,img: msg,class: "equip-traffic"}
]);
function getStatistic() {demandStatistic(searchParam.value).then(res => {if (res.status === 200) {res.data.forEach((item, index) => {if (topData.value[index]) {topData.value[index].value = item.number;}});}});
}

foreach更新数据value

3.2 map

const initData = () => {postEventBaseList(param).then(res => {if (res.status === 200) {const { list } = res.data;const gradeMap = {"1": { grade: "grade-red", gradeLabel: "特" },"2": { grade: "grade-orange", gradeLabel: "重" },"3": { grade: "grade-yellow", gradeLabel: "较" },"4": { grade: "grade-blue", gradeLabel: "般" },"5": { grade: "grade-gray", gradeLabel: "其" }};data.value = list.map(l => {const { grade, gradeLabel } = gradeMap[l.eventLevelCode];return {...l,title: l.eventTitle,time: l.occurTime,tag: l.eventTypeCodeName,grade: grade,gradeLabel: gradeLabel,place: l.infoAddress};});}});
};

...l合并map

四、el-form校验

校验救援装备是否被选择,任务内容必填

<el-form ref="ruleFormRef" :model="taskForm" label-width="auto" class="demo-ruleForm" status-icon><el-divider content-position="left">事件信息</el-divider><div>{{ eventData.eventTitle }}</div><div>{{ eventData.infoDescription }}</div><el-divider content-position="left">队伍信息</el-divider><el-descriptions><el-descriptions-item label="救援装备"><el-link type="primary" @click="showEquList">选择队伍装备</el-link><el-form-item prop="equList" :rules="[{ required: true, message: '请选择队伍装备', trigger: ['change', 'blur'] }]"><span style="margin: 0px 10px" v-for="item in taskForm.equList" :key="item.id">{{ item.name }}:{{ item.num }}</span></el-form-item></el-descriptions-item></el-descriptions><el-divider content-position="left">任务内容</el-divider><el-form-item prop="taskContent" :rules="[{ required: true, message: '请输入任务内容', trigger: ['change', 'blur'] }]"><el-inputv-model="taskForm.taskContent"style="width: 100%":rows="2"type="textarea"placeholder="请输入任务内容"required/></el-form-item><div style="display: flex; flex-direction: row-reverse; margin: 15px"><el-button type="primary" size="small" @click="sendTask(data)">任务下发</el-button></div></el-form>
const ruleFormRef = ref();
function sendTask(data) {const params = {list: [{eventId: props.eventData.eventId,equList: taskForm.equList,taskContent: taskForm.taskContent}]};ruleFormRef.value.validate((valid, fields) => {if (valid) {sendTasks(params).then(res => {if (res.status == 200) {ElMessage.success("任务下发成功");//todo 刷新当前列表 点击返回要刷新调度记录dialogVisible.value = false;emits("submit");}});}});
}

总结

vue的应用的api和业务写法总体感觉杂而乱,各种组件拼接到一起的缝合怪,让人总感觉难以入手。
本文主要总结小白近期项目中遇到的一些基础写法,方便后面查找,不具有指导性意义


在这里插入图片描述

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

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

相关文章

lwip问题

1.stm32F407VET6Freertoslwip,通过socket接口创建UDP链接&#xff0c;只能创建4个 lwipopt.h opt.h MEMP_NUM_UDP_PCB&#xff1a;定义可以创建的UDP连接个数 MEMP_NUM_TCP_PCB&#xff1a;定义可以创建的TCP连接个数 MEMP_NUM_TCP_PCB_LISTEN&#xff1a;可以创建listening T…

ArcGISPro 如何升级某项Python库且不影响其运行

升级包scipy 可以看出scipy当前版本是1.6.2 利用不依赖包升级 pip install --upgrade scipy --no-deps 结果 但是显示还是之前的版本

RestTemplate 远程调用工具封装

一、 前言 我们平时在使用SpringCloud 、SpringCloudAlibaba 或其他微服务框架时&#xff0c;如果在同一个项目中可能会采用feign / openfeign &#xff0c;但是当把项目单独出来再去和原微服务架构体系进行集成时就不大灵活&#xff0c;今天我就介绍一种&#xff0c;远程调用…

Linux系统下关闭Java进程

关闭Java进程具体分为两步&#xff1a; 1.ps查进程ID 2.kill杀进程 具体的命令如下&#xff1a; ps查进程ID&#xff1a;ps -ef | grep java kill杀进程&#xff1a;kill -9 对应进程号 linux下解除被占用的端口号&#xff1a; 1.查看8088端口是否被占用&#xff1a; netsta…

【教程】iOS Swift应用加固

&#x1f512; 保护您的iOS应用免受恶意攻击&#xff01;在本篇博客中&#xff0c;我们将介绍如何使用HTTPCORE DES加密来加固您的应用程序&#xff0c;并优化其安全性。通过以下步骤&#xff0c;您可以确保您的应用在运行过程中不会遭受数据泄露和未授权访问的风险。 摘要 …

PD虚拟机软件下载:在 Mac 上流畅运行 Windows 游戏!

本想一台 MacBook 走天下&#xff0c;奈何有些软件仅提供了 Windows 端&#xff0c;在 macOS 上打不开 EXE 文件&#xff0c;比如炒股软件、会计软件、游戏、工科专业软件等。 由于苹果芯片架构的变化&#xff0c;新款 Mac 想要安装双系统已经不太现实&#xff0c;有没有更简单…

docker 搭建多个Linux系统环境 安装多个不同语言的项目

docker 搭建多个Linux系统环境 安装多个不同语言的项目 宝塔dockers可视化界面 https://blog.51cto.com/u_16213709/9473968

xss.pwnfunction-Jefff

在eval中可以直接执行命令所以直接把"直接闭合在结尾再加上一个"因为后面的"没闭和会报错 ?jeffa";alert(1);" 或 ?jeffa"-alert(1)-" -是分隔符

线段树和树状数组

实战演练 1.【模板】树状数【模板】树状数组1 输入&#xff1a; 5 5 1 5 4 2 3 2 2 4 1 2 3 2 2 3 4 1 1 5 1 2 1 4 注意&#xff1a;只修改一个数&#xff08;单点修改&#xff09;&#xff0c;却要输出一个区间的值&#xff08;区间查询&#xff09;&#xff01;&#xff…

SAP操作教程第14期:SAP B1如何进行自定义字段位置设置

服务对于企业而言永远是重中之重&#xff0c;想要提高服务呼叫效率&#xff0c;员工必须能够快速扫描单据和主数据中的重要信息&#xff0c;及时响应客户。那么&#xff0c;拥有适合企业业务流程的表单则是必不可少的前提。 所以&#xff0c;今天我们就来了解一下&#xff0c;在…

数据库连接查询

一、联合查询 1.使用 union 连接两个 select 语句进行联合查询 select 列 1&#xff0c;列 2... from 表名 where 条件 union select 列 1&#xff0c;列 2... from 表名 where 条 件; select vend_id,prod_id,prod_name,prod_price from products where prod_price < 5…

网络与通信Day1-路由协议

网络协议之路由协议 静态路由&#xff1a; 明细静态 默认静态 动态路由&#xff1a;&#xff08;可以自动去环&#xff09; RIP 十几台或几十台 &#xff08;维护上一代人搭建的网络&#xff09; OSPF 300台 &#xff08;最短路径算法&#xff09; ISIS 1200台 BGP…

学习brpc:echo服务

Echo同步客户端 server 端 #include <gflags/gflags.h> #include <json2pb/pb_to_json.h> #include <brpc/server.h> #include "butil/endpoint.h" #include "echo.pb.h"// flags&#xff0c;用于配置server DEFINE_bool(echo_attachm…

2024.3.27力扣每日一题——统计将重叠区间合并成组的方案数

2024.3.27 题目来源我的题解方法一 排序合并区间快速幂方法二 官方区间合并 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2580 我的题解 方法一 排序合并区间快速幂 先将ranges按第一个元素升序&#xff0c;再按第二个元素升序。然后采用合并区间的方式进行区间合并&…

maya获取所有节点的初始位置

目录 maya获取所有节点的初始位置 获取所有节点的 动画旋转位置 maya获取所有节点的初始位置 import maya.cmds as cmdsdef get_initial_pose(root_node):"""获取根节点及其所有子节点的初始姿态位置。参数:- root_node: 根节点的名称。返回值:- 一个包含节点…

[C++][算法基础]模拟堆(堆)

维护一个集合&#xff0c;初始时集合为空&#xff0c;支持如下几种操作&#xff1a; I x&#xff0c;插入一个数 x&#xff1b;PM&#xff0c;输出当前集合中的最小值&#xff1b;DM&#xff0c;删除当前集合中的最小值&#xff08;数据保证此时的最小值唯一&#xff09;&…

【云开发笔记NO.23】初步了解CODING-TSF-TKE

CODING-TSF-TKE的集成涉及的是腾讯云的产品。具体来说&#xff1a; CODING-TSF-TKE是腾讯云&#xff0c;腾讯公司提供的云服务。 定义&#xff1a; CODING&#xff1a;是腾讯云旗下一站式DevOps研发管理平台。它提供代码托管、项目协同、测试管理、持续集成、制品库、持续部署…

UE小:UE5.3无法创建C++工程

当您在使用Unreal Engine (UE) 构建项目时&#xff0c;如果遇到以下问题&#xff1a; Running C:/Program Files/Epic Games/UE\_5.3/Engine/Build/BatchFiles/Build.bat -projectfiles -project"C:/UEProject/Shp\_1/Shp\_1.uproject" -game -rocket -progress Usi…

如何在JavaScript中提高性能

在JavaScript中提高性能是一个涉及多个方面的任务&#xff0c;包括代码优化、数据结构选择、异步编程、避免全局查找、内存管理等。以下是一些关键的策略和技巧&#xff0c;可以帮助你提高JavaScript代码的性能&#xff1a; 1. 优化循环 使用for循环代替forEach&#xff0c;特…

设计模式:责任链模式

责任链模式是一种行为设计模式,允许你将请求沿着一条链传递,直到一个对象处理它为止。这种模式包含了一些处理对象,每个对象都包含逻辑来处理特定类型的命令或请求。如果一个对象不能处理该请求,它就会将请求传递给链中的下一个对象,如此类推。 定义 责任链模式通过定义…