我在react里写vue3 ,还写了自定义hooks和Hoc构建了响应式

简介: react 中如何实现响应式

前言

自从vue3.0正式发布之后,vue3.0核心响应式部分被单独抽离成@vue/reactivity包,也就是说,我们可以脱离vue框架之外,单独使用@vue/reactivity做一些其他的愉快的事😊,于是乎笔者突发奇想,为何不用@vue/reactivityreact中,构建响应式,省着每次调用this.setState,useState,直接通过改变state值,做到更新视图。

😂😂😂说干就干,为了可以量化生产,复用逻辑,我在function组件中写了一个自定义hooks-useReactive ,在class组件中写了一个高阶组件reactiveHoc

reactvue 是不是有点不讲武德呢?

download.jpg

实际写这篇文章的目的是:

  • 1 在重温一下vue3.0响应式原理,reactiveeffect
  • 2 如何编写一个响应式的自定义hooks,学会写自定义hook
  • 3 如何编写一个响应式的HOC,学会写hoc

函数组件-自定义hooks - useReactive

编写

useReactive自定义hooks

import {
   
    reactive, effect  } from '@vue/reactivity'
import React, {
   
     useRef , useEffect, useMemo, useState } from 'react'
function useReactive (initState){
   
   
   const reactiveState = useRef(initState) // state 
   const [  ,forceUpdate ] = useState(0)
   const state = useMemo(()=> reactive(reactiveState.current)  ,[ reactiveState.current ]) 
   useEffect(()=>{
   
   
       let isdep = false
       effect(()=>{
   
   
           for(let i in state ){
   
    state[i] } //依赖收集
           isdep && forceUpdate(num => num + 1)  // 强制更新
           if(!isdep) isdep = true
       })
   },[ state ])
   return state
}

思路:

  • ① 用useRef保存响应式对象,并构建响应式,为什么选择useRef,在函数组件执行更新中,只有Ref-Hooks一直使用的是原始对象,这之前的hooks原理中讲过。这样做的好处,防止函数组件更新时候,响应式对象丢失。
  • ② 用useMemo缓存响应式对象,当Ref对象被篡改,重新构建响应式。
  • ③ 用useEffect做响应式的依赖收集,用开关isdep,防止初始化@vue/reactivityeffect初始化执行时,引起的forceUpdate引发的,额外的组件更新。
  • ④ 用一个useState,做强制更新。
  • ⑤ 在effect对象中,for(let i in state ){ state[i] }遍历 Ref对象 ,做依赖收集。

使用

function Index(){
   
   
   const state = useReactive({
   
    number:1  , name:'alien' })
   return <div className="box" >
       <div className="show" >
           <div> 你的姓名是: {
   
    state.name } </div>
           <div>{
   
    new Array(state.number).fill(0).map(()=> '👽') }</div>
       </div>
       <div className="constrol" >
            <div> <button onClick={
   
    ()=> state.number++ } >👽++</button> </div>
            <div> <button onClick={
   
    ()=> state.number-- } >👽--</button>  </div>
            <input placeholder="姓名" value={
   
   state.name}  onChange={
   
    (e:any) =>  state.name = e.target.value   }  />       
       </div>
   </div>
}

效果

响应式.gif

类组件-反向继承hoc-reactiveHoc

function组件中,我们可以使用自定义hook,构建响应式; 那么在class类组件中,我们如何构建响应式呢,每次在业务组件中引进reactiveeffect,手动绑定,显然不是很切合实际,也不是我们的追求,这个时候,hoc高阶组件就派上用场了。我们接着往下看:

编写

reactiveHoc高阶组件

import {
   
    reactive , effect  } from '@vue/reactivity'
import React from 'react'
function reactiveHoc(Component){
   
   
    const self_componentDidMount = Component.prototype.componentDidMount
    return class WrapComponent extends Component{
   
   
        constructor(props){
   
   
            super(props)
            this.state = reactive(this.state)
        }
        __isFirst = false
        componentDidMount(){
   
   
            effect(()=>{
   
   
                for(let i in this.state ){
   
    this.state[i] }  //构建响应式
                this.__isFirst && this.forceUpdate()
                !this.__isFirst && (this.__isFirst = true )     
            }) 
            self_componentDidMount && self_componentDidMount.call(this)
        }
    }
}

思路:

  • 为什么要选择反向继承模式 HOC 呢? ,因为我们可以通过一个反正继承的hoc,访问到内部的state状态,对于内部的state,进行reactive响应式处理。
  • ② 劫持类组件周期componentDidMount,在hoccomponentDidMount中同样做依赖收集。

使用

