前端知识库Reactjs系列三(hooks和高阶组件)

简介: 接着上一小节到内容,下面我们会来详细介绍上一节中提到到相关知识。本节我把reactjs hooks和高阶组件放在一起是因为这两块内容都是组件化中相关的内容。高阶组件使用过reactjs的人都应该有所了解,hooks是reactjs 16.8.0新增的属性。想再老项目中使用 hooks完全不用担心兼容性问题,因为hooks 是100% 向后兼容的。本节详细谈谈hooks的 使用方式以及相关概念。

前言


接着上一小节到内容,下面我们会来详细介绍上一节中提到到相关知识。本节我把reactjs  hooks和高阶组件放在一起是因为这两块内容都是组件化中相关的内容。高阶组件使用过reactjs的人都应该有所了解,hooks是reactjs 16.8.0新增的属性。想再老项目中使用 hooks完全不用担心兼容性问题,因为hooks 是100% 向后兼容的。本节详细谈谈hooks的 使用方式以及相关概念。

高阶组件


  • 先来谈谈高阶组件解决了什么问题:reactjs文档中介绍高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧,由此可见他是用来解决组件复用的一种技巧,也可以说高阶组件是一种参数为组件,返回值为新组件的函数。

作用

  • 无副作用: 没有副作用的情况下实现组件的复用,注意没有副作用是关键点。
  • 重用函数:高阶组件可以提取出可重用的函数,简你的state和生命周期方法。
  • 装饰器:高阶组件可以作为装饰器来使用,如mobx-react
  • 渲染劫持:劫持组件的props和state

简单实例

  • 我们实际编程中总会遇到多个组件中处理相似的问题,如果把这写组件都写一遍是不是很傻,高阶组件就可以解决这个尴尬。假设我们有A B两个组件,他们的大部分实现都是相同的
import React, { Component } from 'react'
class A extends React.Component {
  constructor(props) {
    super(props);
    this.handleChange = this.handleChange.bind(this);
    this.state = {
      data: "data"
    };
  }
  componentDidMount() {
     let data = "初始化数据"
     this.setState({ data })
  }
  handleChange() {
    this.setState({ data: "改变数据"});
  }
  render() {
    return  (<div><span>这是组件A自己的内容</span>
            <h2  onClick={this.handleChange.bind(this)}>{this.props.data}</h2></div>)
  }
}
class B extends React.Component {
  constructor(props) {
    super(props);
    this.state = { data: "data"};
  }
  componentDidMount() {
     let data = "初始化数据"
     this.setState({ data })
  }
  handleChange() {
    this.setState({ data: "改变数据"});
  }
  render() {
    return (<div>这是组件B自己的内容
            <h2 onClick={this.handleChange.bind(this)}>{this.props.data}</h2></div> )
  }
}
  • 根据两个组件的特性封装高阶组件(将两个组件共通点抽取出来)
import React, { Component } from 'react'
    const hocBox = WrappedComponent => {
      return class extends Component{
        componentWillMount() {
          let data = "这是hoc的data"
          this.setState({ data })
        }
        handleChange = () =>{
           this.setState({ data: "改变数据"});
        }
        render() {
          return <WrappedComponent update={this._alert} {...this.props}/> 
        }
      }
    }
    export default hocBox
  • 调用
import hocBox from './hocBox';
class C extends Component{...}
C = WrapperHello(C)
export default C

使用方式

  • 两种常见的用法属性代理(高阶组件通过ComponentClass的props来进行相关操作) 和 继承反转(高阶组件继承自ComponentClass)
  • 属性代理:多用于组件的复用,例如装饰器:
复制代码
function WrapperComp(Comp) {
    class WrapComp extends React.Component {
        render() {
            return (
                <div>
                    <p>属性代理高阶组件</p>
                    <Comp {...this.props}></Comp>
                </div>
            )
        }
    }
    return WrapComp;
}
@WrapComp
class A extends React.Component {
    render() {
        return <h4>hello Jason</h4>
    }
}

此时A组件就相当于如下:

class A extends React.Component {
        render() {
            return (
                <div>
                    <p>这是react高阶组件特有的元素</p>
                    <h4>hello Jason</h4>
                </div>
            )
        }
    }
  • 继承反转:组件和包装组件之间的关系是继承关系而不是代理的方式,可以修改原组件的生命周期,渲染流程和业务逻辑.多用于渲染的劫持。
