记录使用vscode构建Vue3商店后台管理系统,这是第七篇,主要记录系统登录页面的创建过程,包含完整vue登录页面代码;Vuex的相关知识以及具体的使用,对state中值得获取,修改,异步修改,分模块用法进行详细记录,包含完整代码示例;提供完整项目代码

文章目录

  • 一、登录页面的创建
  • 二、Vuex 是什么?
    • 查看默认state中定义的count值
    • 修改默认的count值
    • 异步操作修改count值
    • 获取count值
  • 三、 store 分模块用法
  • 四、项目完整代码

正文内容:

一、登录页面的创建

  1. 创建LoginView.vue文件,在路由列表添加登录页面的相关路由信息,如下所示:
 {path: "/login",name: "loginView",component: () => import("../views/login/LoginView.vue"),}
  1. 编辑LoginView.vue文件,具体代码如下所示:
<template><div class="main"><div class="loginBox"><h2>商品后台管理系统</h2><el-form ref="ruleFormRef" :model="ruleForm" status-icon><el-form-item label="账户:" prop="account"><el-input v-model="ruleForm.account" /></el-form-item><el-form-item label="密码:" prop="pass"><el-input v-model="ruleForm.pass" type="password" /></el-form-item><el-form-item><el-button type="primary" @click="submitForm(ruleFormRef)">登录</el-button></el-form-item></el-form></div></div>
</template><script>
import { reactive, toRefs } from "vue"export default {name: "login",setup() {const data = reactive({ruleForm: [{account: "",pass: "",}],})const submitForm = function (ruleFormRef) {console.log("login");}return {...toRefs(data),submitForm}}
}
</script>
<style>
div.main {width: 100%;height: 100vh;display: flex;justify-content: center;align-items: center;flex: auto;background-image: url("../../assets/loginBackground.jpg");background-repeat: no-repeat;background-size: 100%;
}div.main div.loginBox {width: 300px;height: 300px;display: flex;flex-direction: column;color: white;justify-content: center;align-items: center;
}div.main div.loginBox h2 {margin-bottom: 25px;
}div.main div.loginBox .el-form .el-form-item {width: 260px;
}div.main div.loginBox .el-form .el-form-item:nth-child(3) .el-button {width: 260px;
}div.main div.loginBox .el-form .el-form-item label {color: white;
}
</style>
  1. 在浏览器输入地址http://localhost:8080/login,查看登录页面效果如下:

二、Vuex 是什么?

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

查看默认state中定义的count值

  1. 在state里面创建count
import {createStore} from "vuex";export default createStore({// 全局的状态初始值state: {count: 1,},// 计算state,获取对应值getters: {},// 更新状态的方法,更新state的唯一方法,commit mutationsmutations: {},// 可以异步操作,可以返回promise,更改数据还是传递到mutations进行更改actions: {},// 数据比较多的时候,分模块modules: {},
});
  1. 引入useStore,获取store对象,在登录按钮下边添加p标签,用于显示默认的count值
import { useStore } from "vuex"export default {name: "login",setup() {const store = useStore()const storeNum = store.state.count;const data = reactive({num: storeNum,})return {...toRefs(data),}}
}
  1. 运行效果如下图所示:

修改默认的count值

  1. 在mutations里面创建修改count值的方法setCount;setCount方法共有两个参数,第一个参数是state,第二个参数是调用这个方法的时候传递的具体数据值
import {createStore} from "vuex";export default createStore({// 全局的状态初始值state: {count: 1,},// 计算state,获取对应值getters: {},// 更新状态的方法,更新state的唯一方法,commit mutationsmutations: {setCount(state, num) {state.count = num;},},// 可以异步操作,可以返回promise,更改数据还是传递到mutations进行更改actions: {},// 数据比较多的时候,分模块modules: {},
});
  1. 设置登录按钮的点击事件为更改count数值
