前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >写给vue转react的同志们(5)

写给vue转react的同志们(5)

作者头像
饼干_
发布于 2022-09-19 07:17:39
发布于 2022-09-19 07:17:39
41400
代码可运行
举报
运行总次数:0
代码可运行

theme: channing-cyan

本系列文章将由浅慢慢深入,一步步带你领略react和vue的同工异曲之处,让你左手react,右手vue无忧。

前提要顾: 点击查看该系列专栏

Vue 与 React 的高阶组件

我们知道 React 中使用高阶组件(下面简称HOC)来复用一些组件的逻辑。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。具体而言,高阶组件是参数为组件,返回值为新组件的函数。

组件是将 props 转换为 UI,而高阶组件是将组件转换为另一个组件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const EnhancedComponent = higherOrderComponent(WrappedComponent);

上面出自 React 官方文档。

那在 Vue 中 复用组件逻辑实际上比较简单,利用 Mixins 混入复用组件逻辑,当 Mixins 中的逻辑过多时(比如方法和属性),在项目当中使用时追述源代码会比较麻烦,因为他在混入后没有明确告诉你哪个方法是被复用的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//mixins.js(Vue 2 举例)
export defalut {
    data() {
        return {
            text: 'hello'
        }
    }
}
// a.vue
import mixins from './mixins.js'
export defalut {
    mixins: [mixins]
    computed: {
        acitveText() {
            return `来自mixins的数据:${this.text}`
        }
    }
}

可以看到除了在开头引入并挂载混入,并没有看到this.text是从哪里来的,混入虽然好用,但当逻辑复杂时,其阅读起来是有一定困难的。

那你想在 Vue 中强行使用像 React 那样的高阶组件呢?那当然可以。只是 Vue 官方不怎么推崇 HOC,且 Mixins 本身可以实现 HOC 相关功能。

简单举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// hoc.js
import Vue from 'Vue'

export default const HOC = (component, text) => {
    return Vue.component('HOC', {
        render(createElement) {
            return createElement(component, {
                on: { ...this.$listeners },
                props: {
                    text: this.text
                }
            })
        },
        data() {
            return {
                text: text,
                hocText: 'HOC'
            }
        },
        mounted() {
            // do something ...
            console.log(this.text)
            console.log(this.hocText)
        }
    })
}

使用高阶组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// user.vue
<template>
  <userInfo/>
</template>

<script>
import HOC from './hoc.js'
// 引入某个组件
import xxx from './xxx'

const userInfo = HOC(xxx, 'hello')

export default {
  name: 'user',
  components: {
    userInfo
  }
}
</script>

是不是相比 Mixins 更加复杂一点了?在 Vue 中使用高阶组件所带来的收益相对于 Mixins 并没有质的变化。不过话又说回来,起初 React 也是使用 Mixins 来完成代码复用的,比如为了避免组件的非必要的重复渲染可以在组件中混入 PureRenderMixin

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const PureRenderMixin = require('react-addons-pure-render-mixin')
const component = React.createClass({
    mixins: [PureRenderMixin]
})

后来 React 使用shallowCompare 来 替代 PureRenderMixin

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const shallowCompare = require('react-addons-shallow-compare')
const component = React.createClass({
    shouldComponentUpdate: (nextProps, nextState) => {
        return shallowCompare(nextProps, nextState)
    }
})

这需要你自己在组件中实现 shouldComponentUpdate 方法,只不过这个方法具体的工作由 shallowCompare 帮你完成,我们只需调用即可。

再后来 React 为了避免总是要重复调用这段代码,React.PureComponent 应运而生,总之 React 在慢慢将 Mixins 脱离开来,这对他们的生态系统并不是特别的契合。当然每种方案都各有千秋,只是是否适合自己的框架。

那我们回归 HOC,在 React 中如何封装 HOC 呢?

实际上我在往期篇幅有提到过: 点击传送

但是我还是简单举个例子:

封装 HOC:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// hoc.js
export default const HOC = (WrappedComponent) => {
    return Class newComponent extends WrappedComponent {
        constructor(props) {
            super(props)
            // do something ...
            this.state = {
                text: 'hello'
            }
        }
        componentDidMount() {
            super.componentDidMount()
            // do something ...
            console.log('this.state.text')
        }
        render() {
            // init render
            return super.render()
        }
    }
}

