• vue3.0项目实战系列文章 - 登录页面


    系列文章目录

     第一章 

    论vue3.0和vue2.0区别之编程方式及例子详解

    第二章

    同一台电脑 实现 vue-cli2和vue-cli3同时并存 及 常见命令

    第三章

    vue3.0项目实战 - ElementUI框架版

    第四章

    【TypeScript】在vue3中遇到的问题及解决方案,未完待续

    第五章

    vue3.0项目实战系列文章 - 登录页面


    目录

    系列文章目录

    前言

    一、关于setup?

    1.Vue3 的一大特性函数 ---- setup

    2.为什么使用setup?

    3.两个参数

    4.项目中使用以下写法 

    二、代码

    总结


    前言

    坑千千万,踩好才有完美的框架~


    一、关于setup

    1.Vue3 的一大特性函数 ---- setup

    • setup函数是处于 生命周期函数 beforeCreate 和 Created 之前的函数 也就说在 setup函数中是无法 使用 data 和 methods 中的数据和方法的
    • setup函数是 Composition API(组合API)的入口
    • 在setup函数中定义的变量和方法最后都是需要 return 出去的 不然无法在模板中使用

    2.为什么使用setup?

    • data、computed、methods、watch 组织逻辑在大多数情况下都有效。然而,当我们的组件变得更大时,逻辑关注点的列表也会增长。这可能会导致组件难以阅读和理解,尤其是对于那些一开始就没有编写这些组件的人来说简直是噩梦。而通过setup可以将该部分抽离成函数,让其他开发者就不用关心该部分逻辑了。
    • 写一个大型组件时,逻辑关注点的列表很长,不利于维护和阅读;所以需要把一个逻辑关注点的代码收集在一起会更好,由此诞生组合式API,即vue中用到的setup。

    3.两个参数

    • setup ( props , context )

    ① props : 响应式的,不能被解构,非要解构可用toRefs

    ② context :非响应式的,可以被解构,就是一个普通的js对象,作用是暴露其他可用的值(attrs、slots、emit、expose)

    • 组件的属性:只能访问以下四种:props、attrs、slots、emit

    4.项目中使用以下写法 

    1. <script lang="ts">
    2. import {
    3. ref,
    4. reactive
    5. } from "vue";
    6. import {
    7. useStore
    8. } from "vuex";
    9. import {
    10. useRouter
    11. } from "vue-router";
    12. import {
    13. ElMessage
    14. } from "element-plus";
    15. export default {
    16. setup() {
    17. },
    18. };
    19. script>

    二、代码

    1. <template>
    2. <div class="login-wrap">
    3. <div class="ms-login">
    4. <div class="ms-title">后台管理系统div>
    5. <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="0px" class="ms-content">
    6. <el-form-item prop="username">
    7. <el-input v-model="ruleForm.username" placeholder="username">
    8. <template #prepend>
    9. <el-button icon="el-icon-user">el-button>
    10. template>
    11. el-input>
    12. el-form-item>
    13. <el-form-item prop="password">
    14. <el-input type="password" placeholder="password" v-model="ruleForm.password">
    15. <template #prepend>
    16. <el-button icon="el-icon-lock">el-button>
    17. template>
    18. el-input>
    19. el-form-item>
    20. <div class="login-btn">
    21. <el-button type="primary" @click="submitForm(ruleFormRef)">登录el-button>
    22. div>
    23. <p class="login-tips">Tips : 用户名和密码随便填。p>
    24. el-form>
    25. div>
    26. div>
    27. template>
    28. <script lang="ts">
    29. import {
    30. ref,
    31. reactive
    32. } from "vue";
    33. import {
    34. useStore
    35. } from "vuex";
    36. import {
    37. useRouter
    38. } from "vue-router";
    39. import {
    40. ElMessage
    41. } from "element-plus";
    42. import {
    43. roleList
    44. } from "../request/api.js";
    45. export default {
    46. setup() {
    47. const router = useRouter();
    48. const ruleForm = reactive({
    49. username: "admin",
    50. password: "123123",
    51. });
    52. const rules = {
    53. username: [{
    54. required: true,
    55. message: "请输入用户名",
    56. trigger: "blur",
    57. }],
    58. password: [{
    59. required: true,
    60. message: "请输入密码",
    61. trigger: "blur"
    62. }],
    63. }; // 一个普通对象,修改后不会被proxy拦截,进而页面也不会动态更新
    64. const ruleFormRef = ref('');
    65. const submitForm = async (formEl) => {
    66. if (!formEl) return
    67. formEl.validate((valid) => {
    68. if (valid) {
    69. submitFormLink();
    70. } else {
    71. ElMessage.error("登录失败");
    72. return false;
    73. }
    74. });
    75. };
    76. // 使用响应式函数reactive构建proxy响应式对象
    77. const params = reactive({
    78. pageNum: 1,
    79. pageSize: 10,
    80. systemFlag: 'water'
    81. })
    82. const submitFormLink = () => {
    83. roleList(params).then(res => {
    84. if (res.code == 0) {
    85. ElMessage({
    86. showClose: true,
    87. message: '登录成功',
    88. type: 'success',
    89. })
    90. // ElMessage.success('登录成功')
    91. localStorage.setItem("ms_username", ruleForm.username);
    92. router.push("/");
    93. } else if (res.code !== 0) {
    94. ElMessage.error(res.msg)
    95. }
    96. })
    97. };
    98. const store = useStore();
    99. store.commit("clearTags");
    100. // 使用时,要把对象return出去,才能在template中使用
    101. return {
    102. ruleForm,
    103. rules,
    104. ruleFormRef,
    105. submitForm,
    106. params,
    107. submitFormLink
    108. };
    109. },
    110. };
    111. script>
    112. <style scoped>
    113. .login-wrap {
    114. position: relative;
    115. width: 100%;
    116. height: 100%;
    117. background-image: url(../assets/img/login-bg.jpg);
    118. background-size: 100%;
    119. }
    120. .ms-title {
    121. width: 100%;
    122. line-height: 50px;
    123. text-align: center;
    124. font-size: 20px;
    125. color: #fff;
    126. border-bottom: 1px solid #ddd;
    127. }
    128. .ms-login {
    129. position: absolute;
    130. left: 50%;
    131. top: 50%;
    132. width: 350px;
    133. margin: -190px 0 0 -175px;
    134. border-radius: 5px;
    135. background: rgba(255, 255, 255, 0.3);
    136. overflow: hidden;
    137. }
    138. .ms-content {
    139. padding: 30px 30px;
    140. }
    141. .login-btn {
    142. text-align: center;
    143. }
    144. .login-btn button {
    145. width: 100%;
    146. height: 36px;
    147. margin-bottom: 10px;
    148. }
    149. .login-tips {
    150. font-size: 12px;
    151. line-height: 30px;
    152. color: #fff;
    153. }
    154. style>

    总结

    以上就是今天要讲的内容,本文仅仅简单介绍了登录页面的使用,未完待续。

  • 相关阅读:
    数据结构与算法复习:第七弹
    js日期排序
    (10)Qt---项目打包
    如何用python一键保存绝美***壁纸?
    【MySQL入门到精通-黑马程序员】MySQL基础篇-函数
    传智杯#5练习赛_树的变迁
    C语⾔内存函数
    BUUCTF 乌镇峰会种图 1
    如何将文件或者图片压缩成zip文件压缩包
    配置go开发环境
  • 原文地址:https://blog.csdn.net/Hei_lovely_cat/article/details/125911206