React开发实践(7)实战部分 Header 组件开发 2

简介: React开发实践(7)实战部分 Header 组件开发 2

1、如何 使用 immutable 管理 store 的数据 ?

1、安装  yarn add immutable
2、使用 fromJS 将我们 store 的数据 转为 immutable 类型
3、然后 更改数据时 使用 set 方法 
4、取数据 使用 get 方法 
复制代码

*reducer.js

网络异常,图片无法展示
|

  • 页面使用 数据

网络异常,图片无法展示
|

  • 页面效果 非常 nice !

2、统一数据结构   redux-immutable 怎么使用 ?

1、安装 yarn add redux-immutable
2、更改 combinReducers 引入 从这个 引入 
3、然后 更改页面调用方式 
复制代码
  • 为啥需要这个内容 ? 数据获取方式 不一样  此处更改需要 在 src/store/reducer.js 更改

网络异常,图片无法展示
|

  • src/store/reducer.js

网络异常,图片无法展示
|

  • 页面内使用

网络异常,图片无法展示
|

  • 非常nice !

3、热门搜索 样式 布局 开始

1、先写 最外层的 容器  SearchInfo
   2、写标题部分 SearchTitle 切换部分 SearchSwitch
   3、小的内容使用 SearchList 包裹 
   4、写小的 item    SearchItem
   5、写好之后 这篇区域触发条件就是 props.isFocused  提取为一个函数放在 外面 命名为 renderSearchInfo
复制代码
  • 多说一句 react 只能兼容到 ie8以上的浏览器
  • renderSearchInfo

网络异常,图片无法展示
|

  • 每块需要的样式
export const SearchInfo = styled.div`
  position: absolute;
  left: 0;
  top: 56px;
  width: 240px;
  padding: 0 20px;
  box-shadow: 0 0 8px rgba(0, 0, 0, 0.2);
`;
export const SearchTitle = styled.div`
  margin-top: 20px;
  margin-bottom: 15px;
  line-height: 20px;
  font-size: 14px;
  color: #969696;
  cursor: pointer;
`;
export const SearchSwitch = styled.div`
  float: right;
  font-size: 13px;
  cursor: pointer;
`;
export const SearchList = styled.div``;
export const SearchItem = styled.a`
  display: block;
  float: left;
  line-height: 20px;
  padding: 0 5px;
  font-size: 12px;
  border: 1px solid #ddd;
  color: #787878;
  border-radius: 3px;
  margin: 10px 10px;
  cursor: pointer;
`;
复制代码

4、AJAX 获取 数据 实现 搜索部分下面的内容

  • 准备发请求部分
0、先将 header/index 改成 class 组件,方便之后使用生命周期函数
  1、需要 安装 redux-thunk 使得 action 可以写成函数形式 
  2、在 store.index.js 配置一下
  3、actionCreator.js 写数据请求 使用 fetch 内置fetch 当然也可安装 axios
  4、在 public 文件夹下 新建 api 文件夹 建一个 headerList.json 文件
  5、因为 create-react-app 这个底层基于 node 服务 会先在 src 下找这个文件 如果没有这个接口 会在 public 寻找
复制代码
  • 使用 thunk   store.index.js 配置一下

网络异常,图片无法展示
|

  • actionCreator.js

网络异常,图片无法展示
|

  • public 文件夹下的数据模拟部分

网络异常,图片无法展示
|

  • 然后 在 组件内 调用一下

网络异常,图片无法展示
|

  • 当 input focus 时 可以发现发送请求 拿到了结果

网络异常,图片无法展示
|

  • 拿到请求后 渲染数据
1、在 actionCreator.js 创建 action 并dispatch 到 store 
  2、reduce.js 处理 (prevState,action) --> newState 此处需要注意 更新state 需要 action.payload 数据  也就说 state.xxx = action.xxx  xxx是 payload 内容
  2、在页面先拿到数据(mapStateToProps)  然后使用 .map 渲染数据 
  3、愉快的展示出来 
复制代码
  • 注意此处 默认使用 fetch 没有拿到 data 数据 说明 fetch 不能这样用的 暂时更改为 axios

网络异常,图片无法展示
|

  • actionCreator.js

网络异常,图片无法展示
|

  • reduce.js

* 特别注意  reduce 如何得到 新的 state 是使用了 action.payload

网络异常,图片无法展示
|

  • 在页面使用 .map 渲染数据

网络异常,图片无法展示
|

网络异常,图片无法展示
|

  • 查看页面效果

网络异常,图片无法展示
|

  • 非常nice !

有个问题 被忽略掉了 需要 将 actionCreator.ja 接口拿到的数据 统一为 immutable 类型

