实现书签-第一部分
实现书签-第一部分
- 本节我们将实现书签功能,为菜谱点击类似于收藏的功能,然后可以在上方的书签找到我们所有收藏的书签;
在此之前,让我们修复一下之前的功能BUG,当我们搜索的时候,下面分页始终保持在上一次的页数中
重新搜索这个也不会改变成第一页
- 我们只需要在每次搜索的时候,将其页面置为1即可
- 现在我们来处理关于书签的功能,首先在状态管理中,我们将书签定义为一个空的数组
export const state = {recipe: {},search: {query: '',results: [],page: 1,resultsPerPage: RES_PER_PAGE,},bookmarks: [],
};
- 现在在model中添加书签的功能模块
export const addBookmark = function (recipe) {// 添加书签state.bookmarks.push(recipe);// 在当前 recipe 中添加 bookmarked 属性if (recipe.id === state.recipe.id) state.recipe.bookmarked = true;
};
- 所以我们在控制器中添加书签的功能
const controlAddBookmark = function () {//添加书签model.addBookmark(model.state.recipe);console.log(model.state.bookmarks);
};
- 这时候我们需要处理在什么时候去处理呢,我们去视图中进行处理
<button class="btn--round btn--bookmark"><svg class=""><use href="${icons}#icon-bookmark"></use></svg></button></div>
//增加一个class,用来监听
- 还是用事件委托的方式在处理点击的事情触发
//当点击加入书签按钮时,调用handleraddHandlerAddBookmark(handler) {this._parentElement.addEventListener('click', function (e) {const btn = e.target.closest('.btn--bookmark');if (!btn) return;handler();});}
- 之后我们在控制器中来调用这个方法
const init = function () {recipeView.addHandlerRender(controlRecipes);recipeView.addHandlerUpdateServings(controlServings);recipeView.addHandlerAddBookmark(controlAddBookmark);searchView.addHandlerSearch(controlSearchResults);paginationView.addHandlerClick(controlPagination);
};
- 之后我们测试一下,当我们点击之后,bookmarked会被设置为true
- 之后我们来改变点击之后书签的样式,当为真时,改变class,以此来改变样式
<button class="btn--round btn--bookmark"><svg class=""><use href="${icons}#icon-bookmark${this._data.bookmarked ? '-fill' : ''}"></use></svg></button></div>
- 之后我们点击之后需要更新一下视图
const controlAddBookmark = function () {//添加书签model.addBookmark (model.state.recipe);console.log(model.state.bookmarks);recipeView.update(model.state.recipe); //更新视图
};
- 但现在当我们的视图进行更新之后,状态无法进行保留,我们需要在加载食谱的时候检测一下
// 检查当前 recipe 是否被书签,如果是,则将 bookmarked 设置为 trueif (state.bookmarks.some(bookmark => bookmark.id === id)) {state.recipe.bookmarked = true;} else {state.recipe.bookmarked = false;}
- 现在我们做一个相反的东西,即删除书签,还是一样,在model添加删除书签的方法
export const deleteBookmark = function (id) {// 删除书签const index = state.bookmarks.findIndex(el => el.id === id);state.bookmarks.splice(index, 1);// 在当前 recipe 中添加 bookmarked 属性if (id === state.recipe.id) state.recipe.bookmarked = false;
};
- 这个方法仍然需要在控制器中调用,可以直接使用增加书签的函数功能
const controlAddBookmark = function () {//添加书签if (!model.state.recipe.bookmarked) model.addBookmark(model.state.recipe);else model.deleteBookmark(model.state.recipe.id);console.log(model.state.bookmarks);recipeView.update(model.state.recipe); //更新视图
};
这样我们就实现了点击添加书签,再次点击删除书签的功能,下次我们将实现一下将收藏的书签放入书签栏中,本次是书签的核心功能,下面的没有什么太难的地方了;
注:本教程来自于Jonas Schmedtmann
相关文章:

实现书签-第一部分
实现书签-第一部分 本节我们将实现书签功能,为菜谱点击类似于收藏的功能,然后可以在上方的书签找到我们所有收藏的书签; 在此之前,让我们修复一下之前的功能BUG,当我们搜索的时候,下面分页始终保持在上一…...

解决将其他盘可用空间,移植到C盘
第一步首先下载安装 用来扩内存盘的实用工具资源-CSDN文库 第二步打开diskgenius.exe 第三步选中想扩容的盘 右击-》选择扩容分区-》选择要缩小的分区-》然后确定 第四步拖拽对勾的地方 或者在箭头地方输入想阔的大小,然后开始,一直确定,就…...

第二天的尝试
目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 清晰的明白自己想要的是什么,培养兴趣也好,一定要有自己的一技之长。我们不说多优秀,但是如果父母需要我们出力,不要只有眼泪。 二、练习题 对…...