使用 HOC:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// user.js
import HOC from './hoc.js'
class user extends React.Component {
    // do something ...
}
export defalut HOC(user)

装饰器写法更为简洁:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import HOC from './hoc.js'
@HOC
class user extends React.Component {
    // do something ...
}
export defalut user

可以看到无论 Vue 还是 React 亦或是 HOC 或 Mixins 他们都是为了解决组件逻辑复用应运而生的,具体使用哪一种方案还要看你的项目契合度等其他因素。

技术本身并无好坏,只是会随着时间推移被其他更适合的方案取代,技术迭代也是必然的,相信作为一个优秀的程序员也不会去讨论一个技术的好或坏,只有适合与否。

最后

都看到这里了,不点个赞再走吗?

欢迎在下方给出你的建议和留言。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面试官:你是怎样进行react组件代码复用的
Mixin(混入)是一种通过扩展收集功能的方式,它本质上是将一个对象的属性拷贝到另一个对象上面去,可以拷贝多个属性到一个对象上,为了解决代码复用问题。
beifeng1996
2022/10/11
3760
腾讯前端二面常考react面试题总结
组件是 React 应用 UI 的构建块。这些组件将整个 UI 分成小的独立并可重用的部分。每个组件彼此独立,而不会影响 UI 的其余部分。
beifeng1996
2022/11/09
1.5K0
React系列-Mixin、HOC、Render Props
在讲react-hooks之前,我们来捋捋react状态逻辑复用相关知识点,这会帮助你理解hooks
落落落洛克
2021/01/08
2.4K0
React系列-Mixin、HOC、Render Props
React应用优化:避免不必要的render
React在组件的生命周期方法中提供了一个钩子shouldComponentUpdate,这个方法默认返回true,表示需要重新执行render方法并使用其返回的结果作为新的Virtual DOM节点。通过实现这个方法,并在合适的时候返回false,告诉React可以不用重新执行render,而是使用原有的Virtual DOM 节点,这是最常用的避免render的手段,这一方式也常被很形象地称为“短路”(short circuit)。
博文视点Broadview
2020/06/12
1.4K0
「react进阶」一文吃透React高阶组件(HOC)
React高阶组件(HOC),对于很多react开发者来说并不陌生,它是灵活使用react组件的一种技巧,高阶组件本身不是组件,它是一个参数为组件,返回值也是一个组件的函数。高阶作用用于强化组件,复用逻辑,提升渲染性能等作用。高阶组件也并不是很难理解,其实接触过后还是蛮简单的,接下来我将按照,高阶组件理解?,高阶组件具体怎么使用?应用场景, 高阶组件实践(源码级别) 为突破口,带大家详细了解一下高阶组件。本文篇幅比较长,建议收藏观看
用户6835371
2021/06/01
2.2K0
「react进阶」一文吃透React高阶组件(HOC)
前端技能树,面试复习第 19 天—— React 基础一点通
React 并不是将 click 事件绑定到了 div 的真实 DOM 上,而是在 document 处监听了所有的事件,当事件发生并且冒泡到 document 处的时候,React 将事件内容封装并交由真正的处理函数运行。这样的方式不仅仅减少了内存的消耗,还能在组件挂在销毁时统一订阅和移除事件。
前端修罗场
2023/10/07
3460
前端技能树,面试复习第 19 天—— React 基础一点通
【React深入】从Mixin到HOC再到Hook(原创)
前端发展速度非常之快,页面和组件变得越来越复杂,如何更好的实现 状态逻辑复用一直都是应用程序中重要的一部分,这直接关系着应用程序的质量以及维护的难易程度。
ConardLi
2019/05/23
1.8K0
React 代码共享最佳实践方式
任何一个项目发展到一定复杂性的时候,必然会面临逻辑复用的问题。在React中实现逻辑复用通常有以下几种方式:Mixin、高阶组件(HOC)、修饰器(decorator)、Render Props、Hook。本文主要就以上几种方式的优缺点作分析,帮助开发者针对业务场景作出更适合的方式。
winty
2021/05/18
3.1K0
React组件间逻辑复用
React 里,组件是代码复用的主要单元,基于组合的组件复用机制相当优雅。而对于更细粒度的逻辑(状态逻辑、行为逻辑等),复用起来却不那么容易:
ayqy贾杰
2019/06/12
1.5K0
React组件间逻辑复用
React组件复用的方式
现前端的工程化越发重要,虽然使用Ctrl+C与Ctrl+V同样能够完成需求,但是一旦面临修改那就是一项庞大的任务,于是减少代码的拷贝,增加封装复用能力,实现可维护、可复用的代码就变得尤为重要,在React中组件是代码复用的主要单元,基于组合的组件复用机制相当优雅,而对于更细粒度的逻辑(状态逻辑、行为逻辑等),复用起来却不那么容易,很难把状态逻辑拆出来作为一个可复用的函数或组件,实际上在Hooks出现之前,都缺少一种简单直接的组件行为扩展方式,对于Mixin、HOC、Render Props都算是在既有(组件机制的)游戏规则下探索出来的上层模式,一直没有从根源上很好地解决组件间逻辑复用的问题,直到Hooks登上舞台,下面我们就来介绍一下Mixin、HOC、Render Props、Hooks四种组件间复用的方式。
WindRunnerMax
2021/02/25
2.9K0
react面试如何回答才能让面试官满意
注意:batchingStrategy 对象可以理解为“锁管理器”。这里的“锁”,是指 React 全局唯一的 isBatchingUpdates 变量,isBatchingUpdates 的初始值是 false,意味着“当前并未进行任何批量更新操作”。每当 React 调用 batchedUpdate 去执行更新动作时,会先把这个锁给“锁上”(置为 true),表明“现在正处于批量更新过程中”。当锁被“锁上”的时候,任何需要更新的组件都只能暂时进入 dirtyComponents 里排队等候下一次的批量更新,而不能随意“插队”。此处体现的“任务锁”的思想,是 React 面对大量状态仍然能够实现有序分批处理的基石。
beifeng1996
2022/09/22
9370
React面试八股文(第二期)
React.forwardRef 会创建一个React组件,这个组件能够将其接受的 ref 属性转发到其组件树下的另一个组件中。这种技术并不常见,但在以下两种场景中特别有用:
beifeng1996
2022/10/19
1.6K0
这些react面试题你会吗,反正我回答的不好
第二个参数是一个函数,该函数会在 setState函数调用完成并且组件开始重渲染时调用,可以用该函数来监听渲染是否完成。
beifeng1996
2022/09/24
1.2K0
Airbnb React/JSX 风格指南
// bad <div accessKey="h" /> // good <div />
ConardLi
2019/05/23
1.4K0
react高频知识点梳理
路由匹配是通过比较 <Route> 的 path 属性和当前地址的 pathname 来实现的。当一个 <Route> 匹配成功时,它将渲染其内容,当它不匹配时就会渲染 null。没有路径的 <Route> 将始终被匹配。
beifeng1996
2022/11/01
1.4K0
前端react面试题(边面边更)
(1)无状态函数式组件 它是为了创建纯展示组件,这种组件只负责根据传入的props来展示,不涉及到state状态的操作
beifeng1996
2022/10/26
1.3K0
Note·Use a Render Prop!
在 Vue 中,可以使用 mixins 混入的方式实现代码复用,而在 React 中,代码复用经历从 mixins 到 HOC,然后到 render props 的演变,对于这几种方案的曲折这里梳理下。
数媒派
2022/12/01
7460
2021高频前端面试题汇总之React篇
合成事件是 react 模拟原生 DOM 事件所有能力的一个事件对象,其优点如下:
zz1998
2021/09/23
2.1K0
前端经典react面试题及答案_2023-02-28
Ajax请求应该写在组件创建期的第五个阶段,即 componentDidMount生命周期方法中。原因如下。
用户10376779
2023/02/28
1.5K0
React-代码复用(mixin.hoc.render props) 前言例子MixinHOCRender Props总结参考
最近在学习React的封装,虽然日常的开发中也有用到HOC或者Render Props,但从继承到组合,静态构建到动态渲染,都是似懂非懂,索性花时间系统性的整理,如有错误,请轻喷~~
菜的黑人牙膏
2019/04/09
1.6K0
React-代码复用(mixin.hoc.render props)
		前言例子MixinHOCRender Props总结参考
相关推荐
面试官:你是怎样进行react组件代码复用的
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验