网络异常,图片无法展示
|

  • 不过现在基本使用 tookit 会自动转为  immutable 所以不用考虑这个

5、稍微 优化一下

1、actionCreator.js 里将不导出的 action 放在顶部或者底部
2、reducer.js 将多个if改写出 switch case 的形式
3、组件内的 this.props.xxx 都使用解构赋值语法 写出来 
4、避免 多次发请求 
复制代码
  • reducer.js

网络异常,图片无法展示
|

  • 解构赋值语法

网络异常,图片无法展示
|

  • 如何避免 多次发请求

### 比较重要的内容:

1、只发一次请求 初始化 数据时 往往放在 didMount 中发起
    2、页面其他地方 只想发送一次请求  往往可以 通过拿到数据内的判断条件来 控制非重复发请求
复制代码

网络异常,图片无法展示
|

网络异常,图片无法展示
|

  • 多次 focus 结果  可通过 size 来判断

网络异常,图片无法展示
|

  • 改成这样 可解决 问题  只发送一次请求

网络异常,图片无法展示
|

6、搜索页 换一换功能实现    

  • 先实现 每页 10条数据 总共有几页数据展示出来
    1、reducer.js 中添加  page 和 totalPage 2、拿到数据后更新 totalPage 3、页面渲染时 更改 显示数量 当然这个使用 page 得出 4、
  • 先更新 totalPage

网络异常,图片无法展示
|

网络异常,图片无法展示
|

  • 页面看一下效果  更新 成功了

网络异常,图片无法展示
|

  • 再更改 页面渲染的 内容
  • 引入 page

网络异常,图片无法展示
|

* 此处 非常 重要 多个内容分页 功能的基本实现思路 非常nice !

网络异常,图片无法展示
|

* 接下来 实现换一换 但 发现有点问题 鼠标点击换一换就消失了 说明 只是 isFocused 条件不行 还需要 添加一个 mouseIn

1、需要 添加一个 mouseIn 来确定鼠标是否移入/移出
    2、在组件添加对应的事件
    3、派发 action 并且写对应的 reducer 处理
    4、组件内 使用 mouseIn
复制代码
  • 先 reducer.js 定义 mouseIn

网络异常,图片无法展示
|

  • 组件添加事件

网络异常,图片无法展示
|

网络异常,图片无法展示
|

  • actionCreator.js 写 action

网络异常,图片无法展示
|

  • reducer.js 处理

网络异常,图片无法展示
|

  • 页面使用

网络异常,图片无法展示
|

网络异常,图片无法展示
|

  • 页面效果非常的 nice !

* 接下来 需要实现 换一换 问题就在于 换一换这个地方 事件怎么写 ?

1、绑定事件 
2、需要拿到 totalPage 和 page 做判断后展示 内容 
3、 actionCreator
4、reducer.js 使用 新的 page
4、页面效果
复制代码

1、绑定事件

网络异常,图片无法展示
|

2、需要拿到 totalPage 和 page 做判断后展示 内容

网络异常,图片无法展示
|

3、 actionCreator

网络异常,图片无法展示
|

4、reducer.js 使用 新的 page

网络异常,图片无法展示
|

5、页面效果非常nice ! 实现点击切换的功能

  • 还有一个 warning 处理 ?

网络异常,图片无法展示
|

  • 我已经给了 key 值 但是 还是 报错,第一反应是 直接 log 一下

网络异常,图片无法展示
|

  • 开始 page = 1 这个循环启动了, newList 不存在 所以 需要确保 拿到接口数据后 newList 存在时 再循环

发现即使 先判断 if(newList){for 循环 }  还是不行,更改 key = {i} 解决这个问题

* 还有一件事情 这种 更改多个 state 可以使用 merge 避免.set().set() 很多个 .set 连接

网络异常,图片无法展示
|

  • 为了解决这个事情 改成这样的写法

网络异常,图片无法展示
|

  • 还有一个小问题

网络异常,图片无法展示
|

网络异常,图片无法展示
|

网络异常,图片无法展示
|

7、换页 旋转动画实现    

  • 先将 icon 引入
1、去 iconfont 找一个 spin
2、然后拿过来 更改一下 iconfont.js 内容 替换掉这个 @font-face 
3、此时可能有样式冲突,更改一下 className 可解决
复制代码

网络异常,图片无法展示
|

网络异常,图片无法展示
|

  • 当前页面实现效果

网络异常,图片无法展示
|

  • 接下来 怎么让它 转动起来
