介绍下项目功能

全部采用组件化封装思想,尽可能的去符合企业级项目,封装了自定义指令、app换肤等...

1、点击登录会判断正则,同时有小图标提示,错误显 X 正确显 ✔

2、登录按钮默认灰色,账号密码全部正确则变绿色

3、css布局 (最基础!)

4、Vue3 动画库

5、输入框搜索

6、。。。

前期回顾    

综合热榜前6,js榜单第一,建议查看

Vue项目实战 —— 哔哩哔哩移动端开发_0.活在风浪里的博客-CSDN博客撑着下班前半小时我用vue写《哔哩哔哩 项目》移动端、新手还在哭、老鸟一直在笑。。。技术选型Vue2,技术栈有axios、Vh等,下班过来敲哈哈https://blog.csdn.net/m0_57904695/article/details/123594836

我故意写成两个项目,一个单独写登录注册和图书商城,但是没有js逻辑。另一个项目,单独写图书商城有js,这样将俩个分开,如果大家想要练习最适合不过,可以去写js逻辑,有一个项目是写好的,一个是没写的,方便 练习


效果图

登录

<template><div class="home"><my-headerv-back="$store.state.backColor"right-text="切换主题"title="用户登录"@right-click="rightClick"/><div class="form"><my-inputlabel="手机号码"placeholder="请输入手机号码":icon="mobileIcon"v-model="mobile"></my-input><my-inputlabel="密码"placeholder="请输入密码":icon="pwdIcon"v-model="pwd"></my-input><button class="btn" :disabled="disabled" @click="$router.push('/about')">登陆</button></div></div>
</template><script>
import myHeader from "@/components/myHeader";
import myInput from "@/components/myInput";
import { ref, watch, watchEffect } from "vue";
import { useStore } from "vuex";
export default {name: "Home",components: {myHeader,myInput,},setup() {const disabled = ref(true);const mobile = ref("");const pwd = ref("");const mobileIcon = ref("");const pwdIcon = ref("");const color = ref("#cccccc");const store = useStore();// 手机号码正则表达式let regMobile = /^1[356789]\d{9}$/;let regPwd = /^[a-zA-Z]\w{5}$/;// watchEffect兼容数据变化的方法 但是只能用来兼容ref数据watchEffect(() => {if (regMobile.test(mobile.value) && regPwd.test(pwd.value)) {disabled.value = false;// 判断成功则将变量颜色赋值按钮color.value = store.state.backColor;} else {disabled.value = true;}});watch(() => mobile.value,() => {if (regMobile.test(mobile.value)) {mobileIcon.value = "iconfont duihao";} else {mobileIcon.value = "iconfont chahao";}});watch(() => pwd.value,() => {// console.log(regPwd.test(pwd.value));if (regPwd.test(pwd.value)) {pwdIcon.value = "iconfont duihao";} else {pwdIcon.value = "iconfont chahao";}});function rightClick() {// console.log(1);store.commit("changeBackColor");}return {rightClick,disabled,mobile,pwd,mobileIcon,pwdIcon,color,};},
};
</script>
<style lang="scss" scoped>
.form {width: 100%;margin-top: 200px;padding: 0 40px;
}
.btn {display: block;margin: 0 auto;width: 150px;height: 36px;border: none;outline: none;border-radius: 6px;background-color: v-bind(color);color: #fff;
}
.btn[disabled] {background-color: #ccc;color: #fff;
}
</style>

vuex store/index.js

import { createStore } from 'vuex'
import axios from 'axios'
export default createStore({state: {// 默认颜色backColor: '#cccccc',// 存放数据,页面默认渲染的数据books: [],// 用于搜索_books: [],},mutations: {changeBackColor(state) {state.backColor = '#' + Math.round(Math.random() * 16777216).toString(16)},changeBooks(state, arr) {state.books = arrstate._books = deepClone(arr)function deepClone(obj) {if (typeof obj !== 'object' || obj == null) {return obj}let resultif (obj instanceof Array) {result = []} else {result = {}}for (let key in obj) {if (obj.hasOwnProperty(key)) {result[key] = deepClone(obj[key])}}return result}},},actions: {async getDate({ commit }) {//将请求的数据中的 list取出来let data = await axios.get('/goods.json')console.log(data.data.list);commit('changeBooks', data.data.list)}},modules: {}
})

登录子组件

<template><div class="my-header"><span class="left">{{leftText}}</span><span class="title">{{title}}</span><span class="right" @click="clickEve">{{rightText}}</span></div>
</template>
<script>
export default {//  props接受数据有两种形式 一种是数组 另外一种是对象// 数组用法简单不多介绍// 对象props: {show: Boolean, // 只定义需要接受的数据的数据类型时的写法leftText: {type: String, // 要求接收的数据时字符串required: false, // 该数据不是必须传递的default: ''},rightText: {type: String,required: false,default: ''},title: String},setup(props, { emit }) {function clickEve() {emit('right-click')}return {clickEve}}
}
</script>
<style lang="scss" scoped>.my-header {width: 100%;height: 50px;display: flex;justify-content: space-between;background-color: orangered;align-items: center;.left,.right {flex-basis: 30%;text-align: center;}.right {color: skyblue;}.title {color: #fff;font-size: 24px;font-weight: bold;}}
</style>
<template><div class="my-input"><label>{{label}}</label><input type="text" :placeholder="placeholder" :value="modelValue" @input="iptChange"><span :class="icon" ></span></div>
</template>
<script>
export default {props: {label: String,placeholder: String,icon: String,modelValue: String},setup(props, { emit }) {function iptChange(e) {emit('update:modelValue', e.target.value)}return {iptChange}}
}
</script>
<style lang="scss" scoped>.my-input {width: 100%;display: flex;align-items: center;margin-bottom: 15px;label {width: 56px;flex-shrink: 0;font-size: 14px;overflow: hidden;white-space: nowrap;text-align: justify;text-align-last: justify;}input {height: 36px;margin-left: 5px;border: 1px solid #ccc;outline: none;border-radius: 6px;padding-left: 10px;margin-right: 10px;}.duihao {color: green;font-weight: 900;}.chahao {color: red;}}
</style>

登录后页面

<template><div class="about"><myHeader left-text="" title="图书商城" right-text="我的书架"></myHeader><div class="search"><input type="text" placeholder="请根据书名进行搜素" /></div><div class="my-card"><!-- 子组件负责接受父组件数据,定义结构样式,父组件负责传值 念及此 为封装思路 --><myCard v-for="item in books" :key="item._id" :item="item"></myCard></div></div>
</template>
<script>
import myHeader from "../components/myHeader";
import myCard from "../components/myCard.vue";
import { useStore } from "vuex";
import { computed } from "vue";
export default {setup() {const store = useStore();store.dispatch("getDate");// 在计算属性拿到这个值赋值一个变量,就不用每次都$store.state.booksconst books = computed(() => store.state.books);return {books,};},components: {myHeader,myCard,},
};
</script>
<style lang="scss" scoped>
.search {width: 100%;height: 40px;background-color: #ccc;padding: 5px;input {width: 100%;height: 30px;border: none;font-size: 17px;background-color: transparent;outline: none;padding-left: 10px;}
}
.my-card {height: calc(100% - 90px);overflow: auto;display: flex;flex-wrap: wrap;
}
</style>

源码推送到主页的资源里了,需要的哥们儿到主页资源,down

如果感觉对你有帮助,收藏下方便找时快速翻到

vue实战 —— 图书商城移动端项目相关推荐

  1. Vue3+Vant+Vue-cli+Restful api实战—图书商城移动端

    Vue3+Vant+Vue-cli+Restful api实战-图书商城移动端 经过将近一个月的努力,项目终于做完了,编写的时候在代码中写了很多注释,方便自己后期查看,有问题的小伙伴可以找我帮忙解决! ...

  2. 【Vue】Vue2创建移动端项目实战教程,创建移动端项目保姆级教程,接上一篇创建Vue2项目(下)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.创建vue2项目 二.移动端适配 1.安装插件flexible (适配移动端) 2.安装 postcss-pxto ...

  3. Vue2积分商城PC端项目(六)

    目录 一.导航守卫(导航拦截.路由拦截) 1.1.全局导航守卫 1.2.组件内部导航守卫 二.个人中心--购物车页面 2.1.个人中心左侧结构样式套用 2.2.重定向到购物车(二级路由) 2.3.购物 ...

  4. Vue2积分商城PC端项目(一)

    目录 一.清空项目非必要文件 二.样式初始化 三.网站结构布置 四.网站数据请求模块 4.1.发起请求 4.2.代理配置 4.3.API与Request封装 4.4.发起请求 五.头部组件 5.1.版 ...

  5. 真 · 前端Vue实战:头条新闻开发项目(下)

    现在在企业里面,Vue成为前端框架中最火的一个.由于其简单易学,越来越多的网站前端开始采用Vue开发,毋庸置疑,掌握Vue技术可以为你的职场增加更多的机会.  今晚,黑马程序员金牌讲师伍老师,将为大家 ...

  6. Vue2积分商城PC端项目(四)

    目录 一.路由监听及其应用 1.1.路由监听的格式 1.2.路由监听的应用 二.组件重载 三.获取登录用户信息,请求头携带token 3.1.请求头携带token 3.2.获取用户登录信息 四.用户信 ...

  7. 团队项目:惊喜商城pc端

    惊喜商城pc端 一.项目背景 在这个飞速发展的互联网时代,人们对于去购物市场"人挤人"购物,更喜欢在线上足不出门但能买到自己想要的东西.此项目以某东商城为模板. 二.项目介绍 本项 ...

  8. springboot毕设项目:网上图书商城q3ulr(java+VUE+Mybatis+Maven+Mysql)

    springboot毕设项目:网上图书商城q3ulr(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBu ...

  9. springboot毕设项目网上图书商城q3ulr(java+VUE+Mybatis+Maven+Mysql)

    springboot毕设项目网上图书商城q3ulr(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBui ...

  10. Vue项目实战 —— 后台管理系统( pc端 ) 第三篇

    ​前期回顾    ​  Vue项目实战 -- 后台管理系统( pc端 ) 第二篇_0.活在风浪里的博客-CSDN博客前期回顾 Vue项目实战 -- 后台管理系统( pc端 ) 第一篇 _0.活在风浪里 ...

最新文章

  1. ajax hapi上传文件,javascript – hapi.js Cors Pre-flight不返回Access-Control-Allow-Origin标头...
  2. golang中的切片
  3. mysql for 语句执行顺序_MySQL使用profile分析SQL语句执行过程
  4. UDP --01--基本开发设计
  5. 网络工程师职业规划(三)
  6. github 分支 合并
  7. paip.广告过滤系统 php 实现
  8. android 音量调节流程分析,Android 4.4 音量调节流程分析(二)
  9. java基础8 构造函数和构造代码块
  10. 睡眠小镇V4.6养成RPG的闹钟下载
  11. vr课设《梵高世界》第一人称的解谜游戏
  12. PHP获取域名及域名IP的方法
  13. 直播上市潮 未上市平台未来不可期?
  14. php mysql 分页查询_PHP+MySQL分页查询实现
  15. matlab 中的textscan
  16. 2022 年 前40道 ReactJS 面试问题和答案
  17. (Python)使用SMTP发送QQ邮件
  18. java 四舍六入五成双
  19. Go + C 一款简单的贪吃蛇
  20. 本计算机家庭组的用户名,家庭组

热门文章

  1. python中的scaler_【笔记】scikit-learn中的Scaler(归一化)
  2. 【Unity3D-UGUI原理篇】(二)Canvas Scaler 缩放原理
  3. mediawiki mysql配置_MediaWiki 搭建与配置使用
  4. PAT Basic 1068 万绿丛中一点红
  5. jp.ne.so_net.ga2.no_ji.jcom.JComException: createInstance() failed HRESULT=0x800401F3L
  6. 现代计算机存储数据的基本单位是,计算机中存储数据的最小单位和存储容量的基本单位各是什么?...
  7. gphp32.exe是什么文件?
  8. php无法选择数据库,php – 在codeigniter中选择数据库 – 现在无法选择数据库
  9. java环境安装1359错误_iserver java api接口频发错误
  10. 城市智慧水务供水测试床在工业互联网上发布