react 网易云音乐实战项目笔记

0、项目规范

在这里插入图片描述
在这里插入图片描述

一、路由相关

npm i react-router-dom
npm i react-router-config // 用于配置路由映射的关系数组

1. 路由重定向

访问 /路径 =》 重定向到 /discover路径
在这里插入图片描述

在这里插入图片描述

2. 二级路由:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二、网络请求相关

npm i axios

页面中使用暴露 出来的request发送网络请求:

在这里插入图片描述

封装service:

config.js: 配置baseUrl、timeout等参数

const devBaseURL = "http://123.207.32.32:9001";
const proBaseURL = "http://123.207.32.32:9001";
export const BASE_URL = process.env.NODE_ENV === 'development' ? devBaseURL: proBaseURL;export const TIMEOUT = 5000;

request.js:创建一个axios实例暴露出去,供整个项目的所有页面使用

import axios from 'axios';
import { BASE_URL, TIMEOUT } from "./config";
const instance = axios.create({baseURL: BASE_URL,timeout: TIMEOUT
});
instance.interceptors.request.use(config => {// 1.发送网络请求时, 在界面的中间位置显示Loading的组件// 2.某一些请求要求用户必须携带token, 如果没有携带, 那么直接跳转到登录页面// 3.params/data序列化的操作return config;
}, err => {
});
instance.interceptors.response.use(res => {return res.data;
}, err => {if (err && err.response) {switch (err.response.status) {case 400:console.log("请求错误");break;case 401:console.log("未授权访问");break;default:console.log("其他错误信息");}}return err;
});export default instance;

在这里插入图片描述
在这里插入图片描述

三、redux相关

redux代码规范如下:

  • 每个模块有自己独立的reducer,通过combineReducer进行合并;
  • 异步请求代码使用redux-thunk,并且写在actionCreators中;
  • redux直接采用redux hooks方式编写,不再使用connect;
npm i redux react-redux redux-thunk

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

使用redux提供的hook来简化代码:

在这里插入图片描述
在这里插入图片描述

import React, {memo, useEffect} from "react";
import {shallowEqual, useDispatch, useSelector} from "react-redux";
import {getTopBannerAction} from "./store/actionCreator";function HYRecommend(props) {const {topBanners} = useSelector((state) => {return {topBanners: state.recommend.topBanners}}, shallowEqual)// 组件和redux关联要做两件事:// 1. 获取数据// 2. 进行操作const dispatch = useDispatch()// 发送网络请求useEffect(() => {dispatch(getTopBannerAction())}, [dispatch])return (<div><h2>HYRecommend:{topBanners.length}</h2></div>)
}
export default memo(HYRecommend)/*function HYRecommend(props) {const {getBanners, topBanners} = propsuseEffect(() => {getBanners()}, [getBanners])return (<div><h2>HYRecommend: {topBanners.length}</h2></div>)
}
const mapStateToProps = (state) => {return {topBanners: state.recommend.topBanners}
}
const mapDispatchToProps = (dispatch) => {return {getBanners: () => {dispatch(getTopBannerAction())}}
}
export default connect(mapStateToProps, mapDispatchToProps)(memo(HYRecommend))*/

四、数据可变性的问题

在React开发中,我们总是会强调数据的不可变性:

  • 无论是类组件中的state,还是redux中管理的state;
  • 事实上在整个JavaScript编码过程中,数据的不可变性都是非常重要的;

数据的可变性引发的问题(案例):
在这里插入图片描述

  • 我们明明没有修改obj,只是修改了info,但是最终obj也被我们修改掉了;
  • 原因非常简单,对象是引用类型,它们指向同一块内存空间,两个引用都可以任意修改;

有没有办法解决上面的问题呢?

  • 进行对象的拷贝即可:Object.assign或扩展运算符

这种对象的浅拷贝有没有问题呢?

  • 从代码的角度来说,没有问题,也解决了我们实际开发中一些潜在风险;
  • 从性能的角度来说,有问题,如果对象过于庞大,这种拷贝的方式会带来性能问题以及内存浪费;

有人会说,开发中不都是这样做的吗?

  • 从来如此,便是对的吗?

认识ImmutableJS

为了解决上面的问题,出现了Immutable对象的概念:

  • Immutable对象的特点是只要修改了对象,就会返回一个
    新的对象,旧的对象不会发生改变;

但是这样的方式就不会浪费内存了吗?

  • 为了节约内存,又出现了一个新的算法:Persistent Data
    Structure(持久化数据结构或一致性数据结构);

当然,我们一听到持久化第一反应应该是数据被保存到本地或
者数据库,但是这里并不是这个含义:

  • 用一种数据结构来保存数据;
  • 当数据被修改时,会返回一个对象,但是新的对象会尽可
    能的利用之前的数据结构而不会对内存造成浪费;

如何做到这一点呢?结构共享。

ImutableJS常见API

