当前位置: 首页 > news >正文

封装比较好的登录页面

封装比较好的登录页面

只在setup()函数中写流程,将逻辑代码抽离出来

<template><div class="wrapper"><img class="wrapper__img" src='http://www.dell-lee.com/imgs/vue3/user.png' /><div class="wrapper__input"><inputclass="wrapper__input__content"placeholder="用户名"v-model="username"/></div><div class="wrapper__input"><inputtype="password"class="wrapper__input__content"placeholder="请输入密码"v-model="password"autocomplete="new-password"/></div><div class="wrapper__login-button" @click="handleLogin">登陆</div><div class="wrapper__login-link" @click="handleRegisterClick">立即注册</div><Toast v-if="show" :message="toastMessage"/></div>
</template><script>
import { reactive, toRefs } from 'vue'
import { useRouter } from 'vue-router'
import { post } from '../../utils/request'
import Toast, { useToastEffect } from '../../components/Toast'// 处理注册逻辑
const useLoginEffect = (showToast) => {const router = useRouter()const data = reactive({ username: '', password: '' })const handleLogin = async () => {try {const result = await post('/api/user/login', {username: data.username,password: data.password})if (result?.errno === 0) {localStorage.isLogin = truerouter.push({ name: 'Home' })} else {showToast('登陆失败')}} catch (e) {showToast('请求失败')}}const { username, password } = toRefs(data)return { username, password, handleLogin}
}// 处理注册跳转
const useRegisterEffect = () => {const router = useRouter()const handleRegisterClick = () => {router.push({ name: 'Register' })}return { handleRegisterClick }
}export default {name: 'Login',components: { Toast },// 职责就是告诉你,代码执行的一个流程setup () {const { show, toastMessage, showToast } = useToastEffect()const { username, password, handleLogin } = useLoginEffect(showToast)const { handleRegisterClick } = useRegisterEffect()return {username, password, show, toastMessage,handleLogin, handleRegisterClick,}}
}
</script><style lang="scss" scoped>
</style>

相关文章:

  • 性能测试常见问题总结
  • 数据库表字段以表格形式写入Word
  • vite+react+typescript 遇到的问题
  • 002 OpenCV dft 傅里叶变换
  • 阿里云服务器 手动搭建WordPress(CentOS 8)
  • 【Java 进阶篇】深入理解 JQuery 事件绑定:标准方式
  • Python小白之PyCharm仍然显示“No module named ‘xlwings‘”
  • 基于单片机的水位检测系统仿真设计
  • Postman+Newman+Jenkins实现接口测试持续集成
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • 【智能家居项目】FreeRTOS版本——多任务系统中使用DHT11 | 获取SNTP服务器时间 | 重新设计功能框架
  • gRPC之SAN证书生成
  • 二百零二、Hive——Hive解析JSON字段(单个字段与json数组)
  • 第六章 图(上)【图的基本概念和存储】
  • IntelliJ IDE 插件开发 |(一)快速入门
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • create-react-app项目添加less配置
  • ES6核心特性
  • Idea+maven+scala构建包并在spark on yarn 运行
  • javascript 总结(常用工具类的封装)
  • JAVA多线程机制解析-volatilesynchronized
  • JS实现简单的MVC模式开发小游戏
  • pdf文件如何在线转换为jpg图片
  • Rancher-k8s加速安装文档
  • Redis 中的布隆过滤器
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • V4L2视频输入框架概述
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 普通函数和构造函数的区别
  • 深度解析利用ES6进行Promise封装总结
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 正则表达式小结
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​香农与信息论三大定律
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • @31省区市高考时间表来了,祝考试成功
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [1181]linux两台服务器之间传输文件和文件夹
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [BUUCTF]-Reverse:reverse3解析
  • [C# 基础知识系列]专题十六:Linq介绍
  • [c++] C++多态(虚函数和虚继承)
  • [Google Guava] 2.1-不可变集合