function WrapperComp(Comp) {
    class WrapComp extends Comp {
        componentDidMount() {
            console.log('反向代理高阶组件')
        }
        render() {
            return <Comp {...this.props}></Comp>
        }
    }
    return WrapComp;
}
@WrapperComp
class A extends React.Component {
    componentDidMount() {
        console.log('加载完成')
    }
    render() {
        return <h4>反向继承父组件</h4>
    }
}

注意:反向继承的高阶组件中的state和props会覆盖调原组件中的state和props

可能遇到的问题

  • 原组件定义的静态方法丢失:如果我们原组件中定义了静态方法
  • refs不被传递:在高阶组件中,ref不会被传递。可以使用React.forwardRef来实现ref的传递。
  • 组件重新挂载:不要在 render 方法中使用 HOC,因为每次render 是都会创建一个新的高阶组件这将导致该组件及其所有子组件 的状态丢失

hooks


hooks的基本概念我们在上一小节中已经了解过了,本节主要来学习hooks的使用,以及详细分析hooks带来的便利

常用api

  • useState:返回一个 state,以及更新 state 的函数。相当于类组件中的state和 setstate
const [state, setState] = useState(initialState);
  • useEffect:Effect Hook 可以让你在函数组件中执行副作用操作。类似于类组件中的函数componentDidMount  componentDidUpdate
// Similar to componentDidMount and componentDidUpdate:
  useEffect(() => {
    // Update the document title using the browser API
    document.title = `You clicked ${count} times`;
  });

useEffect 可以在组件渲染后实现各种不同的副作用。有些副作用可能需要清除,所以需要返回一个函数:

useEffect(() => {
    function handleStatusChange(status) {
      setIsOnline(status.isOnline);
    }
    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    return () => {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
  });

注:通过使用这个 Hook,你可以告诉 React 组件需要在渲染后执行某些操作。React 会保存你传递的函数(我们将它称之为 “effect”),并且在执行 DOM 更新之后调用它。详情参见官方文档

作用

  • 函数中可以使用类中特有state和setstate
  • 减少了类组件的使用,加快了页面渲染。
  • 解决了在组件之间复用状态逻辑很难的问题
  • 降低组件的复杂度

总结


本章把hooks和高阶组件放在一起来分析,那是因为我觉的这两点都是reactjs在函数式编程上具有创造性的代码书写方式。现今前端逐渐的组件化,项目越来越复杂如果没有采用一个好的架构方式,我认为这将大大缩短项目的存活周期,以及大大降低开发效率。


相关文章
|
12天前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
144 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
28天前
|
Dart 前端开发
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
116 75
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
25天前
|
Dart 前端开发 容器
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
75 18
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
3月前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
280 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
|
3月前
|
前端开发 JavaScript 开发者
“揭秘React Hooks的神秘面纱:如何掌握这些改变游戏规则的超能力以打造无敌前端应用”
【10月更文挑战第25天】React Hooks 自 2018 年推出以来,已成为 React 功能组件的重要组成部分。本文全面解析了 React Hooks 的核心概念,包括 `useState` 和 `useEffect` 的使用方法,并提供了最佳实践,如避免过度使用 Hooks、保持 Hooks 调用顺序一致、使用 `useReducer` 管理复杂状态逻辑、自定义 Hooks 封装复用逻辑等,帮助开发者更高效地使用 Hooks,构建健壮且易于维护的 React 应用。
56 2
|
3月前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
63 1
|
Web App开发 缓存 前端开发
前端框架react研究
前端框架react研究
|
Web App开发 前端开发 JavaScript
前端框架react研究
摘要:      最近公司要做一个嵌套在app中的应用,考虑着用Facebook的react来开发view,所以就研究了下。下面是我在开发中遇到的坑,希望能给你帮助。 项目地址:https://github.com/baixuexiyang/react Issue:https://github.com/baixuexiyang/react/issues 欢迎star和fork! react优势: 仅仅只要表达出你的应用程序在任一个时间点应该长的样子,然后当底层的数据变了,React 会自动处理所有用户界面的更新。
782 0
|
9月前
|
设计模式 前端开发 数据可视化
【第4期】一文了解React UI 组件库
【第4期】一文了解React UI 组件库
452 0
|
9月前
|
资源调度 前端开发 JavaScript
React 的antd-mobile 组件库,嵌套路由
React 的antd-mobile 组件库,嵌套路由
160 0

热门文章

最新文章

  • 1
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 4
    详解智能编码在前端研发的创新应用
  • 5
    巧用通义灵码,提升前端研发效率
  • 6
    智能编码在前端研发的创新应用
  • 7
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 8
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
  • 9
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 10
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