美文网首页
利用高阶组件解耦

利用高阶组件解耦

作者: 小冰山口 | 来源:发表于2024-01-10 14:30 被阅读0次

当遇到一个需求, 很常见, 就是在页面添加一个floatingButton

比如:


image.png

这个➕按钮, 其实本身, 以及点击事件.
无论是UI还是逻辑, 其实跟这个个人简介这个界面, 并没有什么关系, 它只是刚好在这个界面而已, 这个➕按钮可以出现在其他任何别的界面.

那么问题来了, 如果你要写这样一个在底脚显示➕按钮的界面, 你会怎么写呢?

RN中有一个很好的解决方案, 就是利用高阶组件
那什么是高阶组件呢? 高阶组件通俗点来说, 就是参数一个组件, 返回值也是一个组件

第一步, 编写一个高阶组件需要遵守一个命名规则, 就是with开头:
文件名 -> withFloatingButton.tsx

export default (OriginView) => {
  return null
}

那如何做到

高阶组件通俗点来说, 就是参数一个组件, 返回值也是一个组件

呢?
这时候需要定义一个泛型

type IReactComponents = 
React.ComponentClass |
React.FunctionComponent |
React.ClassicComponentClass |
React.ForwardRefExoticComponent<any>

export default<T extends IReactComponents> (OriginView: T): T  => {
  return null
}

定义泛型之后, 再定义一个要返回的HOC组件

import React from 'react'

type IReactComponents = 
React.ComponentClass |
React.FunctionComponent |
React.ClassicComponentClass |
React.ForwardRefExoticComponent<any>

export default<T extends IReactComponents> (OriginView: T): T  => {
  const HOCView = (props: any) => {
    return (
      <>
      </>
    )
  }
  return HOCView as T
}

然后再将传进来的参数组件和floatingButton进行"组合", 作为一个result组件, 返回出去

import React from 'react'
import { TouchableOpacity, StyleSheet, Image } from 'react-native'

type IReactComponents = 
React.ComponentClass |
React.FunctionComponent |
React.ClassicComponentClass |
React.ForwardRefExoticComponent<any>

const addButton = require('../assets/images/icon_add.png')

export default<T extends IReactComponents> (OriginView: T): T  => {
  const HOCView = (props: any) => {
    return (
      <>
        <OriginView {...props}>
        </OriginView>
        <TouchableOpacity
          style={styles.addButton}
          onPress={() => {
            console.log('点击了一个➕按钮')
          }}
        >
          <Image
            source={addButton}
            style={styles.addImage}
          >
          </Image>
        </TouchableOpacity>
      </>
    )
  }
  return HOCView as T
}

const styles = StyleSheet.create({
  addButton: {
    position: 'absolute',
    bottom: 64,
    right: 28
  },

  addImage: {
    width: 54,
    height: 54
  }
})

以上, 这个组件就写好了, 怎么使用呢?
只需要在你需要添加这个floatingButton的这个界面的函数外面套上withFloatingButton这个组件就好了

比如以前的函数是

default () => {
  return (
    <... .../>
  )
}

那现在只需要把default后面的那个函数组件, 当做参数传到withFloatingButton中就行了, 因为withFloatingButton的返回值也是一个函数组件

原来的:

export default () => {
  const theme = useContext(ThemeContext)
  const styles = theme === 'dark' ? darkStyles : lightStyles
  return (
    <View style={styles.avarta}>
      <Image 
        style={styles.img}
        source={icon_avatar}
      >
      </Image>
      <Text style={styles.titleTxt}>
        {`个人信息介绍`}
      </Text>
      <View style={styles.descContent}>
        <Text style={styles.descTxt}>
          {`为你阿斯蒂芬金阿奎放假啊收垃圾饭卡激发;卡结算单付款了;阿基德首付款垃圾啊读书卡拉法基阿萨法`}
        </Text>
      </View>
    </View>
  )
}

添加了floatingButton后的:

export default withFloatingButton(
  () => {
    const theme = useContext(ThemeContext)
    const styles = theme === 'dark' ? darkStyles : lightStyles
    return (
      <View style={styles.avarta}>
        <Image 
          style={styles.img}
          source={icon_avatar}
        >
        </Image>
        <Text style={styles.titleTxt}>
          {`个人信息介绍`}
        </Text>
        <View style={styles.descContent}>
          <Text style={styles.descTxt}>
            {`为你阿斯蒂芬金阿奎放假啊收垃圾饭卡激发;卡结算单付款了;阿基德首付款垃圾啊读书卡拉法基阿萨法`}
          </Text>
        </View>
      </View>
    )
  }
)

这样, 一个简单的高阶组件就写好了

相关文章

  • Android-Jetpack-LifeCycle组件的使用

    在软件开发当中,解耦可能是永恒的话题。Android开发当中的解耦体现在系统组件的生命周期和普通组件之间的解耦,L...

  • iOS组件化方案实战

    目录 简述 为什么要项目组件化 组件化架构思路 业务模块解耦 组件化实施流程解耦主题国际化切换PrefixHead...

  • Vue十个技巧(一)

    1.路由参数解耦 2.函数式组件 3.样式穿透 4.watch高阶使用 5.watch监听多个变量 6.事件参数$...

  • Jetpact 之 LifeCycle

    LifeCycle的诞生: 为了解决代码解耦的问题,将系统组件和普通组件尽可能的解耦 LifeCycle应用: 使...

  • iOS 组件化(一)

    组件化 组件化就是将模块单独抽离,分层,通过制定的通讯方式,实现解耦 组件化优点 模块间的解耦 模块重用 提交团队...

  • iOS组件化及架构设计

    关于组件化 网上组件化的文章很多。很多文章一提到组件化,就会说解耦,一说到解耦就会说路由或者runtime。好像组...

  • iOS组件化/模块化 APP方案实践篇

    1.博客文章: [模块化与解耦](模块化与解耦 - 刘坤的技术博客) 浅析 iOS 应用组件化设计 [iOS组件化...

  • iOS组件化及架构设计(转)

    一篇开源代码的组件化方案 关于组件化 网上组件化的文章很多。很多文章一提到组件化,就会说解耦,一说到解耦就会说路由...

  • 业务解耦组件

  • 『ios』组件化-组件之间的业务解耦

    上一篇讲了一下目前页面跳转路由之间的解耦。这一篇就来说一些组件之间业务解耦。 你觉得应该怎么来实现组件之间的业务解...

网友评论

      本文标题:利用高阶组件解耦

      本文链接:https://www.haomeiwen.com/subject/ynczndtx.html