vue3模块化引用组件和引用ts,调用ts中的接口

以简单的登录功能为例子
1.在util中创建loginValidators.ts
在这里插入图片描述

import { ref, reactive  } from 'vue'interface User{email: string;password: string;
}export const loginUser=reactive<User>({email: '',password: ''
})interface Rules{email: {required: boolean;message: string;trigger: string;}[];password: ({required: boolean;message: string;trigger: string;min?: undefined;max?: undefined;} | {min: number;max: number;message: string;trigger: string;required?: undefined;})[];
}
export const rules=reactive<Rules>({email: [{ required: true, message: '密码不得为空', trigger: 'blur' }// {//   required: true,//   type: 'email',//   message: 'email格式错误',//   trigger: 'blur'// }],password: [{ required: true, message: '密码不得为空', trigger: 'blur' },{ min: 6, max: 30, message: '密码长度必须在6到30之间', trigger: 'blur' }]
})

2.在登录页面中引用刚才创建的验证ts
在这里插入图片描述
在这里插入图片描述
3.创建登录组件
在这里插入图片描述
传入得参数(此步骤在登录界面引用登录组件后传入的参数:查看第4步骤)
引用这里插入图片描述
就可以使用ts中创建的参数
在这里插入图片描述
登录组件代码(可看可不看)

<template><!-- 登录 --><el-form:model="loginUser":rules="rules"ref="loginForm"label-width="100px"class="login-form sign-in-form"><el-form-item label="邮箱" prop="email"><el-input v-model="loginUser.email" placeholder="Enter Email..." /></el-form-item><el-form-item label="密码" prop="password"><el-inputv-model="loginUser.password"type="password"placeholder="Enter Password..."/></el-form-item><el-form-item><el-button@click="handleLogin('loginForm')"type="primary"class="submit-btn">提交</el-button></el-form-item><!-- 找回密码 --><el-form-item><p class="tiparea">忘记密码<a>立即找回</a></p></el-form-item></el-form>
</template><script lang="ts">
import { getCurrentInstance } from 'vue'
import { useRouter } from 'vue-router'
import { login } from '@/api/login'
export default {name: 'LoginForm',props: {loginUser: {type: Object,required: true},rules: {type: Object,required: true}},setup(props: any) {const router = useRouter()// 通过解构getCurrentInstance,获取this,这里的this就是ctx// @ts-ignoreconst { ctx,proxy } = getCurrentInstance()// 触发登录方法const handleLogin = (formName: string) => {console.log(ctx)ctx.$refs[formName].validate(async (valid: boolean) => {if (valid) {//await是等待的意思const res = await login(props.loginUser)// if(res==false){//   proxy.$message.warning("res是方法返回来的数据")// }else{//   proxy.$message.success("123")//   router.push('/home')// } proxy.$message.success("123")router.push('/home')} else {console.log('error submit!')return false}})}return { handleLogin }}
}
</script>
<style scoped>
/* register */
.login-form,
.register-form {background-color: #fff;padding: 50px 80px 20px 20px;border-radius: 5px;box-shadow: 0px 5px 10px #cccc;
}.submit-btn {width: 100%;
}
.tiparea {text-align: right;font-size: 12px;color: #333;width: 100%;
}
.tiparea a {color: #409eff;
}
</style>

4.在登录页面中引入登录组件
在这里插入图片描述

在这里插入图片描述
登录界面代码(可看可不看)

<template><div class="container" :class="{ 'sign-up-mode': signUpMode }"><!-- form表单容器 --><div class="form-container"><div class="signin-signup"><!-- 登录 --><LoginForm :loginUser="loginUser" :rules="rules"></LoginForm><!-- 注册 --><RegisterForm :registerUser="registerUser" :registerRules="registerRules"></RegisterForm></div></div><!-- 左右切换动画 --><div class="panels-container"><div class="panel left-panel"><div class="content"><h3>Row,row,row your boat</h3><p>Gentlely down the stream</p><button @click="signUpMode = !signUpMode" class="btn transparent">注册</button></div><!-- <img src="@/assets" alt=""> --></div><div class="panel right-panel"><div class="content"><h3>Merrily,merrily,merrily,merrily,</h3><p>Life is but a dream</p><button @click="signUpMode = !signUpMode" class="btn transparent">登录</button></div><!-- <img src="@/assets" alt=""> --></div></div><!-- <el-form:model="loginUser":rules="rules"ref="loginForm"label-width="100px"class="login-form sign-in-form"><el-form-item label="邮箱" prop="email"><el-input v-model="loginUser.email" placeholder="Enter Email..." /></el-form-item><el-form-item label="密码" prop="password"><el-inputv-model="loginUser.password"type="password"placeholder="Enter Password..."/></el-form-item><el-form-item><el-button type="primary" class="submit-btn" @click="handleLogin('loginForm')">提交</el-button></el-form-item><el-form-item><p class="tiparea">忘记密码<a>立即找回</a></p></el-form-item></el-form> --></div>
</template><script lang="ts">
import {ref,reactive,getCurrentInstance } from 'vue'
import {loginUser,rules} from '@/utils/loginValidators' //登录验证规则
import {registerUser ,registerRules } from '@/utils/registerValidator' //注册验证规则
import LoginForm from '@/components/LoginForm.vue' //登录组件
import RegisterForm from '@/components/RegisterForm.vue' //注册组件export default {name: 'LoginRegister',components:{LoginForm,RegisterForm},setup() {// 登录/注册模式const signUpMode = ref(false)// 通过解构getCurrentInstance,获取this,这里的this就是ctx// @ts-ignore// const { ctx } = getCurrentInstance()// const loginUser=reactive({//     email:'',//     password:''// })// //校验规则// const rules=reactive({//     email:[//         {//            required: true,//            type: 'email',//            message: 'email格式错误',//            trigger: 'blur'//         }//     ],//     password:[//         {required:true,message:'密码不能为空',trigger:'blur'},//         { min: 6, max: 30, message: '密码长度必须在6到30之间', trigger: 'blur' }//     ]// })//提交// const handleLogin=(formName:string)=>{//     console.log( ctx.loginUser.password)//     ctx.$refs[formName].validate((valid:boolean)=>{//         if (valid) {//             console.log("提交吧")//         }else{//             console.log("不提交了")//             return false//         }//     })// }return {signUpMode,loginUser,rules,registerUser,registerRules}}
}
</script>
<style scoped>
.container {position: relative;width: 100%;min-height: 100vh;background-color: #fff;overflow: hidden;
}
.form-container {position: absolute;left: 0;top: 0;width: 100%;height: 100%;
}
.signin-signup {position: relative;top: 50%;left: 75%;transform: translate(-50%, -50%);width: 44%;transition: 1s 0.7s ease-in-out;display: grid;grid-template-columns: 1fr;z-index: 5;
}/* 左右切换动画 */
.social-text {padding: 0.7rem 0;font-size: 1rem;
}.social-media {display: flex;justify-content: center;
}.social-icon {height: 46px;width: 46px;display: flex;justify-content: center;align-items: center;margin: 0 0.45rem;color: #333;border-radius: 50%;border: 1px solid #333;text-decoration: none;font-size: 1.1rem;transition: 0.3s;
}.social-icon:hover {color: #4481eb;border-color: #4481eb;
}.btn {width: 150px;background-color: #5995fd;border: none;outline: none;height: 49px;border-radius: 49px;color: #fff;text-transform: uppercase;font-weight: 600;margin: 10px 0;cursor: pointer;transition: 0.5s;
}.btn:hover {background-color: #4d84e2;
}
.panels-container {position: absolute;height: 100%;width: 100%;top: 0;left: 0;display: grid;grid-template-columns: repeat(2, 1fr);
}.container:before {content: '';position: absolute;height: 2000px;width: 2000px;top: -10%;right: 48%;transform: translateY(-50%);background-image: linear-gradient(-45deg, #4481eb 0%, #04befe 100%);transition: 1.8s ease-in-out;border-radius: 50%;z-index: 6;
}.image {width: 100%;transition: transform 1.1s ease-in-out;transition-delay: 0.4s;
}.panel {display: flex;flex-direction: column;align-items: flex-end;justify-content: space-around;text-align: center;z-index: 6;
}.left-panel {pointer-events: all;padding: 3rem 17% 2rem 12%;
}.right-panel {pointer-events: none;padding: 3rem 12% 2rem 17%;
}.panel .content {color: #fff;transition: transform 0.9s ease-in-out;transition-delay: 0.6s;
}.panel h3 {font-weight: 600;line-height: 1;font-size: 1.5rem;
}.panel p {font-size: 0.95rem;padding: 0.7rem 0;
}.btn.transparent {margin: 0;background: none;border: 2px solid #fff;width: 130px;height: 41px;font-weight: 600;font-size: 0.8rem;
}.right-panel .image,
.right-panel .content {transform: translateX(800px);
}/* ANIMATION */.container.sign-up-mode:before {transform: translate(100%, -50%);right: 52%;
}.container.sign-up-mode .left-panel .image,
.container.sign-up-mode .left-panel .content {transform: translateX(-800px);
}.container.sign-up-mode .signin-signup {left: 25%;
}.container.sign-up-mode form.sign-up-form {opacity: 1;z-index: 2;
}.container.sign-up-mode form.sign-in-form {opacity: 0;z-index: 1;
}.container.sign-up-mode .right-panel .image,
.container.sign-up-mode .right-panel .content {transform: translateX(0%);
}.container.sign-up-mode .left-panel {pointer-events: none;
}.container.sign-up-mode .right-panel {pointer-events: all;
}@media (max-width: 870px) {.container {min-height: 800px;height: 100vh;}.signin-signup {width: 100%;top: 95%;transform: translate(-50%, -100%);transition: 1s 0.8s ease-in-out;}.signin-signup,.container.sign-up-mode .signin-signup {left: 50%;}.panels-container {grid-template-columns: 1fr;grid-template-rows: 1fr 2fr 1fr;}.panel {flex-direction: row;justify-content: space-around;align-items: center;padding: 2.5rem 8%;grid-column: 1 / 2;}.right-panel {grid-row: 3 / 4;}.left-panel {grid-row: 1 / 2;}.image {width: 200px;transition: transform 0.9s ease-in-out;transition-delay: 0.6s;}.panel .content {padding-right: 15%;transition: transform 0.9s ease-in-out;transition-delay: 0.8s;}.panel h3 {font-size: 1.2rem;}.panel p {font-size: 0.7rem;padding: 0.5rem 0;}.btn.transparent {width: 110px;height: 35px;font-size: 0.7rem;}.container:before {width: 1500px;height: 1500px;transform: translateX(-50%);left: 30%;bottom: 68%;right: initial;top: initial;transition: 2s ease-in-out;}.container.sign-up-mode:before {transform: translate(-50%, 100%);bottom: 32%;right: initial;}.container.sign-up-mode .left-panel .image,.container.sign-up-mode .left-panel .content {transform: translateY(-300px);}.container.sign-up-mode .right-panel .image,.container.sign-up-mode .right-panel .content {transform: translateY(0px);}.right-panel .image,.right-panel .content {transform: translateY(300px);}.container.sign-up-mode .signin-signup {top: 5%;transform: translate(-50%, 0);}
}@media (max-width: 570px) {form {padding: 0 1.5rem;}.image {display: none;}.panel .content {padding: 0.5rem 1rem;}.container {padding: 1.5rem;}.container:before {bottom: 72%;left: 50%;}.container.sign-up-mode:before {bottom: 28%;left: 50%;}
}/* 控制login & register显示 */
form {padding: 0rem 5rem;transition: all 0.2s 0.7s;overflow: hidden;
}form.sign-in-form {z-index: 2;
}form.sign-up-form {opacity: 0;z-index: 1;
}/* register */
.loginForm,
.registerForm {margin-top: 20px;background-color: #fff;padding: 20px 40px 20px 20px;border-radius: 5px;box-shadow: 0px 5px 10px #cccc;
}.submit-btn {width: 100%;
}
.tiparea {text-align: right;font-size: 12px;color: #333;width: 100%;
}
.tiparea a {color: #409eff;
}
</style>

5.创建接口login.ts
在这里插入图片描述
自定义方法和接口方法 对应注释的部分

import axios from '@/utils/http'// 注册接口
//接口方法
export function login(params: any) {return axios({url: '/api/v1/auth/register',method: 'post',headers: {'Content-Type': 'application/json;charset=UTF-8'},data: params})
}
//自定义方法
// export function login(params: any) {
//   console.log(params)
//   if(params.email=="123456" && params.password=="123456"){
//     return true
//   }else{
//     return false
//   }
// }

6.提交方法(引用ts)
在这里插入图片描述
对应注释的部分
在这里插入图片描述

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

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

相关文章

可视化展示与交互编辑:探索3D Web轻量化平台HOOPS WEB Platform在BIM中的新可能性

随着数字技术的飞速发展&#xff0c;建筑行业也在不断迈向数字化转型的道路。在这个过程中&#xff0c;BIM&#xff08;Building Information Modeling&#xff0c;建筑信息模型&#xff09;技术已经成为建筑设计、施工和管理领域中的一项重要工具。 而在BIM的应用中&#xff…

金融知识分享系列之:MACD指标精讲

金融知识分享系列之&#xff1a;MACD指标精讲 一、MACD指标二、指标原理三、MACD指标参考用法四、MACD计算步骤五、MACD分析要素六、根据快线DIF位置判断趋势七、金叉死叉作为多空信号八、快线位置交叉信号九、指标背离判断行情反转十、差离值的正负十一、差离值的变化十二、指…

Nacos源码流程图

1.Nacos1.x版本服务注册与发现源码 流程图地址&#xff1a;https://www.processon.com/view/link/634695eb260d7157a7bc6adb 2.Nacos2.x版本服务注册与发现源码 流程图地址&#xff1a;https://www.processon.com/view/link/634695fb260d7157a7bc6ae0 3.Nacos2.x版本GRPC…

【海贼王的数据航海】排序——直接选择排序|堆排序

目录 1 -> 选择排序 1.1 -> 基本思想 1.2 -> 直接选择排序 1.2.1 -> 代码实现 1.3 -> 堆排序 1.3.1 -> 代码实现 1 -> 选择排序 1.1 -> 基本思想 每一次从待排序的数据元素中选出最小(或最大)的一个元素&#xff0c;存放在序列的起始位置&…

315 腾讯测开一面

问题复盘 1.TCP和UDP的区别&#xff1b;网络中七层协议详细解释 2.cookie和session的区别——python中request的用法 3.cookie和session的生命周期 cookie的生命周期&#xff1a; 持久性cookie&#xff1a;如果创建时指定了过期时间&#xff08;‘Expires’属性&#xff0…

STL:List从0到1

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

MySQL-----事务

一 事务简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一 个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 例如:银行转账 张三 ---(转账1000元)---> 李四 在进行…

.NET开源快速、强大、免费的电子表格组件

今天大姚给大家分享一个.NET开源&#xff08;MIT License&#xff09;、快速、强大、免费的电子表格组件&#xff0c;支持数据格式、冻结、大纲、公式计算、图表、脚本执行等。兼容 Excel 2007 (.xlsx) 格式&#xff0c;支持WinForm、WPF和Android平台&#xff1a;ReoGrid。 项…

Spring Chache入门详解、配套小案例

简介&#xff1a;Spring Cache是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要添加一个注解就能实现缓存功能。 Spring Cache提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;如下&#xff1a; EHCacheCaffeineRedis (这篇帖子&#xff…

下载指定版本的pytorch

下载网址&#xff1a;https://download.pytorch.org/whl/torch_stable.html 参考博客网址&#xff1a;https://blog.csdn.net/wusuoweiieq/article/details/132773977

基于C++的反射功能

需求&#xff1a; 利用C的发射机制&#xff0c;实现根据字符串创建实例对象。 代码&#xff1a; #ifndef OBJECT_H #define OBJECT_H#include <string> #include <map>typedef void* (*Constructor)();class CObjectFactory { public:static void registerClass…

【Git版本控制系统】:起步

目录 前言 版本控制 集中式与分布式的区别 Windows安装Git 核心 文件状态 工作区域 基本工作流程 配置用户信息 获取帮助 在线资源 前言 本篇文件的环境是Windows环境下实现。 在日常工作中git少不了&#xff0c;所以编写本篇文章介绍Git基础&#xff0c;专栏会不…

Linux/secret

Enumeration nmap 第一次扫描发现系统对外开放了22&#xff0c;80和3000端口&#xff0c;端口详细信息如下 可以看到22端口对应的是ssh服务&#xff0c;80和3000都是http服务&#xff0c;80端口使用nginx&#xff0c;3000使用了Node.js TCP/80 可以先从80端口开始探索&…

网络原理(1)——UDP协议

目录 一、应用层 举个例子&#xff1a;点外卖 约定数据格式简单粗暴的例子 客户端和服务器的交互&#xff1a; 序列化和返序列化 xml、json、protobuffer 1、xml 2、json 3、protobuffer 二、传输层 端口 端口号范围划分 认识知名的端口号 三、UDP协议 端口 U…

数据结构之顺序表(包学包会版)

目录 1.线性表 2.顺序表 2.1概念及结构 2.2接口实现 3.总结 halo&#xff0c;又和大家见面了&#xff0c;今天要给大家分享的是顺序表的知识&#xff0c;跟着我的脚步&#xff0c;包学包会哦~ 规矩不乱&#xff0c;先赞后看&#xff01; ps&#xff1a;&#xff08;孙权…

【MMDetection3D实战5】Dataset 和 model配置文件解析

文章目录 1. Dataset 配置文件解析1. 1 定义全局变量1. 1 数据处理pipeline(1) train_pipeline(2) test_pipeline(3) eval_pipeline1. 2 data 字典的定义2. model 配置文件解析2. 1 体素化voxel_layer2. 2 voxel_encoder2. 3 middle_encoder2. 4 2D 检测网络(backbone + neck …

详解(实现)堆的接口函数

文章目录 堆堆的顺序存储 准备工作创建头文件Heap.h创建源文件Heap.c头文件的包含定义保存堆数据的结构体 初始化销毁堆插入数据向上调整算法图解算法代码 删除堆顶向下调整算法图解代码 取出堆顶数据求堆的数据个数判断堆是否为空全部代码Heap.hHeap.c 再了解堆之前我们先要了…

AI毕业论文降重GPTS,避免AI检测,高效完成论文

视频演示 AI毕业论文降重GPTS&#xff0c;避免AI检测&#xff0c;高效完成论文&#xff01; 开发目的 “毕业论文降重”GPTS应用&#xff0c;作用为&#xff1a;重新表述学术论文&#xff0c;降低相似性评分&#xff0c;避免AI检测。 使用地址 地址&#xff1a;毕业论文降重…

unraid docker.img扩容

unraid 弹Docker image disk utilization of 99%&#xff0c;容器下载/更新失败 我的版本是6.11.5&#xff0c;docker.img满了导致容器不能更新&#xff0c;遇到同样问题的可以先用docker命令清除一下仓库(当然不一定能清理出来&#xff0c;我已经清理过只清理出来1G多点&…