使用的都是爱奇艺电影接口

demo1–承接上上篇脚手架生成的react来继续的

修改了List.jsx和创建文件 src/api/favs.js
favs.js

export function onCollection(id) {const favs = getCollections();if (favs.indexOf(id) === -1) {favs.push(id);}localStorage.setItem("favs", JSON.stringify(favs));
}/*** 取消对数据的收藏* @param {*} id*/
export function cancelCollection(id) {const favs = getCollections(); // 获取现有的收藏信息const index = favs.indexOf(id); // 获取当前数据的索引,favs.finIndex(i=>i.id===id)也可查找索引,但是相比indexOf麻烦些if (index > -1) {favs.splice(index, 1); // 删除元素}localStorage.setItem("favs", JSON.stringify(favs)); // 保存
}/*** 获取收藏信息*/
export function getCollections() {let result = []; // 这块的let不能写成const,会报错导致页面错误try {if (localStorage.getItem("favs")) {result = JSON.parse(localStorage.getItem("favs"));}} catch (err) {console.log(err);}return result;
}

List.jsx

import React, { useState, useEffect } from "react";
import { Button, Card, Row, Col } from "antd";
import { loadDMList } from "../api/iqiyi";
import { getCollections, onCollection, cancelCollection } from "../api/fav";const { Meta } = Card;function List() {const [books, setBooks] = useState([]); // 数据const [page, setPage] = useState(1); // 页码const [isLoading, toggleLoading] = useState(false); // 加载状态// 因为localStorage的修改不会让页面重新渲染,页面的重新渲染是因为state数据的改变会让function重新执行一遍,const [isCollected, setCollected] = useState(false); // 是否收藏状态改变。const collections = getCollections();// 初始化的时候执行useEffect(() => {// setBooks([1, 2, 3, 4, 5, 6]);toggleLoading(true);loadDMList(page).then((res) => {setBooks([...books, ...res.data.data.list]);toggleLoading(false);});}, [page]);return (<div><h1>我是一个List组件</h1><Row justify="center" align="middle">{books.map((book) => (<Col span={6} key={book.albumId}><Cardhoverablestyle={{ width: 240, margin: "1rem auto" }}cover={<img alt="example" src={book.imageUrl} />}actions={[collections.indexOf(book.albumId) > -1 ? (<ButtononClick={() => {cancelCollection(book.albumId);setCollected(!isCollected);}}type="danger">取消</Button>) : (<ButtononClick={() => {onCollection(book.albumId);setCollected(!isCollected);}}type="primary">收藏</Button>),]}><Meta title={book.name} description="www.instagram.com" /></Card></Col>))}</Row><ButtononClick={() => {setPage(page + 1);}}type="primary"loading={isLoading}>下一页</Button></div>);
}export default List;

demo2—手写的react页面

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="referrer" content="no-referrer" /><title>练习</title><linkrel="stylesheet"href="https://cdn.bootcdn.net/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"/><style>html,body,#app,.container {height: 100%;margin: 0;padding: 0;}body {background-color: black;color: white;}.container {display: flex;flex-direction: column;}* {box-sizing: border-box;}.movies {width: 100%;flex: 1;padding: 0.1rem;overflow: auto;}.item {width: 25%;float: left;padding: 0.3rem;display: flex;flex-direction: column;align-items: center;justify-content: center;border-bottom: 1px solid gray;}.item img {height: 200px;}.item h3 {margin: 0.8rem 0;padding: 0;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;}.item p {color: gray;font-size: 0.8rem;margin: 0;padding: 0;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 3;-webkit-box-orient: vertical;}.m {display: block;margin: 1rem auto;width: 400px;height: 300px;border: 1px solid gray;}</style></head><body><div id="app"></div><script src="./libs/babel.min.js"></script><script src="./libs/react.js"></script><script src="./libs/react-dom.js"></script><script src="./data.js"></script><script type="text/babel">const { useState, useEffect } = React;function loadCollections() {let stars = [];if (localStorage.getItem("stars")) {try {stars = JSON.parse(localStorage.getItem("stars"));} catch (err) {}}return stars;}function Movie(props) {const { item, playMovie, startToggle, collections } = props;return (<div className="item"><imgonClick={() => playMovie(item.playUrl)}src={item.imageUrl}alt={item.name}/><h3>{item.name}</h3><p>{item.description}</p><ionClick={() => startToggle(item)}className="fa fa-heart"style={collections.indexOf(item.albumId) > -1 ? { color: "red" } : {}}></i></div>);}function App() {const [movies, setMovies] = useState(moviesData.data.list); // 列表const [url, setUrl] = useState(""); // 播放地址const [collections, setCollections] = useState([]); // 收藏列表// 播放const playMovie = (path) => {setUrl(`http://jx.618g.com/?url=${path}`);};// 收藏或者取消const startToggle = (item) => {let stars = loadCollections();if (stars.indexOf(item.albumId) == -1) {stars.push(item.albumId);} else {stars.splice(stars.indexOf(item.albumId), 1);}localStorage.setItem("stars", JSON.stringify(stars));setCollections([...stars]);};useEffect(() => {// fetch(//   "https://pcw-api.iqiyi.com/search/recommend/list?channel_id=1&data_type=1&mode=24&page_id=1&ret_num=48"// )//   .then((res) => res.json())//   .then((res) => setMovies(res.data.list));setCollections(loadCollections());}, []);return (<div className="container"><iframe className="m" src={url} frameborder="0"></iframe><div className="movies">{movies.map((item) => (<Moviekey={item.albumId}item={item}startToggle={startToggle}playMovie={playMovie}collections={collections}/>))}</div></div>);}ReactDOM.render(<App />, document.getElementById("app"));</script></body>
</html>

