五、书架开发--1.书架标题组件交互、获取书架数据

添加书架页面,做路由配置

首先添加书架页面,到views中的store中添加一个StoreShelf表示书架

然后到路由中进行注册

然后书城首页的返回键我们是想要点击返回的话就跳转到书架页面,所以如下this.$router.push('/store/shelf')

做书架标题组件

我们在components中创建一个shelf文件夹然后创建一个书架标题组件即ShelfTitle.vue,并且在书架组件即StoreShelf.vue中引入注册使用书架标题组件。然后我们继续做书架标题组件。

我们这个标题下面还有一个副标题,就是你在选择图书的时候这里就会展示出你选了多少本书,所以这个副标题不是一段固定的文本,而是一个变化的,所以我们定义为一个变量,因为它是在变化的,所以我们把它放到computed计算属性中

实现编辑的交互

然后我们去实现编辑逻辑,点击编辑后会变文字变成取消,并且点击编辑后书架下面的副标题才会出现,我们选择书籍后副标题的文本会发生变化会自动统计选择的书籍数量。

点击编辑变取消,点击取消变编辑

也就是我们需要一个变量来控制编辑-取消的显示状态,所以我们到vuex中定义一个变量叫isEditMode,用来控制是否进入编辑模式,同理在mixin.js中引入,然后我们引入mixin,然后我们给编辑按钮添加一个点击事件叫onEditClick,在这个方法中我们让setIsEditMode去修改state中isEditMoed的值,即如果此时是编辑模式就展示取消,如果不是编辑模式就展示编辑,所以在上面我们用三元表达式{{isEditMode?'取消':'编辑'}},如下

编辑模式下副标题展示,不是编辑模式下副标题不展示

这个副标题是否展示是与是否是编辑模式决定,而isEditMode这个变量就控制着是否是编辑模式,所以根据这个变量v-show展示副标题即可

编辑模式中,如果还没有选择书籍,副标题就展示请选择书籍;如果选择了几本书籍,副标题需要展示已选择xx本书籍

我们在vuex中定义一个变量shelfSelected: [],是一个数组变量,记录选择了什么书

首先我们应该获取到当前选择的书数量,然后再根据这个数组中有没有图书,如果有图书即长度不为0则返回已选择多少本图书,如果没有图书则返回请选择图书,如下

实现搜索框的交互

我们用什么布局来做搜索框,使得点击搜索框的时候搜索框向上移动?

我们定义一个全屏的滚动条组件,然后将搜索框距离top顶部有标题栏的高度,书架列表就距离top顶部有标题栏和搜索框的高度,为什么这样做呢,我们采用这种绝对定位来做这个页面有什么好处呢,好处在于,我们点击搜索框的时候搜索框的移动会比较容易实现,因为我们布局这个搜索框的时候是距离top顶部有高度的,我们点击搜索框时就将它的top置为0,即可实现搜索框向上移动的效果了,这比用translate3d更加好做

书架搜索框布局实现

我们在书架组件中引入滚动条组件即Scroll.vue组件,如下我们让它是绝对定位并且覆盖全屏

然后我们components的shelf下定义一个搜索框组件,然后如下,这里搜索图标搜索框叉叉图标是用flex布局实现,因为中间搜索框需要自适应充满剩余的位置嘛。然后设置input里面的显示文字样式是通过&::-webkit-input-placeholder,同理这个搜索框去掉点击显示图框这个是通过&:focus{ outline:none }实现,搜索框的边框是通过border:none来实现

然后来实现这个叉叉图标的交互

搜索框的叉叉图标是搜索框中有内容时才展示,没有内容时不展示,所以定义一个变量叫searchText来保存搜索框中的输入的文本,然后v-show去判断这个变量长度大于0就说明有输入的文字就展示叉叉图标,否则不展示叉叉图标;

然后给叉叉图标加个点击事件,点击事件中就把搜索框中searchText置为空即可实现点击叉叉图标就把搜索框中文字删除的交互

现在我们实现搜索框的移动

我们点击搜索框后,搜索框上移,我们给整个搜索框绑定一个class,这个样式就是让搜索框上移,搜索框上移的条件就是点击了搜索框,所以是:class="{'search-top':ifInputClicked}",这个样式中就把top置为0即可,然后再给个transition过渡动画,观测top值

然后搜索框上移后标题栏需要隐藏,点击取消可以让搜索框下移回来并且展示标题栏,所以

接下来实现点击搜索框后下面的tab展示

首先tab栏是否显示是看搜索框是否是被点击状态,所以用v-if=ifInputClicked来控制tab是否显示;然后tab栏不是直接三个文本默认\按进度\按购买直接展示出来那么简单,因为你点击它是需要被知道你点击的是哪一个所以这三个需要有个id来识别是哪个tab,所以computed中定义一个tabs属性,里面返回一个数组,数组中就是这三个tab的文本和id,然后去循环展示出这三个文本;然后你点击某一个后你需要知道当前点击的是哪一个,所以需要定义一个变量selectedTab来保存你点击的那个tab的id,所以给整个tab组件绑定一个点击事件,点击就把当前点击的tab的id传过去,然后点击事件中就去改变这个selectedTab的值;最后被点击的tab我们想要它有高光样式,所以给它们绑定一个class,如果当前的tab的id等于selectedTab的id即展示高光样式