注意:我这里只是演示了一些API,更多的方式可以参考官网;

JavaScript和ImmutableJS直接的转换

  • 对象转换成Immutable对象:Map;
    在这里插入图片描述

  • 数组转换成Immutable数组:List;
    在这里插入图片描述

  • 深层转换:fromJS;
    在这里插入图片描述

  • Immutable类型转成:toJS();

ImmutableJS的基本操作:

  • 修改数据:set
  • 获取数据:get

在项目中,结合Redux管理数据:

  • 1.使用redux-immutable中的combineReducers;
npm i redux-immutable

在这里插入图片描述

  • 2.所有的reducer中的数据都转换成Immutable类型的数据;
npm i immutable

在这里插入图片描述

在这里插入图片描述

五、style相关

.CSS采用普通CSS和styled-component结合来编写(全局采用普通CSS、局部采用styled-component);
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、在项目中:使用redux保存网络请求获取的数据,并供页面使用的步骤

  1. 修改对应组件recommend中的store/reducers.js文件:
    在这里插入图片描述

  2. 在store/constants.js文件中新增 常量:
    在这里插入图片描述

  3. 封装api接口函数:
    在这里插入图片描述

  4. 在store/actionCreator.js文件中新增getAction和changeAction函数:
    在这里插入图片描述

  5. 在需要拿到数据的页面中的
    useEffect hook中派发一个getAction,在getAction函数中会执行发送网络请求的代码,拿到响应数据:
    在这里插入图片描述

  6. 然后执行changeAction函数:
    在这里插入图片描述
    在changeAction函数中会返回一个对象

{type: 'changeXXX',data: 发送网络请求得到的数据
}

,然后redux内部会执行reducers函数:更新redux的state对象中存储的数据
在这里插入图片描述

  1. 在需要使用数据的页面中,通过redux提供的useSelector hook 拿到redux中保存的数据,供页面展示使用:
    在这里插入图片描述
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react项目打包

一、react项目打包 对于使用脚手架创建的项目&#xff0c;打包是一件非常容易的事情&#xff1a; yarn build其他文件没有太多要解析的&#xff0c;我们看一下js文件&#xff1a; [hash].chunk.js 代表是所有依赖的第三方库&#xff0c; vendor(第三方库) 的代码&#xff1b…

React SSR

一、为什么需要SSR呢&#xff1f; 单页面富应用的局限&#xff1a; 之前我们开发的应用程序&#xff0c;如果直接请求可以看到上面几乎没有什么内容。 但是为什么我们页面可以看到大量的内容呢&#xff1f; 因为当我们请求下来静态资源之后会执行JS&#xff0c;JS会去请求数…

Vue3 组件通信学习笔记

一、父子组件之间通信 父子组件之间如何进行通信呢&#xff1f; 父组件传递给子组件&#xff1a;通过props属性&#xff1b;子组件传递给父组件&#xff1a;通过$emit触发事件&#xff1b; 1.1 父组件传递给子组件 在开发中很常见的就是父子组件之间通信&#xff0c;比如父…

Vue3 slot插槽——(默认插槽、具名插槽、作用域插槽)

一、认识插槽Slot 在开发中&#xff0c;我们会经常封装一个个可复用的组件&#xff1a; 前面我们会通过props传递给组件一些数据&#xff0c;让组件来进行展示&#xff1b;但是为了让这个组件具备更强的通用性&#xff0c;我们不能将组件中的内容限制为固定的div、span等等这…

Vue动态组件和组件缓存

一、切换组件案例 比如我们现在想要实现了一个功能&#xff1a; 点击一个tab-bar&#xff0c;切换不同的组件显示&#xff1b; 这个案例我们可以通过两种不同的实现思路来实现&#xff1a; 方式一&#xff1a;通过v-if来判断&#xff0c;显示不同的组件&#xff1b; 方式二…

Webpack的代码分包Vue3中定义异步组件分包refs的使用

一、默认的打包过程&#xff1a; 默认情况下&#xff0c;在构建整个组件树的过程中&#xff0c;因为组件和组件之间是通过模块化直接依赖的&#xff0c;那么webpack在打包时就会将组件模块打包到一起&#xff08;比如一个app.js文件中&#xff09;&#xff1b; 这个时候随着项…

组件的v-model Mixin extends

一、组件的v-model 前面我们在input中可以使用v-model来完成双向绑定&#xff1a; 这个时候往往会非常方便&#xff0c;因为v-model默认帮助我们完成了两件事&#xff1b;v-bind:value的数据绑定 和 input的事件监听&#xff1b; 如果我们现在封装了一个组件&#xff0c;其…

Vue3过渡动画实现

一、认识动画 在开发中&#xff0c;我们想要给一个组件的显示和消失添加某种过渡动画&#xff0c;可以很好的增加用户体验&#xff1a; React框架本身并没有提供任何动画相关的API&#xff0c;所以在React中使用过渡动画我们需要使用一个第三方库react-transition-group&…

