React | React组件化开发(四)

简介: React | React组件化开发(四)

四、React的高阶组件

认识高阶函数(Hooks后用的较少)

  • 什么是高阶组件?
  • 高阶组件跟高阶函数非常相似.


  • 高阶函数的百科定义:至少满足以下条件之一:
  • 接收一个或多个函数作为输入
  • 输出一个函数


  • JavaScript中比较常见的filter,map,redue都是高阶函数
  • 那么什么是高阶组件呢?
  • 高阶组件(Hight-Order Components)简称HOC
  • 官方的定义:高阶组件是参数为组价,返回值为新组件的函数
  • 1.高阶组件 本身不是一个组件 而是一个函数
  • 2.这个函数的参数是一个组件,返回值也是一个组件

高阶组件的定义

  • 高阶组件的调用过程类似于这样

26ce9917671e47af8a6001ed04033ed7.png

  • 高阶函数的编写过程类似于这样

fae343fd897f4f97b73a621135e08c33.png

  • 高阶组件并不是React API的一部分 它是基于React 的组合特性而形成的设计模式
  • 高阶组件在一些React第三方库中非常常见:
  • 比如redux中的connect
  • 比如react-router中的withRouter


  • 组件的名称问题
  • 在ES6中,类表达式中类名是可以省略的
  • 组件的名称都可以通过displayName来修改


开发中:应用一:props的加强

  • 不修改原有代码的情况下 添加新的props

64a9f4bf935a481dbb8c00356214e1ec.png

  • 利用高阶组件来共享Context

e051f6f44a274c668f717c283d82c8e9.png

开发中:应用二:渲染判断鉴权

  • 在开发中,我们可能遇到这样的场景:
  • 某些页面是必须用户登录成功才能进行进入
  • 如果用户没有登录成功 那么直接跳转到登录页面


  • 这个时候 我们就可以使用高阶组件来完成鉴权操作

1458720382914e0aaa235127e1ef9075.png

开发中:应用三:生命周期劫持

  • 我们也可以利用高阶函数来劫持生命周期,在生命周期中完成自己的逻辑

a8b1ae19b37c4aecbdfe824f7b3cb8ab.png

高阶函数的意义

  • 我们会发现利用高阶组件可以针对某些React代码进行更加优雅的处理
  • 早期的React有提供组件之间的一种复用方式是mixin 目前已经不再建议使用
  • Mixin 可能会相互依赖 相互耦合 不利于代码维护
  • 不同的Mixin中的方法可能会相互冲突
  • Mixin非常多时 组件处理起来会比较麻烦 甚至还要为其做相关处理 这样会给代码造成滚雪球式的复杂


  • 当然 HOC也有自己的一些缺陷
  • HOC需要在原组件上进行包裹或者嵌套 如果大量使用HOC 将会产生非常多的嵌套 这让调试变得非常困难
  • HOC可以劫持props 在不遵守约定的情况下也可能造成冲突


  • Hooks的出现 是开创性的 它解决了很多React之前的存在的问题
  • 比如this指向问题 hoc的嵌套复杂度问题等等

ref的转发

  • ref不能应用于函数式组件
  • 因为函数式组件没有实例 所以不能获取到对应的组件对象


  • 在开发中我们可能想要获取函数式组件中某个元素的DOM 这个时候我们应该如何操作呢
  • 直接传入ref属性(错误做法)
  • 通过forwardRef高阶函数

2e13ba8a355645608545f4fab2d93a61.png

五、portals和fragment

portals的使用

  • 某些情况下 我们希望渲染的内容独立于父组件 甚至是独立于当前挂载到的DOM元素中(默认都是挂载到id为root的DOM元素上)
  • Portal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案
  • 第一个参数(child)是任何可渲染的 React 子元素 例如一个元素 字符串或 fragment
  • 第二个参数(container)是一个 DOM 元素

99c98079d262400c8e8b73b4fe2c3025.png

  • 通常来说 当你从组件的 render 方法返回一个元素时 该元素将被挂载到 DOM 节点中离其最近的父节点
  • 然而 有时候将子元素插入到 DOM 节点中的不同位置也是有好处的

85430b0eb1c348da809d75b5ef1dd2d9.png

04a1eebddd0247b8b98f6020194bc571.png

fragment(片段)的使用

  • 在之前的开发中 我们总是在一个组件中返回内容时包裹一个div元素
  • 我们又希望可以不渲染这样一个div应该如何操作呢
  • 使用Fragment
  • Fragment 允许你将子列表分组 而无需向 DOM 添加额外节点


  • React还提供了Fragment的短语法
  • 它看起来像空标签 <>
  • 如果我们需要在Fragment中添加key 那么就不能使用短语法