react---收藏的点击和取消(刷新还会存在)--demo相关推荐

  1. React 组件绑定点击事件,并且传参完整Demo

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 1.传数组下标给点击事件Demo: const A = 65 // ASCII character codec ...

  2. 方维模板修改,发布分享、主题有商品时,标签需自动写到input里,不要再手动去点击添加,手动点击可取消...

    方维模板修改,发布分享.主题有商品时,标签需自动写到input里,不要再手动去点击添加,手动点击可取消 方维购物分享系统模板修改,发布分享.主题有商品时,标签需自动写到input里,不要再手动去点击添 ...

  3. react中绑定点击事件_在React中绑定事件处理程序的最佳方法

    react中绑定点击事件 by Charlee Li 通过李李 在React中绑定事件处理程序的最佳方法 (The best way to bind event handlers in React) ...

  4. vueCli3中使用代理,点击页面的刷新按钮时报错

    vueCli3中使用代理,点击页面的刷新按钮时报错 点击刷新变成下面这种情况 解决方式: publicPath: 将其值改为 publicPath: '/'(去掉/前的.) module.export ...

  5. Html中解决点击 a 标签刷新的问题,实现点击时不刷新

    Html中解决点击 a 标签刷新的问题,实现点击时不刷新 参考文章: (1)Html中解决点击 a 标签刷新的问题,实现点击时不刷新 (2)https://www.cnblogs.com/iStu/p ...

  6. react中onClick点击事件

    react中onClick点击事件里的函数必须是箭头函数,不能在onClick{}括号里直接调用函数,不然相当于onClick{调用完的值},根本不会有效了,所以有这几种写法 1. 2. 3.

  7. QTableWidget点击空白处取消选中

    头文件 #include <QEvent> #include <QMouseEvent> 函数声明 //事件过滤bool eventFilter(QObject *obj, Q ...

  8. jQuery 验证码输入错误后自动刷新验证码 点击验证码图片刷新验证码

    利用jQuery的attr()函数,向Servlet发出请求的时候加一个随机数, 保证每次都是不同的请求 $('#imgVcode').attr("src","/veri ...

  9. 为什么点击验证码不刷新

    后台生成验证码,前台显示验证码,但是点击验证码不刷新,google F12的时候却点击就刷新了. 一直以为相同路径下的重复请求,在我开了 disable cache的时候是不会缓存的,后来打开设置才发 ...

  10. React map遍历点击获取key

    React map遍历点击获取key值 在使用react的时候不免需要遍历循环出dom,这时候可以通过点击过去产生的的每个dom的标识来操作 首先准备一个需要遍历循环的集合,可以是键值对,也可以是数组 ...

最新文章

  1. 10.31NOIP模拟赛解题报告
  2. 关于bufferKnife8.8.1点击事件无效的原因
  3. 滤波器开发之一:基于算数平均的平滑滤波器
  4. 2021年11月Python小屋编程比赛获奖名单
  5. Typora免费版,不是破解版,是没有升级的老版本,用的还是比较舒服的
  6. 极光java sdk_极光使用服务端使用java sdk 出现异常 日志如下
  7. 5G啊5G,你是不是只比4G多一G?
  8. snipaste_截图神器
  9. tm影像辐射定标_遥感卫星图像辐射定标制作
  10. Tunnello安装指南
  11. 端午趣味征文赛已上线,就等你创作啦
  12. Linux网卡模块,裁剪Linux并实现网卡模块的安装(附有命令移植的脚本)
  13. 关于图片不变形适应屏幕的解决方法(vue为例)
  14. Cocos Creator基于热更新的分包方案
  15. 安全生产月知识竞赛——新安法知多少
  16. 真实案例详述:丢手机太危险了
  17. 从u盘到计算机内存的过程,U盘装系统步骤图解(超详细)
  18. JavaScript(23) 创建元素标签和属性在body中(jQuery插件)
  19. 用windows“记事本”创建一个文本文件(hamlet.txt),其中每行包含一段英文。试读出文件的全部内容,并判断:(1)该文本文件有多少行?(2)文件中以大写字母开头的有多少行?
  20. 原生JavaScript实现打字游戏

热门文章

  1. 五子棋c语言策划书活动内容,五子棋活动策划书.docx
  2. 《一本书读懂大数据营销 玩透大数据营销 创造网络营销奇迹》pdf下载 百度云
  3. 产品方法论—如何竞品分析
  4. Ubuntu+Windows双系统远程重启互相切换
  5. Esp8266 进阶之路33【安全篇】细聊HmacMD5的加密方法带来的安全性,并实践在esp8266上,最大保障传输的过程的信息的安全性。(附带Demo)
  6. JVM -XX:MaxDirectMemorySize
  7. 沪深A股分析数据财务分析信息API接口(JSON标准格式,Get请求方式)
  8. “云”到底是什么?云计算7种类型细分
  9. 放牛奶的冰箱(二分答案)
  10. 计算机视觉结合深度学习项目-智能停车场空车位实时识别