Vue3 Composition API(一)——setup、reactive、ref、readonly

一、Options API的弊端 在Vue2中&#xff0c;我们编写组件的方式是Options API&#xff1a; Options API的一大特点就是在对应的属性中编写对应的功能模块&#xff1b;比如data定义数据、methods中定义方法、computed中定义计算属性、watch中监听属性改变&#xff0c;也包括生…

dex文件格式二

一. dex文件头(1) magic value在DexFile.c dexFileParse函数中 会先检查magic opt啥是magic opt呢? 我们刚刚从cache目录拷贝出来的那个前面的dey 036就是magic opt在源码中会先解析magic opt,然后重设dexfile指针重设magic opt指针后开始解析magic value这 8 个 字节一般是…

Vue3 Composition API(二)——computed、watchEffect、setup中使用ref

一、computed 在前面我们讲解过计算属性computed&#xff1a;当我们的某些属性是依赖其他状态时&#xff0c;我们可以使用计算属性来处理 在前面的Options API中&#xff0c;我们是使用computed选项来完成的&#xff1b;在Composition API中&#xff0c;我们可以在 setup 函数中…

【Git】笔记1

学习廖雪峰Git教程的笔记 Git是什么&#xff1a; Git是目前世界上最先进的分布式版本控制系统 Git与Github的关系&#xff1a;github是一个用git做版本控制的项目托管平台&#xff0c;它为开源项目免费提供Git存储 Git的创建者&#xff1a;Linus&#xff0c;就是创建了linux的那…

支持字典_手把手教你学Python之字典

字典是一种无序可变的容器&#xff0c;字典中的元素都是"键(key):值(value)"对&#xff0c; “键”和“值”之间用冒号隔开&#xff0c;所有“键值对”放在一对大括号“{}”中&#xff0c;元素之间用逗号分隔。在同一个字典中&#xff0c;“键”必须是唯一的&#xf…

Vue3 Composition API(三)——生命周期钩子、Provide函数 和 Inject函数、封装Hook案例、setup顶层编写方式

一、生命周期钩子 我们前面说过 setup 可以用来替代 data 、 methods 、 computed 、watch 等等这些选项&#xff0c;也可以替代 生命周期钩子。 那么setup中如何使用生命周期函数呢&#xff1f; 可以使用直接导入的 onX 函数注册生命周期钩子&#xff1b; 二、Provide函数 和…

单尺度二维离散小波重构(逆变换)idwt2

clc,clear all,close all; load woman; %单尺度二维离散小波分解。分解小波函数haar [cA,cH,cV,cD]dwt2(X,haar); %单尺度二维离散小波重构(逆变换) Yidwt2(cA,cH,cV,cD,haar); figure; subplot(1,2,1),imshow(X,map),title(原始图像); subplot(1,2,2),imshow(Y,map),title(重构…

python导出数据顿号做分隔符_Python语言和matplotlib库做数据可视化分析

这是我的第51篇原创文章&#xff0c;关于数据可视化分析。阅读完本文&#xff0c;你可以知道&#xff1a;1 Python语言的可视化库—matplotlib?2 使用matplotlib实现常用的可视化&#xff1f;0前言数据记者和信息设计师&#xff0c;David McCandless&#xff0c;在他的TED演讲…

Vue3 高级语法(一)—— h函数、jsx

一、认识h函数 Vue推荐在绝大数情况下使用模板来创建你的HTML&#xff0c;然后一些特殊的场景&#xff0c;你真的需要JavaScript的完全编程的能力&#xff0c;这个时候你可以使用渲染函数 &#xff0c;它比模板更接近编译器&#xff1b; 前面我们讲解过VNode和VDOM的改变&#…

Vue3 高级语法(二)—— 自定义指令、Teleport、Vue插件

一、认识自定义指令 在Vue的模板语法中我们学习过各种各样的指令&#xff1a;v-show、v-for、v-model等等&#xff0c;除了使用这些指令之外&#xff0c;Vue也允许我们来自定义自己的指令。 注意&#xff1a;在Vue中&#xff0c;代码的复用和抽象主要还是通过组件&#xff1b;通…

Vue-Router4 学习笔记

一、URL的hash 前端路由是如何做到URL和内容进行映射呢&#xff1f;监听URL的改变。 URL的hash也就是锚点(#), 本质上是改变window.location的href属性&#xff1b; 我们可以通过直接赋值location.hash来改变href, 但是页面不发生刷新&#xff1b; hash的优势就是兼容性更好&am…

Vuex4学习笔记

一、Vuex的状态管理 二、Vuex的安装 我们这里使用的是vuex4.x&#xff0c;安装的时候需要添加 next 指定版本&#xff1b; npm install vuexnext三、创建Store 每一个Vuex应用的核心就是store&#xff08;仓库&#xff09;&#xff1a; store本质上是一个容器&#xff0c;它…