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

3066d2e4870a995b971788810ba6cad4.gif

作者 | 👽

来源 | 前端Sharing

66d90d5d1cc4cead76cea66635b510a7.png

前言

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

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

在 react 写 vue 是不是有点不讲武德呢?

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

  • 1 在重温一下vue3.0响应式原理,reactive 和 effect

  • 2 如何编写一个响应式的自定义hooks,学会写自定义hook

  • 3 如何编写一个响应式的HOC,学会写hoc

4570fa6d3deaec63518e1ccd686983a1.png

函数组件-自定义hooks

编写

useReactive自定义hooks

import { reactive, effect  } from '@vue/reactivity'
import React, {  useRef , useEffect, useMemo, useState } from 'react'
function useReactive (initState){const reactiveState = useRef(initState) // 用const [  ,forceUpdate ] = useState(0)const state = useMemo(()=> reactive(reactiveState.current)  ,[ reactiveState.current ]) useEffect(()=>{let isdep = falseeffect(()=>{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/reactivity的 effect初始化执行时,引起的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>
}

效果

dc8caf70b9a4f5da1310afd8fc0963f1.gif

50deba0e2c4be9c010bf88d1796b4ae3.png

类组件-反向继承hoc

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

编写

reactiveHoc高阶组件

import { reactive , effect  } from '@vue/reactivity'
import React from 'react'
function reactiveHoc(Component){const self_componentDidMount = Component.prototype.componentDidMountreturn class WrapComponent extends Component{constructor(props){super(props)this.state = reactive(this.state)}__isFirst = falsecomponentDidMount(){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= thisreturn <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>}
}

36bacb0b8a74df9d7794295f2a5be40b.png

总结

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

c8b8e582e2758a298f6c4123bd449c35.gif

往期推荐

如果让你来设计网络

70% 开发者对云原生一知半解,“云深”如何知处?

浅述 Docker 的容器编排

如何在 Kubernetes Pod 内进行网络抓包

52c90c07c857c66fb047d78f13270e0a.gif

点分享

94c9633407ad439826e2faf987df7817.gif

点收藏

7a5643a80bf410e92f1ddd6728389a72.gif

点点赞

5647943ff65a47c6eed81e96075874cc.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云云效发布研发协同工具,以新的产研协同工作方式助力实现BizDevOps

简介&#xff1a;2021云栖大会云效BizDevOps分论坛上&#xff0c;阿里云云效技术负责人陈鑫发布阿里云云效产品研发协同工具支撑ALPD理论&#xff0c;以新的产研协同工作方式助力实现BizDevOps。 编者按&#xff1a;10月21日&#xff0c;2021云栖大会云效BizDevOps分论坛上&am…

打通JAVA与内核系列之一ReentrantLock锁的实现原理

简介&#xff1a;写JAVA代码的同学都知道&#xff0c;JAVA里的锁有两大类&#xff0c;一类是synchronized锁&#xff0c;一类是concurrent包里的锁&#xff08;JUC锁&#xff09;。其中synchronized锁是JAVA语言层面提供的能力&#xff0c;在此不展开&#xff0c;本文主要讨论J…

android如何创建spinner组件,Andriod开发之下拉列表控件(Spinner)的用法

Spinner是Android的下拉列表控件&#xff0c;今天对这个控件进行了学习&#xff0c;发现该控件比其它简单控件使用起来稍微复杂&#xff0c;特地将Spinner控件的使用方法以及注意事项记录下来&#xff0c;以备后用。Spinner控件在Android中的继承结构如下&#xff1a;java.lang…

恒生与中国信通院联合发布《证券行业分布式核心系统SRE运维白皮书》

在互联网金融模式的变革和冲击下&#xff0c;金融机构面临着海量客户管理、业务场景快速增长、金融服务和产品多样化等挑战。 为应对不断增加的技术创新需求&#xff0c;证券行业核心系统正逐步从传统IT集约型架构向支持敏捷开发、弹性扩容、智能灵活的分布式架构转型&#xff…

媒体声音 | 阿里云王伟民:阿里云数据库的策略与思考

简介&#xff1a;DTCC 2021大会上&#xff0c;阿里云数据库事业部 产品与解决方案部总经理 王伟民&#xff08;花名&#xff1a;唯敏&#xff09;发表主题演讲《云原生数据库2.0&#xff0c;一站式全链路数据管理与服务》&#xff0c;并接受IT168企业级&ITPUB执行总编 老鱼…

阿里云云治理中心正式上线,助力企业快速云落地

简介&#xff1a;2021年11月1日&#xff0c;阿里云"云治理中心"&#xff08;Cloud Governance Center)产品正式上线&#xff0c;云治理中心是基于企业IT治理的最佳实践&#xff0c;帮助客户快速搭建业务上云的标准Landing Zone&#xff08;上云登陆区&#xff09;&am…

超值一篇分享,Docker:从入门到实战过程全记录

作者 | 天元浪子来源 | CSDN博客和Docker相关的概念想要真正理解Docker&#xff0c;就不得不从虚拟化技术的发展历程说起。普遍认为虚拟化技术经历了物理机时代、虚拟机时代&#xff0c;目前已经进入到了容器化时代。可以说&#xff0c;Docker是虚拟化技术不断发展的必然结果。…

linux phpunit 安装,在CentOS 7/CentOS 8系统中安装PHPUnit的方法

本文介绍在CentOS 7/CentOS 8操作系统中安装PHPUnit的方法&#xff0c;只需要运行几个命令就可以了&#xff0c;非常的简单。PHPUnit是PHP应用程序的单元测试框架&#xff0c;它是单元测试框架的xUnit体系结构的一个实例&#xff0c;它在JUnit中很受欢迎&#xff0c;PHPUnit需要…

解读如何安全快速建立IT治理环境

简介&#xff1a;云计算经过十多年的发展&#xff0c;从基础的IAAS&#xff0c;大数据&#xff0c;到各种的PaaS有丰富的产品和生态&#xff0c;非常有效地助力了业务增长和技术创新&#xff0c;并提高了业务的效率。最直观的感受是过去需要几天到一个月的资源交付&#xff0c;…

com+ system application 启动_dubbo启动引导过程(基于2.7.9)

前言再百度或google上一搜索dubbo服务暴露过程 相关的文章已经有很多了&#xff0c;但是文章基本都是基于老版本的dubbo&#xff0c;当你对着文章去看下载下来的代码时&#xff0c;会发现很多东西对不上&#xff1b;出于此目的&#xff0c;我便有了自己根据新版本&#xff08;就…

函数计算 GB 镜像秒级启动:下一代软硬件架构协同优化

简介&#xff1a;本文将介绍借助函数计算下一代 IaaS 底座神龙裸金属和安全容器&#xff0c;进一步降低绝对延迟且能够大幅降低冷启动频率。 作者&#xff1a;修踪 背景 函数计算在 2020 年 8 月创新地提供了容器镜像的函数部署方式。AWS Lambda 在 2020 年 12 月 Re-Invent…

为什么服务端程序都需要先 listen 一下?

作者 | 张彦飞allen来源 | 开发内功修炼大家都知道&#xff0c;在创建一个服务器程序的时候&#xff0c;需要先 listen 一下&#xff0c;然后才能接收客户端的请求。例如下面的这段代码我们再熟悉不过了。int main(int argc, char const *argv[]) {int fd socket(AF_INET, SOC…

10个Bug环环相扣,你能解开几个?

简介&#xff1a;由阿里云云效主办的2021年第3届83行代码挑战赛已经收官。超2万人围观&#xff0c;近4000人参赛&#xff0c;85个团队组团来战。大赛采用游戏闯关玩儿法&#xff0c;融合元宇宙科幻和剧本杀元素&#xff0c;让一众开发者玩得不亦乐乎。 今天请来决赛赛题设计者…

小小智慧树机器人_国网营业厅“AI新势力”,科沃斯商用机器人解锁智慧服务新模式!...

智慧营业厅新格局&#xff0c;AI机器人成标配&#xff1f;AI加持&#xff0c;万物互联、万物智能。2019年&#xff0c;应用人工智能的门槛下降&#xff0c;大量人工智能催生的新产品、服务和最佳实践轮番出现。人工智能正在重塑各行各业&#xff0c;传统营业厅网点该如何搭上AI…

AIoT时代存储如何升级?长江存储发布高速闪存芯片UFS 3.1

2022年4月19日&#xff0c;长江存储科技有限责任公司&#xff08;简称“长江存储”&#xff09;宣布推出UFS 3.1通用闪存——UC023。这是长江存储为5G时代精心打造的一款高速闪存芯片&#xff0c;可广泛适用于高端旗舰智能手机、平板电脑、AR/VR等智能终端领域&#xff0c;以满…

零信任策略下云上安全信息与事件管理实践

简介&#xff1a;随着企业数字化转型的深入推进&#xff0c;网络安全越来越被企业所重视。为了构建完备的安全防御体系&#xff0c;企业通常会引入了防火墙(Firewall)、防病毒系统(Anti-Virus System&#xff0c;AVS)、入侵防御系统(Intrusion Prevention System&#xff0c;IP…

kl散度度量分布_数据挖掘比赛技巧——确定数据同分布

在数据挖掘比赛中&#xff0c;很重要的一个技巧就是要确定训练集与测试集特征是否同分布&#xff0c;这也是机器学习的一个很重要的假设[1]。但很多时候我们知道这个道理&#xff0c;却很难有方法来保证数据同分布&#xff0c;这篇文章就分享一下我所了解的同分布检验方法。封面…

Inclavare Containers:云原生机密计算的未来

简介&#xff1a;本文为你详细的梳理一次 Inclavare Containers 项目的发展脉络&#xff0c;解读它的核心思想和创新技术。 作为业界首个面向机密计算场景的开源容器运行时&#xff0c;Inclavare Containers 项目于 2020 年 5 月开源&#xff0c;短短一年多时间内发展势头非常迅…

没有操作系统程序可以运行起来吗?

作者 | 陆小风来源 | 码农的荒岛求生现在的程序员对操作系统已经习以为常了&#xff0c;但是你有没有想过&#xff0c;如果没有操作系统的话我们可以让程序运行起来吗&#xff1f;先说答案&#xff0c;当然是可以的&#xff0c;而且必须是可以的。你可以从这个角度来思考&#…

sysAK(青囊)系统运维工具集:如何实现高效自动化运维?| 龙蜥技术

简介&#xff1a;What is sysAK、典型工具介绍、开源 3 方面介绍了 sysAK 系统&#xff0c;目前 sysAK 工具集已经在龙蜥社区开源&#xff0c;并且在系统运维 SIG、跟踪诊断 SIG 一起共建&#xff0c;希望大家后期加入 SIG 一起讨论共建。 编者按&#xff1a;本文整理自「云栖…