Day18. Redux回顾&邂逅React路由

Redux收尾

  • reducer做一个拆解
  • 拆分到对应的文件夹里面, 每个文件夹都有对应的4个文件
  • 目录结构划分
  • 实际项目会拆解的更细致
  • combineReducers, redux提供的合并函数
const reducer = combineReducers({
  counterInfo: counterReducer,
  homeInfo: homeReducer
})
内部帮助执行.png

combineReducer的原理

image.png
  • 看源码
  • 一点点的去读


    源码.png
  • 返回值的本身又是一个函数
  • 自己写的reducer函数有什么缺点? action没有改变任何数据, 最终返回的还是原来的state对象, 没有必要return一个新的对象


    每次都会返回一个新的对象.png
  • combineReduce帮我们做的一个操作, 又发生改变返回一个新的对象, 没有发生改变不返回新的对象


    是否需要返回一个新的对象.png
  • 核心逻辑就是根据action去获取下个状态,然后进行比较

React中的state如何管理

  • 三种方式

    • 方式一: 组件中自己的state管理;
    • 方式二: Context数据的共享状态;
    • 方式三: Redux管理应用状态;
  • 在开发中如何选择呢?

    • 没有一个标准的答案, 官网也说了
    • 某些用户, 选择将所有的状态放到Reduc中进行管理, 方便追踪共享;
    • 某些用户, 选择将某些组件自己的状态放到组件内部进行管理;
    • 某些用户, 将类似于主题、用户信息等数据放到Context中进行共享和管理;
    • 作为一个开发者, 到底选择怎样的状态管理方式, 是开发者的工作之一


      image.png
  • Redux的坐着给出的建议:

    • 在区分到底如何选择的时候, 作者判断状态是否需要被多个组件或页面共享, 并且当路由发生改变的时候, 页面销毁, 有些状态可能需要被保存持久化. 对于这种数据, 作者认为需要被保存到redux中.
      管理建议.png
  • coderwhy的建议:

    • UI相关的组件内部可以维护的状态, 在组建累不自己来维护; Loading的显示, isLoad = true; tabbar有三个选项, 用户点击操作, currentIndex = 1, 不需要进行共享, 交给组件自己管理


      自己的组件进行维护.png
    • 大部分是需要共享状态, 都交给redux来管理和维护;(并不是非常绝对的, 父子组件相互传递比较方便时自己管理)
    • 从服务器请求的数据(包括请求的操作), 交给redux来维护;
  • 根据不同的情况会进行适当的调整.

后续想要补充的东西

  • 结合实际的项目补充
  • Redux和ImmutableJS结合使用;
  • 一些性能优化的知识;(防止组件动不动就发生刷新)

Redux回顾

  • 纯函数, Redux的Reducer就是一个纯函数, (函数式编程)
  • 为什么要使用Redux
  • Redux核心理念, 三大原则
  • Redux的基本使用, 自己搭建了一个简单项目
  • Redux里面的目录结构进行一个拆分, node对ES6模块化的支持, node已经可以升级到12.x的版本了, 建议升级到LTS最新版本
  • Redux流程图
  • React结合Redux的使用, redux融入react代码里面
  • 自定义connect函数, 返回一个高阶组件, 公共代码放到组件类里面, 之后通过map的方式告诉需要哪些事件
  • context如何进行store共享, 原来直接导入store, 不好封装库
  • => react-redux官方库, 直接使用封装好的Provider
  • 异步操作, 中间件, redux-thunk, dispatch一个action函数
  • devtools工具
  • redux-saga, 补充generator, saga使用
  • 中间件的原理, Monkey Patching修改dispatch
  • Reducer的拆分, 通过封装的reducer, combineReducer
  • React中的state到底如何管理的分析
  • thunk用起来容易点用的多, saga可以传入一个函数
  • 多练习, 项目中用起来

单向数据流

  • 比较广的一个概念
  • 数据的传递应该是一个单向的, 只能往一个方向传
  • 三个地方看到过这个概念,
  1. React官方中有提到单向数据流, 组件之前数据的传递, 组件树, 数据在进行共享的时候只能从上往下传递, 像水流一样流到下面. 通过props进行数据的传递
  2. Vue和React中组件内部都有单向数据流的概念; 在同一个组件里面, 有UI界面, 产生一个action, 有可能会修改State,


    image.png
  3. Redux中, 一个固定的流程, 组件中发生事件, dispatch(action), 形成一个闭环, 整个过程中不能越级


    不能越级.png

TransitionGroup的警告问题

  • 在group的里面, button, in去除不需要加上去


    image.png

    消除警告.png

React-router的使用

路由的由来

  • 映射关系, 路由表


    i路由的由来.png
  • 编程里面路由的概念, 最早是后端里面, 前后端分离, 单页面富应用(SPA), 编程和建筑学

