美文网首页
React的对象式组件,以及泛型组件的应用

React的对象式组件,以及泛型组件的应用

作者: 郁南 | 来源:发表于2020-09-07 10:32 被阅读0次

在写 react 的时候,用到比如antd等UI库,多少会遇到类似于下面这种写法

<Form.Item name="addr" label="站点地址" style={{ margin: 0 }}>
        <Input allowClear disabled={!isEditInfo} />
</Form.Item>

我们习惯了<Component {...props} />的写法,再看上面的组件,如果不了解,难免会一脸懵。其实理解了也很简单,就是万物皆对象

下面分几个步骤来实现上面Form.Item形式的组件

对象式

1. 常规组件

// 封装
class TestA extends React.Component<Props> {
  render() {
    return <div className="test-a">TestA--{this.props?.name}</div>
  }
}

// 使用
export default ()=>{
  return < TestA name={'对象式组件'}  />
}

上面就是一个简单的react组件封装以及使用,要实现组件式,其实很简单,把封装的组件放在一个对象中就可以实现

2. 对象式封装

// 把封装的组件放到一个对象中,作为对象的属性
const Test = {
  TestA
}

使用的时候,就可以按预期效果来用了

// 使用
export default ()=>{
  return <Test.TestA name={'对象式组件'} />
}

是不是很简单。
这其实是得益于ReactJSX的语法,在reactjsx语法中一切皆对象,同时也一切皆组件,所以就有了上面的组件写法。

泛型组件

1. 常规组件

接着上面的组件,写一个新的组件TestB

function TestB({ name, name2 }: { name: string, name2?: string }) {
  return <div className="test-b">TestB--{name}{name2}</div>
}

这个组件的name属性都是指定了传参格式,如果想不指定,而是想通过传入参数的类型去推导实际类型,这就用到泛型。

2. 泛型组件

如果这个组件想用到泛型,也就是标题所说的泛型组件,其实也很简单

function TestB<T>({ name, name2 }: { name: T, name2?: T }) {
  return <div className="test-b">TestB--{name}{name2}</div>
}

想上面一样,只要给组件TestB一个类型参数,后面用到的同一个类型变量,就会根据传入的参数类型自动推导,这就是泛型。

比如我给组件TestB指定一个类型type TestType = string,使用的时候如下

export default ()=>{
  return <TestB<TestType>
        name2={undefined} // name2 的类型同样是由 TestType 决定,因为 name2 是可选属性,所以可以为 undefined
        name={'组件上使用泛型'}
    />
}

上面的<TestType>就是相当于给组件TestB指定了传入的props都只能用string
有一点需要注意的是,TestType在这里不能用对象类型声明或者接口声明,否则只能如下面那样使用

interface TestType {
  name: string
  name2: number | undefined
}

export default ()=>{
     return <Test.TestB<TestType>
        name2={undefined} // name2 的类型同样是由 TestType 决定,因为 name2 是可选属性,所以可以为 undefined
        name={{
          name: '组件上使用泛型',
          name2: 123
        }}
      />
}

怎么样,是不是很简单。
如果不理解的人,刹时间看到<Test.TestB<TestType> {...props} />这种写法多少会有点懵,看完这边文章应该多少能理解一些了。

总结

上面就是本文对象组件以及泛型组件的实现。
前者容易理解所以无需多说,但是对于泛型,组合使用的好,对于封装特别是高阶组件的封装能够起到很强大的类型约束效果,而本文只是浅显的应用。
无规矩不成方圆,使用TS尽管过程会显得麻烦,并且会显著增加工作量,但是习惯了甚至是得心应手的时候,这绝对是日常开发上的一大助力。

相关文章

  • React的对象式组件,以及泛型组件的应用

    在写 react 的时候,用到比如antd等UI库,多少会遇到类似于下面这种写法 我们习惯了

  • React 组件浅析

    组件可以是一个函数(React) 组件分类: 纯展示型 接入型 container (React) 交互型组件,各...

  • React Hooks

    前言 React中组件分为两大类:Class类式组件、函数式组件 React v16.8以前: Class类式组件...

  • 组件

    组件是React的基石,所有的React应用程序都是基于组件的。React组件,可以通过React.createC...

  • React Hooks 实现和由来以及解决的问题

    与React类组件相比,React函数式组件究竟有何不同? 一般的回答都是: 类组件比函数式组件多了更多的特性,比...

  • React组件Render Props VS HOC 设计模式

    React的设计模式有很多种,比如无状态组件/表现型组件,有状态组件/容器型组件,render模式组件,高阶组件等...

  • React概念

    介绍 React的核心思想是:封装组件。React大体包含下面概念: 组件React 应用都是构建在组件之上。上面...

  • React - 类组件创建

    React创建组件有两种方式 函数式组件 类组件函数式组件已经学过,现在看下类组件怎么写。 函数式组件和类组件区别...

  • 《图解React》- 第五节 组件

    组件 组件是React的核心概念,是React应用程序的基石。组件是React开发的一个最小单元,利用“分而治之”...

  • 笔记-React-Hooks

    一、矛与盾的问题?(Class组件与函数式组件)   在 React 中 Class 组件好用还是函数式组件好用呢...

网友评论

      本文标题:React的对象式组件,以及泛型组件的应用

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