import { reactive, toRefs } from "vue"
import { useStore } from "vuex"export default {name: "login",setup() {const store = useStore()const storeNum = store.state.count;const data = reactive({num: storeNum,})const submitForm = function (ruleFormRef) {console.log("login");//通过commit方法更改count值,第一个参数是mutations里面具体的方法名称,第二个参数是count的修改值store.commit("setCount", 100);console.log(store.state.count);}return {...toRefs(data),submitForm}}
}
  1. 运行效果如下图所示:

    此时count的值并没有双向绑定

异步操作修改count值

  1. 在actions 里面定义setCountPromise方法,具体代码,如下所示:
import {createStore} from "vuex";export default createStore({// 全局的状态初始值state: {count: 1,},// 计算state,获取对应值getters: {},// 更新状态的方法,更新state的唯一方法,commit mutationsmutations: {setCount(state, num) {state.count = num;},},// 可以异步操作,可以返回promise,更改数据还是传递到mutations进行更改actions: {setCountPromise(context, num) {return new Promise((resolve, reject) => {if (num > 100) {reject("数值不能大于100");} else {context.commit("setCount", num);resolve();}});},},// 数据比较多的时候,分模块modules: {},
});
  1. 修改登录按钮的点击事件,具体代码如下所示
const submitForm = function (ruleFormRef) {//通过dispatch方法更改count值,第一个参数是actions里面具体的方法名称,第二个参数是count的修改值store.dispatch("setCountPromise", 101).then(resp => { console.log(store.state.count); }).catch(err => { console.log(err) });
}
  1. 当count的修改值为101时,运行效果如下所示:
  2. 当count的修改值为100时,运行效果如下所示:

获取count值

  1. 在getters里面添加getCount方法,具体代码如下所示:
import {createStore} from "vuex";export default createStore({// 全局的状态初始值state: {count: 1,},// 计算state,获取对应值getters: {getCount(state) {return state.count <= 1;},},// 更新状态的方法,更新state的唯一方法,commit mutationsmutations: {setCount(state, num) {state.count = num;},},// 可以异步操作,可以返回promise,更改数据还是传递到mutations进行更改actions: {setCountPromise(context, num) {return new Promise((resolve, reject) => {if (num > 100) {reject("数值不能大于100");} else {context.commit("setCount", num);resolve();}});},},// 数据比较多的时候,分模块modules: {},
});
  1. 修改登录按钮的点击事件
 const submitForm = function (ruleFormRef) {store.commit("setCount", 100);console.log(store.getters.getCount);
}
  1. 运行效果如下图所示:

    在之前我们通过store.state.count也可以获取count值,但是为什么还需要store.getters.getCount这种方式获取count值;首先笔者发现这是一种解耦的操作,通俗的将就是模块之间的耦合度降低,方便代码后期维护管理;通过store.getters.getCount这种方式,对count的操作独立出来,代码后期需要更改时是十分方便的

三、 store 分模块用法

  1. 新建文件夹state,用于存储分模块的state数据,新建Number.state.js文件用于存储一个模块的state数据,文件树如下图所示:
  2. 在Number.state.js写入state数据以及相关操作方法,具体代码如下所示:
export default {//开启namespace:true,该模块就成为命名空间模块namespaced: true,// 全局的状态初始值state: {count: 1,},// 计算state,获取对应值getters: {getCount(state) {return state.count <= 1;},},// 更新状态的方法,更新state的唯一方法,commit mutationsmutations: {setCount(state, num) {state.count = num;},},// 可以异步操作,可以返回promise,更改数据还是传递到mutations进行更改actions: {setCountPromise(context, num) {return new Promise((resolve, reject) => {if (num > 100) {reject("数值不能大于100");} else {context.commit("setCount", num);resolve();}});},},
};
  1. 在index.js导入Number.state.js,并在modules添加number,具体代码如下所示:
import {createStore} from "vuex";
import number from "./state/Number.state.js";
export default createStore({// 数据比较多的时候,分模块modules: {number},
});
  1. 使用state数据值count,注意用法已经改变,具体代码如下所示:
<script>
import { reactive, toRefs } from "vue"
import { useStore } from "vuex"export default {name: "login",setup() {const store = useStore()const getStore = store.getters["number/getCount"]const data = reactive({num: getStore,ruleForm: [{account: "",pass: "",}],})const submitForm = function (ruleFormRef) {store.commit("number/setCount", 100);console.log(store.getters["number/getCount"]);}return {...toRefs(data),submitForm}}
}
</script>
  1. 运行效果如下图所示:

四、项目完整代码

项目完整代码已经上传到github,地址如下:

https://github.com/crazymen-nanke/shop

Vue3商店后台管理系统设计文稿篇(七)相关推荐

  1. Vue3商店后台管理系统设计文稿篇(四)

    记录使用vscode构建Vue3商店后台管理系统,这是第四篇,主要记录使用git与vscode将代码同步提交到GitHub上面:将与Git操作相关命令进行详细介绍,完整记录Git与Github交互的所 ...

  2. Vue3商店后台管理系统设计文稿篇(五)

    记录使用vscode构建Vue3商店后台管理系统,这是第五篇,主要记录Vue3项目路由知识,创建路由表,页面引入路由组件,配置子路由:安装Element Plus,期间遇到问题,详细记录解决问题的过程 ...

  3. C#毕业设计——基于C#+asp.net+sqlserver的商店积分管理系统设计与实(毕业论文+程序源码)——商店积分管理系统

    基于C#+asp.net+sqlserver的商店积分管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C#+asp.net+sqlserver的商店积分管理系统设计与实现,文章末尾 ...

  4. c语言商店自动销售,c语言商店商品管理系统设计报告与源代码.doc

    c语言商店商品管理系统设计报告与源代码.doc 1目录1系统分析21.1课程设计内容21.2系统功能需求分析21.3数据结构设计32系统设计32.1总体设计32.2详细设计42.2.1界面设计42.2 ...

  5. 金融后台管理系统设计

    金融后台管理系统设计 (撰写时间:2019年7月10日 作者:李梦熙) 做后台网站首先得考虑做的是关于什么的网站,有什么用处,然后就是这个网站适用于什么人或是什么年龄段的人,还有就是有什么人会用这个网 ...

  6. JAVA宠物医院后台管理系统设计与实现计算机毕业设计Mybatis+系统+数据库+调试部署

    JAVA宠物医院后台管理系统设计与实现计算机毕业设计Mybatis+系统+数据库+调试部署 JAVA宠物医院后台管理系统设计与实现计算机毕业设计Mybatis+系统+数据库+调试部署 本源码技术栈: ...

  7. java毕业设计宠物医院后台管理系统设计与实现Mybatis+系统+数据库+调试部署

    java毕业设计宠物医院后台管理系统设计与实现Mybatis+系统+数据库+调试部署 java毕业设计宠物医院后台管理系统设计与实现Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B ...

  8. 旅游自助系统之后台管理系统设计

    为了更够实现旅游信息信息化,更好推广旅游经济的发展,要求实现以下功能: 旅游局能维护景点的信息:位置.游览项目及价格.景点介绍.开发时间: 旅游公司维护本公司开设的旅游线路信息:景点名称.餐饮.住宿. ...

  9. jsp课程项目(一)·后台管理系统设计与实现

    1.功能设计 后台系统作为管理人员控制web后台的重要手段之一,最主要的功能(相对于较简陋的后台管理系统而言)即是实现与数据库的交互.作为模板的手机商城有一库四表,其中比较重要的是user(用户表). ...

最新文章

  1. centos下忘记mysql密码_CentOS下忘记mysql密码的解决办法
  2. EMQ学习 ---集群
  3. 连接到多台mysql_Oracle通过dblink连接到多台MySQL
  4. android 闪退解决方案,Android apk无法安装及闪退问题解决办法
  5. CSS3笔记之基础篇(一)边框
  6. 服务器复制文件进程,服务器复制文件进程
  7. MySQL练习题及答案(图书管理数据库)
  8. VOC2007和VOC2012数据集下载地址
  9. 云计算就业前景究竟怎样 如何加入云计算行列
  10. 复原 IP 地址(回溯)
  11. Linux 常用命令 Updating
  12. oracle导出自增设置,教程方法;oracle中如何设置自增主键电脑技巧-琪琪词资源网...
  13. 陕西守护星-智慧井口综合安检
  14. C语言编写IDL动态可加载模块(DLM)入门
  15. 如何判断网站是不是ipad访问的?三种方法来判断
  16. 合并高德、飞猪重组本地生活,阿里还没放弃与美团的正面battle?
  17. 用Python玩转数据(三)
  18. 特异性敏感性的意义_敏感性特异性和有意义的分类
  19. 带你了解下Kafka的客户端缓冲池技术
  20. php正则怎么用,php正则的使用

热门文章

  1. 跑步札记怎么半年把配速提高25%
  2. [CodeFestival 2017J]MST
  3. django Email
  4. 【深度学习】实验1答案:Softmax实现手写数字识别
  5. OSError: [WinError 1455] 页面文件太小,无法完成操作和AttributeError: ‘NoneType‘ object has no attribute ‘_free_wea
  6. 「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess
  7. 卫星服务器网站系统,广西卫星同步系统
  8. 图片横向滚动js代码
  9. 单极性霍尔开关OH3144/OH44E
  10. Android程序员如何高薪接私活?十年老炮告诉你,看这一篇就够了