1、添加样式 
  2、使用 ref 拿到 这个i 标签并传递给 handleClick 
  3、拿到 rotate 的数值 部分 此处使用 正则过滤
  4、每次点击 + 360 ,开始为空时 则 设置 rotate = 0
复制代码
  • 样式

网络异常,图片无法展示
|

  • 使用 ref

网络异常,图片无法展示
|

  • 测试点击 hanldeClick 是否可以拿到 ref

网络异常,图片无法展示
|

网络异常,图片无法展示
|

  • 接下来 拿到 rotate 值 取得数字部分

网络异常,图片无法展示
|

  • 页面效果 非常 nice!

撒花 🎉🎉🎉

更多项目请访问 github  github.com/huanhunmao

gitee 项目地址 gitee.com/huanhunmao/…



相关文章
|
3月前
|
开发框架 前端开发 JavaScript
从零开始学习React Native开发
React Native是一种基于React框架的移动端开发框架,使用它可以快速地构建出高性能、原生的移动应用。本文将从零开始,介绍React Native的基础知识和开发流程,帮助读者快速入门React Native开发,并实现一个简单的ToDo应用程序。
|
2月前
|
JavaScript 前端开发 算法
js开发:请解释什么是虚拟DOM(virtual DOM),以及它在React中的应用。
虚拟DOM是React等前端框架的关键技术,它以轻量级JavaScript对象树形式抽象表示实际DOM。当状态改变,React不直接操作DOM,而是先构建新虚拟DOM树。通过高效diff算法比较新旧树,找到最小变更集,仅更新必要部分,提高DOM操作效率,降低性能损耗。虚拟DOM的抽象特性还支持跨平台应用,如React Native。总之,虚拟DOM优化了状态变化时的DOM更新,提升性能和用户体验。
30 0
|
4月前
|
前端开发 开发者
探索前端框架的新趋势:React Hooks的应用与实践
本文将深入探讨前端开发中的新趋势,重点介绍React Hooks的应用与实践。通过学习和使用React Hooks,开发者可以更高效地构建可维护、可扩展的前端应用程序。本文将详细介绍React Hooks的原理、优势以及如何在实际项目中运用Hooks来提高开发效率并改善代码结构。无论你是刚入门前端开发还是经验丰富的工程师,本文都将对你有所启发。
|
4月前
|
存储 移动开发 前端开发
【第35期】一文学会React-Router开发权限
【第35期】一文学会React-Router开发权限
45 0
|
7天前
|
开发框架 Dart 前端开发
【Flutter前端技术开发专栏】Flutter与React Native的对比与选择
【4月更文挑战第30天】对比 Flutter(Dart,强类型,Google支持,快速热重载,高性能渲染)与 React Native(JavaScript,庞大生态,热重载,依赖原生渲染),文章讨论了开发语言、生态系统、性能、开发体验、学习曲线、社区支持及项目选择因素。两者各有优势,选择取决于项目需求、团队技能和长期维护考虑。参考文献包括官方文档和性能比较文章。
【Flutter前端技术开发专栏】Flutter与React Native的对比与选择
|
1天前
|
设计模式 前端开发 API
写出易维护的代码|React开发的设计模式及原则
本文对React社区里出现过的一些设计模式进行了介绍,并讲解了他们遵循的设计原则。
|
4月前
|
前端开发 JavaScript 测试技术
【第55期】一文读懂React组件开发环境
【第55期】一文读懂React组件开发环境
53 1
|
14天前
|
存储 人工智能 开发框架
【AI大模型应用开发】【AutoGPT系列】0. AutoGPT概念及原理介绍 - Agent开发框架及ReAct方法
【AI大模型应用开发】【AutoGPT系列】0. AutoGPT概念及原理介绍 - Agent开发框架及ReAct方法
19 0
|
17天前
|
前端开发 API 开发者
React这些新特性在开发效率上有哪些改进
【4月更文挑战第18天】React 18 提升开发效率,引入新Root API `createRoot`优化挂载,支持渐进式升级,减少迁移成本。新增性能工具如Profiler API和Concurrent Mode,自动化批处理提高性能,减少重渲染。服务器组件优化加载速度,减轻客户端负担。开发者可更高效构建和优化React应用。
73 6
|
25天前
|
JavaScript 前端开发 API
Vue和React,哪个在移动端开发更适合呢
【4月更文挑战第10天】Vue和React在移动端各有优势。Vue以其简单易用、渐进式开发和性能优化吸引开发者,适合初学者和快速迭代项目。而React凭借强大的生态系统、组件化开发模式和卓越性能,尤其在复杂应用和依赖特定库时更具优势。选择应基于项目需求、团队技术栈及性能要求,可先进行技术调研和原型开发。
22 4