六、StrictMode严格模式

StrictMode

  • StrictMode 是一个用来突出显示应用程序中潜在问题的工具
  • 与 Fragment 一样 StrictMode 不会渲染任何可见的 UI
  • 它为其后代元素触发额外的检查和警告
  • 严格模式检查仅在开发模式下运行 它们不会影响生产构建


可以为应用程序的任何部分启用严格模式

  • 不会对 Header 和 Footer 组件运行严格模式检查
  • 但是 ComponentOne 和 ComponentTwo 以及它们的所有后代元素都将进行检查

1c257efde4e54e2fa70407d098f4485a.png

严格模式检查的是什么?

  • 识别不安全的生命周期
  • 使用过时的ref API
  • 检测意外的副作用
  • 这个组件的constructor会被调用两次
  • 因为严格模式下故意进行的操作,让你来查看在这里写的一些逻辑代码被调用多次是否会产生一些副作用
  • 在生产环境中,是不是会被调用两次


  • 使用废弃的findDOMNode方法
  • 在之前的React API中 可以通过findDOMNode来获取DOM


  • 检测过时的context API
  • 早期的Context是通过static属性声明Context对象属性 通过getChildContext返回Context对象等方式来使用Context的
相关文章
|
1月前
|
前端开发 JavaScript API
React开发需要了解的10个库
本文首发于微信公众号“前端徐徐”,介绍了React及其常用库。React是由Meta开发的JavaScript库,用于构建动态用户界面,广泛应用于Facebook、Instagram等知名网站。文章详细讲解了Axios、Formik、React Helmet、React-Redux、React Router DOM、Dotenv、ESLint、Storybook、Framer Motion和React Bootstrap等库的使用方法和应用场景,帮助开发者提升开发效率和代码质量。
116 4
React开发需要了解的10个库
|
3月前
|
设计模式 存储 前端开发
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
|
1月前
|
前端开发 JavaScript 开发者
React 组件化开发最佳实践
【10月更文挑战第4天】React 组件化开发最佳实践
49 4
|
2月前
|
XML 移动开发 前端开发
使用duxapp开发 React Native App 事半功倍
对于Taro的壳子,或者原生React Native,都会存在 `android` `ios`这两个文件夹,而在duxapp中,这些文件夹的内容是自动生成的,那么对于需要在这些文件夹中修改的配置内容,例如包名、版本号、新架构开关等,都通过配置文件的方式配置了,而不需要需修改具体的文件
|
2月前
|
资源调度 JavaScript 前端开发
使用vite+react+ts+Ant Design开发后台管理项目(二)
使用vite+react+ts+Ant Design开发后台管理项目(二)
|
2月前
|
存储 前端开发 JavaScript
react 组件化
【9月更文挑战第2天】react 组件化
35 5
|
3月前
|
JavaScript 前端开发 安全
[译] 使用 TypeScript 开发 React Hooks
[译] 使用 TypeScript 开发 React Hooks
|
3月前
|
前端开发 JavaScript
React Server Component 使用问题之添加jsx的组件化能力,如何操作
React Server Component 使用问题之添加jsx的组件化能力,如何操作
|
3月前
|
开发者 自然语言处理 存储
语言不再是壁垒:掌握 JSF 国际化技巧,轻松构建多语言支持的 Web 应用
【8月更文挑战第31天】JavaServer Faces (JSF) 框架提供了强大的国际化 (I18N) 和本地化 (L10N) 支持,使开发者能轻松添加多语言功能。本文通过具体案例展示如何在 JSF 应用中实现多语言支持,包括创建项目、配置语言资源文件 (`messages_xx.properties`)、设置 `web.xml`、编写 Managed Bean (`LanguageBean`) 处理语言选择,以及使用 Facelets 页面 (`index.xhtml`) 显示多语言消息。通过这些步骤,你将学会如何配置 JSF 环境、编写语言资源文件,并实现动态语言切换。
41 0
|
3月前
|
开发者 Java
JSF EL 表达式:乘技术潮流之风,筑简洁开发之梦,触动开发者心弦的强大语言
【8月更文挑战第31天】JavaServer Faces (JSF) 的表达式语言 (EL) 是一种强大的工具,允许开发者在 JSF 页面和后台 bean 间进行简洁高效的数据绑定。本文介绍了 JSF EL 的基本概念及使用技巧,包括访问 bean 属性和方法、数据绑定、内置对象使用、条件判断和循环等,并分享了最佳实践建议,帮助提升开发效率和代码质量。
47 0