@reactiveHoc
class Index extends React.Component{
   
   
    constructor(props){
   
   
        super(props)
        this.state={
   
   
            number:0,
            name:'alien'
        }
    }
    componentDidMount(){
   
   
        console.log(6666)
    }
    render(){
   
   
        const {
   
    state } :any= this
        return <div className="box" >
        <div className="show" >
            <div> 你的姓名是: {
   
    state.name } </div>
            <div>{
   
    new Array(state.number).fill(0).map(()=> '👽') }</div>
        </div>
        <div className="constrol" >
             <div> <button onClick={
   
    ()=> state.number++ } >👽++</button> </div>
             <div> <button onClick={
   
    ()=> state.number-- } >👽--</button>  </div>
             <input placeholder="姓名" value={
   
   state.name}  onChange={
   
    (e:any) =>  state.name = e.target.value   }  />       
        </div>
    </div>
    }
}

总结

本文主要的目的并不是教大家在react@vue/reactivity构建响应式,可以当娱乐玩玩罢了,主要目的是结合上两篇文章,教大家更好编写自定义hookshoc。早日进阶react技术栈。

最后, 送人玫瑰,手留余香,觉得有收获的朋友可以给笔者点赞,关注一波 ,陆续更新前端超硬核文章。

如果文章中,有不明白地方,建议先看往期文章:

react-hooks三部曲

react-hoc

vue3.0响应式原理

相关文章
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
11月前
|
前端开发 JavaScript NoSQL
使用 Node.js、Express 和 React 构建强大的 API
本文详细介绍如何使用 Node.js、Express 和 React 构建强大且动态的 API。从开发环境搭建到集成 React 前端,再到利用 APIPost 高效测试 API,适合各水平开发者。内容涵盖 Node.js 运行时、Express 框架与 React 库的基础知识及协同工作方式,还涉及数据库连接和前后端数据交互。通过实际代码示例,助你快速上手并优化应用性能。
|
编解码 前端开发 开发者
React 图片组件样式自定义:常见问题与解决方案
在 React 开发中,图片组件的样式自定义常因细节问题导致布局错乱、性能损耗或交互异常。本文系统梳理常见问题及解决方案,涵盖基础样式应用、响应式设计、加载状态与性能优化等,结合代码案例帮助开发者高效实现图片组件的样式控制。重点解决图片尺寸不匹配、边框阴影不一致、移动端显示模糊、加载失败处理及懒加载等问题,并总结易错点和最佳实践,助力开发者提升开发效率和用户体验。
442 22
|
Web App开发 移动开发 前端开发
React 视频播放器样式自定义实战指南
本文详细介绍了如何在React项目中实现视频播放器的样式自定义,涵盖HTML5 `&lt;video&gt;`标签的基础知识、CSS样式定制技巧及常见问题解决方案。针对全屏模式样式失效、移动端触摸事件冲突和进度条样式定制等问题提供了具体代码示例。同时,探讨了视频预加载策略和内存优化方法,并推荐了几款调试工具,帮助开发者提升用户体验和应用性能。
397 6
|
Web App开发 移动开发 前端开发
React音频播放器样式自定义全解析:从入门到避坑指南
在React中使用HTML5原生&lt;audio&gt;标签时,开发者常面临视觉一致性缺失、样式定制局限和交互体验割裂等问题。通过隐藏原生控件并构建自定义UI层,可以实现完全可控的播放器视觉风格,避免状态不同步等典型问题。结合事件监听、进度条拖拽、浏览器兼容性处理及性能优化技巧,可构建高性能、可维护的音频组件,满足跨平台需求。建议优先使用成熟音频库(如react-player),仅在深度定制需求时采用原生方案。
519 12
|
JavaScript 前端开发 UED
vue2和vue3的响应式原理有何不同?
大家好,我是V哥。本文详细对比了Vue 2与Vue 3的响应式原理:Vue 2基于`Object.defineProperty()`,适合小型项目但存在性能瓶颈;Vue 3采用`Proxy`,大幅优化初始化、更新性能及内存占用,更高效稳定。此外,我建议前端开发者关注鸿蒙趋势,2025年将是国产化替代关键期,推荐《鸿蒙 HarmonyOS 开发之路》卷1助你入行。老项目用Vue 2?不妨升级到Vue 3,提升用户体验!关注V哥爱编程,全栈开发轻松上手。
824 2
|
缓存 JavaScript UED
优化Vue的响应式性能
【10月更文挑战第13天】优化 Vue 的响应式性能是一个持续的过程,需要不断地探索和实践,以适应不断变化的应用需求和性能挑战。
310 57
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
205 18
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
455 17
|
监控 JavaScript 算法
深度剖析 Vue.js 响应式原理:从数据劫持到视图更新的全流程详解
本文深入解析Vue.js的响应式机制,从数据劫持到视图更新的全过程,详细讲解了其实现原理和运作流程。