阶段一: 后端路由(渲染)阶段

  • 早期的网站开发整个HTML页面是由服务器来渲染的.
    • 服务器直接生产渲染好对应的HTML页面, 后面给客户端进行展示. (SEO优化, 爬虫静态页面, ssr(服务端渲染), 谷歌执行JavaScript代码帮助发送Ajax请求, 搜索结果)
  • 但是, 一个网站, 这么多页面服务器如何处理呢?
    • 一个页面有自己对应的网址, 也就是URL.
    • URL会发送到服务器, 服务器会通过正则对该URL进行匹配, 并且最后交给一个Controller进行处理.
    • Controller进行各种处理, 最终生成HTML或者数据, 返回给前端.
    • 这就完成了一个IO操作.
  • 服务端完成页面的渲染, 服务器端渲染(SSR) server side render.


    后端路由, 服务端渲染.png

    后端路由.png
  • 前后端分离, 解耦

阶段二: 前后端分离阶段

  • 前端渲染的理解:
    • 每次请求涉及到的静态资源都会从静态资源服务器获取;
    • 这些资源包括HTML+CSS+JS, 然后在前端对这些请求回来的资源进行渲染;
    • 需要注意的是, 客户端的每一次请求, 都会从静态资源服务器请求文件;
    • 同时可以看到, 和之前的后端路由不同, 这时后端只是负责提供API了;
  • restful接口规范, 后端提供接口文档, 不需要关注前端实现
  • 这样后端不仅能给web端提供数据, 还能给iOS、安卓、PC提供支持


    image.png

阶段三: 单页面富应用(SPA)

  • 单页面富应用的理解:
    • 单页面富应用的英文是single-page application, 简称SPA;
    • 整个Web应用实际上只有一个页面, 当URL发生改变时, 并不会从服务器请求新的静态资源;
    • 而是通过JavaScript监听URL的改变, 并且根据URL的不同区渲染新的页面;


      image.png
单页面富应用.png

-目前比较多的是处于第三个阶段, 单页面富应用

前端路由的原理

前端路由的核心:

  1. 改变URL, 但使页面不要进行强制刷新(a元素不行)
  2. 自己来监听URL的改变, 并且改变之后自己改变页面的内容
  • URL后面跟上一个哈希值, 页面不会发生刷新, URL的哈希, 有一个缺点, 中间莫名多了一个#
  • HTML5中的history模式修改URL
  • 当监听到URL发生改变的时候, 自己决定显示什么内容

URL的hash

  • URL的hash
    • URL的hash也就是锚点(#), 本质上是改变window.location的href属性;
    • 我们可以通过直接赋值location.href
window.addEventLIstener("hashchange", () => {
  switch (location.hash) {
    case: "#/home":
      routerViewEl.innerHTML = "首页";
      break;
    case "#/about":
      routerViewEl.innerHTML = "关于";
      break;
    default:
      routertViewEl.innerHTML = "";
  }
})
image.png

HTML5的history

  • history接口是HTML5新增的, 他有六种模式改变URL而不刷新页面


    image.png
// 1. 获取reouter-view的DOM
const routerViewEl = document.getElementsByClassName("router-view")[0];

// 获取所有的a元素, 自己来监听a元素的改变
const aEls = document.getElementsByTagName("a");
for (let el of aEls) {
  el.addEventListener("click", e => {
    e.preventDefault();
    const href = el.getAttribute("href");
    console.log("a元素发生了点击");
    history.pushState({}, "", href);
  })
 }

// 执行返回操作时, 依然来到urlChange
window.addEventListener("popState", urlChange);
// window.addEventListener("go", urlChange);// 手动执行go时监听

// 监听URL的改变
function urlChange() {
   switch (location.pathname) {
    case: "/home":
      routerViewEl.innerHTML = "首页";
      break;
    case "/about":
      routerViewEl.innerHTML = "关于";
      break;
    default:
      routertViewEl.innerHTML = "";
  }
}
image.png

react-router

  • 目前前端流行的三大框架, 都有自己的路由实现:
    • Angular的ngRouter
    • React的react-router
    • Vue的vue-router
  • React Router的版本4开始, 路由不再集中在一个包中进行管理了:
    • react-router是router的核心部分代码;
    • react-router-dom是用于浏览器的;
    • react-router-native是用于原生应用的;
  • 目前我们使用React Router最新的版本是v5的版本:
    • 实际上v4的版本和v5的版本差异不大;(写错了一个版本依赖, 直接升级了)
  • 安装react-router:
    • 安装dom会自动帮助我们安装react-router的依赖 yarn add react-router-dom

Router的基本使用

  • react-router最主要的API是给我们提供的一些组件:
    • BrowserRouter或HashRouter:
    • Link和NavLink:
    • Route:


      image.png
<HashRouter>
  <Link to="/" >首页</Link>
  <Link to="/about" >关于</Link>
  <Link to="/profile" >我的</Link>

  <Route exact path="/" component={Home} />
  <Route path="/about" component={About} />
  <Route path="/profile" component={Profile} />
</HashRouter>

coderwhy的React核心技术与开发实战课程链接

少年~来做同学呀~.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260