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} = props
    useEffect(() => {
        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中保存的数据,供页面展示使用:
    在这里插入图片描述
    在这里插入图片描述
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值