然后这个tab也是用绝对定位,它top是52就是搜索框的高度;然后给display:flex;然后每个tab都是flex:1;这样它们就都是自适应撑满

接下来我们去实现书架里的图书

图书列表方框中的三种状态

这里图书分为三种状态:第一种为默认状态;第二种状态就是分类状态,就是当我们把几本书加入同一类之后它会显示出一个分类模块;第三种状态就是我们的添加状态。

三种状态就需要有三种组件支持,然后我们通过动态组件,动态的来判断当前应该属于哪种状态,这是图书书架的实现思路。

首先我们要获取数据源

如下就是我们准备在mock中的书架数据

然后我们要先到api的store.js中配置获取mock模拟数据的书架接口

然后需要到StoreShelf中获取这个mock模拟的书架数据,把这个shelf接口方法引入进来,然后在mouted钩子函数中调用这个方法

如下我们可以看到返回的数据,其中这个type是1则表示是个图书,那么它的title就是这个图书名,如果type是2则表示它是个分类,那么它的title就是这个分类名称就是你分类起的分类名,然后这个分类中的itemList就是这个分类中的图书。type为3是添加状态,是我们手动实现,等一下会做

然后处理数据,我们在vuex中定义一个数组变量,保存我们获取回来的书架数据。这样我们数据就准备好了

方框组件与三种组件结构关系

接下来我们实现书架图书列表组件,我们在components中的shelf中增加一个ShelfList组件,然后ShelfList组件下的每一块就是一个ShelfItem.vue组件(就是这一块不是一个图书就是一个分类不然就是添加状态的图片),然后每个框下有可能是一本书或者一个分类或者一个添加状态,所以还需要三个子组件分别表示这三种状态,状态1即默认图书我们叫ShelfItemImage.vue,状态2即分类组件我们叫它ShelfItemCategory.vue,状态3即添加组件我们叫ShelfItemAdd.vue

然后ShelfItem就那方框中我们用使用动态组件,即动态的去加载这里的三个组件,我们根据传入的参数然后使用动态组件判断三个组件到底加载哪一个

然后我们去实现这些组件

首先我们来实现ShelfList组件即图书列表组件即搜索框下哪些图书

然后我们发现滑动的时候那个搜索框也跟着滑上去了,我们是希望搜索框固定在上面不跟着滑动的,所以要固定搜索框,所以在ShelfSearch的搜索框中我们绑定一个样式,即整个搜索栏被点击的时候是固定在底部的,所以用上position:fixed;固定定位给它top:0;left:0;即固定在顶部,这样你鼓动图书列表是时候就不会带跑它啦

然后滚动的时候我们希望搜索框下面有阴影,就接收滚动条组件传递过来的偏移量,然后监测这个偏移量嘛,一旦偏移量大于0说明滑动了,那就展示阴影

如下我们在书架组件中绑定@onSrcoll,然后定义一个onScroll方法,这个方法中接收滚动条组件中传过来的值;滚动条组件中滚动条一旦滚动就会触发$emit把偏移量传过来。得到滚动偏移量后我们就把vuex中的偏移量值更新

然后我们到标题栏组件中,定义一个变量叫ifHideShadow用来控制是否显示阴影,默认为true即不显示阴影;然后我们watch监听vuex中的偏移量,如果偏移量大于0即展示阴影即置为false,否则置为true,然后给标题搜索整个栏绑定一个样式,即ifHideShadow为true时则显示这个样式,这个样式即置box-shodow为none,平时就box-shadow:0 2px 2px 0;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/535123.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nevion视频会议光端机AAV-3G-XMUX系列

序号型号描述(厂商:Nevion)3G/HD/SD-SDI 视音频光端机,0-20km1AAV-3G-XMUX-SFP3G/HD/SD-SDI 音频嵌入/解嵌器模块,带SFP光模块插座。支持4路AES加嵌和解嵌,8路模拟音频加嵌。内置音频矩阵及处理器模块&…

【spring】@Profile注解学习

Profile介绍 在Spring框架中,Profile注解用于根据特定的配置文件来有条件地激活或禁用Bean的定义。这在开发和测试过程中非常有用,因为它允许你为不同的环境(如开发、测试、生产)定义不同的配置。 Profile不仅可以标注在方法上&…

PCB封装库的创建及引入

法1 1.创建lib 2.放置 找到你想要画的封装的器件的数据手册了解相关信息。 直插式选Multi-layer 贴片选Top-layer 焊盘尺寸 焊盘空尺寸 法2 嘉立创eda直接copy 再嘉立创中找到你想要的pcb,导出为ad 然后再ad中找到我们导出的文件 复制他 然后再库中粘贴 pcb库…

