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,一经查实,立即删除!

相关文章

P8752 [蓝桥杯 2021 省 B2] 特殊年份 Python

[蓝桥杯 2021 省 B2] 特殊年份 题目描述 今年是 2021 年&#xff0c;2021 这个数字非常特殊, 它的千位和十位相等, 个位比百位大 1 1 1&#xff0c;我们称满足这样条件的年份为特殊年份。 输入 5 5 5 个年份&#xff0c;请计算这里面有多少个特殊年份。 输入格式 输入 …

可视化展示与交互编辑:探索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位置判断趋势七、金叉死叉作为多空信号八、快线位置交叉信号九、指标背离判断行情反转十、差离值的正负十一、差离值的变化十二、指…

蓝桥杯2023年-平均(小根堆)

题目描述 有一个长度为 n 的数组&#xff08;n 是 10 的倍数&#xff09;&#xff0c;每个数 ai 都是区间 [0, 9] 中的整数。小明发现数组里每种数出现的次数不太平均&#xff0c;而更改第 i 个数的代价为bi&#xff0c;他想更改若干个数的值使得这 10 种数出现的次数相等&…

执行任务赚积分C卷(JavaPythonC++Node.jsC语言)

现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。 每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。 可用于处理任务的时间有限,请问在有限的时间内,可获得的最多积分。 输入描述 第一…

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…

Linux学习-c项目-俄罗斯方块

目录 vi 操作 printf输出颜色 stty命令 vi 操作 批量修改代码&#xff0c;用一个代码替代另一个代码 &#xff1a;从第几行&#xff0c;到第几行s/string1/string2/g printf输出颜色 linux下终端的字符颜色由转义序列控制&#xff0c;是文本模式下的系统显示功能&#x…

STL:List从0到1

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

Spring Boot实现热部署有哪几种方式

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:SpringBoot 实现热部署有哪几种方式 Spring Boot实现热部署有几种方式,包括使用Spring Boot DevTools、Spring Loaded、JRebel等工具。以下将详细…

已解决org.apache.zookeeper.KeeperException.BadVersionException异常的正确解冲方法,亲测有效!!!

已解决org.apache.zookeeper.KeeperException.BadVersionException异常的正确解冲方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 总结 博主v&#xff1a;XiaoMing_Java 问题分析 在使用Apache ZooKeeper进行…

MySQL-----事务

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

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

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

while语句的实际应用(2)

3150&#xff1a;【例25.2】 26个兄弟姐妹2 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6770 通过数: 4845 【题目描述】 26个字母26枝花&#xff0c;26个兄弟姐妹是一家&#xff0c;大写字母与小写字母不分家。试编一程序&#xff0c;按顺序输出26个小写英文…

linux配置大数据环境

linux配置大数据环境 修改主机名 hostnamectl set-hostname xxx配置 yum [rootlocalhost ~]# mkdir /mnt/cdrom [rootlocalhost ~]# df /mnt/cdrom 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/sda3 39517336 7718416 31798920 20% /[rootlocalhost…

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…

分布式链路追踪(一)SkyWalking(2)使用

一、使用方法 1、简介 agent探针可以让我们不修改代码的情况下&#xff0c;对Java应用上使用到的组件进行动态监控&#xff0c;获取运行数据发送到OAP上进行统计和存储。agent探针在Java使用中是使用Java agent技术实现。不需要更改任何代码&#xff0c;Java agent会通过虚拟…