k8s灰度发布
基于 Traefik 的加权灰度发布-腾讯云开发者社区-腾讯云 Traefik | Traefik | v1.7 Releases traefik/traefik GitHub 从上面连接下载后上传到harbor虚拟机 vagrant upload /C/Users/HP280/Downloads/traefik 下载配置文件 wget -c http://raw.githubusercontent.com/conta…...

前端面经 9 JS中的继承
借用Class实现继承 实现继承 extends super extends 继承父类 super调用父类的构造函数 子类中存在方法采取就近原则 ,子类构造函数需要使用super()调用父类的构造函数 JS 静态属性和私有属性 寄生组合式继承...

memcached主主复制+keepalive
一、Memcached主主复制技术原理 Memcached原生不支持复制,需通过repcached分支实现双向同步。其关键机制包括: 双向同步架构 两节点互为主备(Master-Master),任意节点写入的数据会同步至对端。同步基于TCP协议&#x…...
光学设计核心
光学设计核心技术全流程教学:从理论建模到工程实践 一、光学设计基础理论体系构建 1.1 光线传播核心定律 • 斯涅尔定律:n_1\sin\theta_1 n_2\sin\theta_2,通过编程实现折射角动态计算(Python示例): im…...
使用 `aiohttp` 构建高效的异步网络爬虫系统
使用 aiohttp 构建高效的异步网络爬虫系统 引言 在爬取大量网页时,传统同步方法(如 requests)可能面临网络 I/O 阻塞问题,导致性能低下。而 Python 的 aiohttp 结合 asyncio 提供了一种高效的解决方案,使得爬虫可以同时处理多个请求,大幅提升数据抓取速度。 本文将详细…...
Microsoft Azure 服务4月更新告示
由世纪互联运营的 Microsoft Azure 重要更新 名称变更 Azure Stack HCI现已正式更名为Azure Local,并成为其重要组成部分。Azure Local是一种超融合基础设施(HCI)解决方案,专为托管Windows和Linux虚拟机(VMÿ…...

idea运行
各种小kips Linuxidea上传 Linux 部署流程 1、先在idea打好jar包,clean之后install 2、在Linux目录下,找到对应项目目录,把原来的jar包放在bak文件夹里面 3、杀死上一次jar包的pid ps -ef|grep cliaidata.jar kill pid 4、再进行上传新的jar…...
第八天——贪心算法——队列重构问题
1. 题目 给定一个由人群组成的数组 people,其中每个人以 [hi, ki] 的形式表示,people[i] [hi, ki] 表示第 i 个人的身高为 hi,并且前面恰好有 ki 个身高大于或等于 hi 的人。 你需要重新构造并返回一个表示队列的数组 queue,其中…...

CVPR2025 | 首个多光谱无人机单目标跟踪大规模数据集与统一框架, 数据可直接下载
论文介绍 题目:MUST: The First Dataset and Unified Framework for Multispectral UAV Single Object Tracking 期刊:IEEE/CVF Computer Vision and Pattern Recognition Conference 论文:https://arxiv.org/abs/2503.17699 数据&#x…...

Docker实现MySQL数据库主从复制
一、拉取数据库镜像 docker pull mysql:5.7二、创建两个数据库(一主一从模式) mysql01(主) 1.docker run -d -p 3310:3306 -v /root/mysql/node-1/init:/docker-entrypoinit-initdb.d -v /root/mysql/node-1/config:/etc/mysql/conf.d -v /root/mysq…...
PTN中的L2VPN与L3VPN技术详解
文章目录 一、PTN网络中的VPN技术概述二、L2VPN(二层虚拟专用网络)技术解析1. 核心技术原理2. 主要类型3. 应用场景4. 技术优缺点 三、L3VPN(三层虚拟专用网络)技术解析1. 核心技术原理2. 主要类型3. 应用场景4. 技术优缺点 四、L…...

2025长三角杯数学建模B题教学思路分析:空气源热泵供暖的温度预测
2025长三角杯数学建模B题教学思路模型代码,详细内容见文末名片 一、问题背景 在当今“电供暖”日益普及的大背景下,空气源热泵凭借其独特优势,在楼宇供暖领域崭露头角,成为缓解电网调峰压力的得力助手。然而,供暖过程…...
告别传统的防抖机制,提交按钮的新时代来临
目录 背景 目标 核心代码 样式定义:让图标居中、响应父级颜色 SVG 图标:轻量、无依赖的 loading 图标 指令注册:全局注册 v-bLoading DOM 操作:添加与清除 loading 图标 1. 添加 loading 图标 2. 清除 loading 图标 动画…...

InternVL3: 利用AI处理文本、图像、视频、OCR和数据分析
InternVL3推动了视觉-语言理解、推理和感知的边界。 在其前身InternVL 2.5的基础上,这个新版本引入了工具使用、GUI代理操作、3D视觉和工业图像分析方面的突破性能力。 让我们来分析一下是什么让InternVL3成为游戏规则的改变者 — 以及今天你如何开始尝试使用它。 InternVL…...
关于 Web安全:1. Web 安全基础知识
一、HTTP/HTTPS 协议详解 1. HTTP协议基础 什么是 HTTP? HTTP(HyperText Transfer Protocol)是互联网中浏览器和服务器之间传输数据的协议,基于请求-响应模式。它是一个无状态协议,意思是每次请求都是独立的&#x…...
西门子 S1500 PLC 通过 Profinet 对 6 台施耐德 ATV304 变频器的控制,用于 6 台升降台的位置控制。
西门子 S1500 PLC 通过 Profinet 对 6 台施耐德 ATV304 变频器的控制,用于 6 台升降台的位置控制。程序主要特点: 模块化设计:采用功能块数组结构,实现对多台设备的统一控制循环控制:使用 FOR 循环遍历每台升降台&…...

重构金融数智化产业版图:中电金信“链主”之道
近日,《商学院》杂志独家专访了中电金信常务副总经理(主持经营工作)冯明刚,围绕“金融科技”“数字底座”“架构转型”“AI驱动”等议题,展开了一场关于未来架构、技术变革与系统创新的深入对话。 当下,数字…...
高光谱遥感图像处理之数据分类的fcm算法
基于模糊C均值聚类(FCM)的高光谱遥感图像分类MATLAB实现示例 %% FCM高光谱图像分类示例 clc; clear; close all;%% 数据加载与预处理 % 加载示例数据(此处使用公开数据集Indian Pines的简化版) load(indian_pines.mat); % 包含变…...

2025年PMP 学习十六 第11章 项目风险管理 (总章)
2025年PMP 学习十六 第11章 项目风险管理 (总章) 第11章 项目风险管理 序号过程过程组1规划风险管理规划2识别风险规划3实施定性风险分析规划4实施定量风险分析规划5规划风险应对执行6实施风险应对执行7监控风险监控 目标: 提高项目中积极事件的概率和…...
IEEE 列表会议第五届机器人、自动化与智能控制国际会议
会议地点:中国 成都 会议官网:ICRAIC 主办单位:成都理工大学 协办单位:成都大学 早鸟截稿:2025年7月15日 截稿时间:2025年8月20日 出版信息:IEEE出版&EI数据库 会议时间:…...
基于 React Hook 封装 Store 的三种方案
基于 React Hook 封装 Store 的三种方案 方案一:基于 useSyncExternalStore 的轻量级 Store(推荐) import { useSyncExternalStore } from react;type Store<T> {state: T;listeners: Set<() > void>; };function createSt…...
Gmsh 读取自定义轮廓并划分网格:深入解析与实践指南
一、Gmsh 简介 (一)Gmsh 是什么 Gmsh 是一款功能强大的开源有限元网格生成器,广泛应用于工程仿真、数值模拟以及计算机图形学等领域。它为用户提供了从几何建模到网格划分的一整套解决方案,能够有效处理复杂几何形状,生成高质量的二维和三维网格,满足多种数值方法的需求…...

bili.png
import pygame as pg import sys import time import randompg.init() screen pg.display.set_mode((800,500)) pg.display.set_caption(runcool) screen.fill((135, 206, 235)) bili pg.image.load(bili.png)#得分 coin 0 game_font pg.font.Font(None, 50)#人物大小…...

【设计模式】- 行为型模式1
模板方法模式 定义了一个操作中的算法骨架,将算法的一些步骤推迟到子类,使得子类可以不改变该算法结构的情况下重定义该算法的某些步骤 【主要角色】: 抽象类:给出一个算法的轮廓和骨架(包括一个模板方法 和 若干基…...
GMT之Bash语言使用
GMT的操作有自己的逻辑和“命令”,但GMT是可以用Bash语言控制的,所以常常以.sh为后缀写GMT程序。 GMT程序运行步骤如下: 采用cd ,定位到指定文件夹;以sh ***.sh运行GMT,得到结果。 另外,遇到…...

AI神经网络降噪算法在语音通话产品中的应用优势与前景分析
采用AI降噪的语言通话环境抑制模组性能效果测试 一、引言 随着人工智能技术的快速发展,AI神经网络降噪算法在语音通话产品中的应用正逐步取代传统降噪技术,成为提升语音质量的关键解决方案。相比传统DSP(数字信号处理)降噪&#…...
ISBI 2012 EM 神经元结构分割数据集复现UNet
一些笔记在代码的注释中 因为使用的数据集比较简单,所以没有使用模型可视化和调试的内容,只是简单的数据集预处理和模型的搭建以及训练。 # 1. PyTorch 基础模块 import torch # 张量操作 import torch.nn as nn # 构建神经网…...