【算法】哈希表

个人主页 : zxctscl 如有转载请先通知 题目 1. 1. 两数之和1.1 分析1.2 代码 2. 面试题 01.02. 判定是否互为字符重排2.1 分析2.2 代码 3. 217. 存在重复元素3.1 分析3.2 代码 4. 219. 存在重复元素 II4.1 分析4.2 代码 5. 49. 字母异位词分组5.1 分析5.2 代码 1. 1…

L2-2 巴音布鲁克永远的土(二分+并查集)

思路:我们可以二分答案,然后判断当前答案合不合理。 对于判断答案合理,可以用并查集,看mid能否把所有检查点连进一个集合中,枚举每个结点,如何当前结点周围的四个方向可以连的话,就加进同一个集…

“桃花庵主”是我国哪位古代名人的称号?2024年4月12日蚂蚁庄园今日答案

原文来源:蚂蚁庄园今日答案 - 词令 蚂蚁庄园是一款爱心公益游戏,用户可以通过喂养小鸡,产生鸡蛋,并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料,使用鸡饲料喂鸡之后,会可以获得鸡蛋&…

如何在群晖本地搭建在线PS工具Potopea并实现无公网IP远程编辑图片

文章目录 1. 部署Photopea2. 运行Photopea3. 群晖安装Cpolar4. 配置公网地址5. 公网访问测试6. 固定公网地址 本文主要介绍如何在群晖NAS使用Docker部署Potopea在线图片编辑工具,并结合cpolar内网穿透实现公网环境可以远程访问本地部署的Potopea. Photopea是一款强大…

为什么使用MQ????

1、异步处理 场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式 2.并行的方式。 串行方式: 将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有一个问题是,邮件,短信并不是…

【全网独家】oceanbase容器重启时报obshell failed错误,无法正常启动的问题处理

正常运行的oceanbase容器,重新启动该容器却启动不了,重启服务器也无法恢复,报obshell failed错误,无法正常启动,本文记录了问题处理过程。 一、问题现象 1、正常运行的oceanbase容器,重启却启动不了 2、运…

C++之双向链表与哈希链表用法区别实例(二百六十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

在vite中限制node版本

1.修改package.json文件 {"name": "wine-store-frontend","version": "0.0.0","private": true,"type": "module","scripts": {"dev": "vite --open","build"…

MATLAB有限元结构动力学分析与工程应用-徐斌|【PDF电子书+配套Matlab源码】

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

编译原理 学习笔记

1、代码: (1 2) * 3 2、词法解析: 3、抽象语法树: 4、语法树递归下降求值: 先Current_Node是根节点乘号,乘号,是中缀运算符,找左子节点,是加号,加号是中缀表达式&…

【微命令】git 如何修改某个分支的名字(git branch -m newbranch)

简要信息,快速记录 命令 # 切换到某个需要修改的分支 git checkout oldbranch# 修改分支名字 git branch -m newbranch假设作为git设计者,要用来修改branch的命令,那么就是 git branch作为前缀,然后进一步修改的命令是branch相关…

稀碎从零算法笔记Day40-LeetCode:加油站

题型:贪心、模拟、数组 链接:134. 加油站 - 力扣(LeetCode) 来源:LeetCode 题目描述 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第…

2024年第十七届 认证杯 网络挑战赛 (C题)| 云中的海盐 | 辐射传输方程 Stefan-Boltzmann分析 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 让我们来看看认证杯 网络挑战赛 (C题)&#xff01…

Linux的学习之路:5、粘滞位与vim

摘要 这里主要是把上章没说完的权限的粘滞位说一下,然后就是vim的一些操作。 目录 摘要 一、粘滞位 二、权限总结 三、vim的基本概念 四、vim的基本操作 五、vim正常模式命令集 1、插入模式 2、从插入模式切换为命令模式 3、移动光标 4、删除文字 5、复…

MMYOLO调试RTMDet--小数据集split_ss_dota_200

背景 用MMYOLO调试旋转目标检测时需要用到dota数据集,根据MMYOLO的官方教程,dota数据集经过处理后变为split_ss_dota,但是该数据集还是很大,对于一些配置比较低的机器要调试比较麻烦,所以这里针对该数据集&#xff0c…

上海人工智能实验室的书生·浦语大模型学习笔记(第二期第三课——上篇)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型,这次有机会参与试用,特记录每次学习情况。 一、课程笔记 本次学习的是RAG(Retrieval Augmented Generation)技术,它是通过检索与用户输入相关的信息片段…

互联网大厂ssp面经(操作系统:part1)

1. 什么是进程和线程?它们之间有什么区别? a. 进程是操作系统中运行的一个程序实例。它拥有独立的地址空间和资源,可以独立执行。 b. 线程是进程内的一个执行单元,一个进程可以包含多个线程。 c. 线程共享进程的资源,…