首页 > 其他分享 >组件和组件库框架

组件和组件库框架

时间:2023-11-22 17:33:27浏览次数:32  
标签:函数 框架 text React 组件 type children

所谓天才,就是努力的力量。

React 组件由 DOM 结构,样式和 Javascript 逻辑组成。

1. ES6 中的类

class People {
  constructor() {
    this.name = "hubert"
    this.age = 29
  }

  printName() {
    console.log(this.name)
  }

  printAge() {
    console.log(this.age)
  }
}

var people = new People()
people.printName()
people.printAge()

2. 类式组件

类式组件是基于使用 class 定义的类,需要继承自 React.Component;另外,类式组件中必须实现 render 函数。

import React from "react";

class AppClassComponent extends React.Component {
  render() {
    return <div>hello {this.props.name}</div>
  }
}

export default AppClassComponent

3. 函数式组件

函数式组件是基于使用 function 定义的函数,通常接受一个 props 参数,返回一个 JSX 元素或者 null。函数式组件和普通函数最主要的区别在调用的时候,函数式组件在渲染的时候没有被人为显式调用,而是由 React 内部去调用。

// React 16.8 之前函数式组件是无状态的
// React 16.8 之后引入 react hooks,我们可以让函数式组件有状态了。hooks 让函数式组件有状态了。
function AppFuncConponent(props) {
  return (
    <div>hello function conponent</div>
  )
}

// ES6 箭头函数
const AppfuncComponent1 = (props)=>{
  return <div>箭头函数组件</div>
}

export default AppFuncConponent

4. TypeScript 函数式组件

函数式组件通常接受一个 props 参数,返回一个 JSX 元素或者 null。当我们需要使用 TypeScript 去定义一个函数式组件时,除了基础对函数式写法外,我们还可以使用以下方式来实现。

4.1)使用 React.FC

由于 React 不是使用 TypeScript 开发的,使用的是社区开发的 @type/react 包提供的类型,里面有一个通用类型 FC ,允许我们为函数组件添加参数类型

type FCProps = { text: string };
// 这里的 React.FC 是 React.FunctionComponent 的简写
const FCComponent: React.FC<FCProps> = ({ text = "" })=> <div>{text}</div>;

当组件包含子元素,TypeScript 会提示警告,现在已经不推荐使用这种方式了

type FCProps = { text: string };
const FCComponent: React.FC<FCProps> = ({ text = "" }) => <div>{text}</div>;

function App() {
  return (
    <div className="App">
        <FCComponent text="Hello Chris1993.">
            <span>children</span>
        </FCComponent>
    </div>
  );
}

提示警告内容:

Type '{ children: string; text: string; }' is not assignable to type 'IntrinsicAttributes & FCProps'.
  Property 'children' does not exist on type 'IntrinsicAttributes & FCProps'.

4.2)直接定义完整类型

由于 React 组件包含子元素时,会隐式传递一个 children 属性,导致定义的参数类型出错,因此我们可以直接定义一个完整的参数接口,包含了 children 属性的类型:

type FCProps = { text: string; children?: any };
const FCComponent: React.FC<FCProps> = ({ text = "" }) => <div>{text}</div>;

function App() {
  return (
    <div className="App">
        <FCComponent text="Hello Chris1993.">
            <span>children</span>
        </FCComponent>
    </div>
  );
}

4.3)使用 React.PropsWithChildren

上面这种方法每次都要手动写一个 children 属性类型比较麻烦,这时候我们就可以使用 React.PropsWithChildren 类型,它本身封装了 children 的类型声明:

// react/index.d.ts
type PropsWithChildren<P> = P & { children?: ReactNode };

因此,使用 React.PropsWithChildren 类型定义函数式组件,就不用去处理 children 的类型了:

type IProps = React.PropsWithChildren<{ text: string }>;
// 形式1
const PropsComponent = ({ text }: IProps) => <div>{text}</div>;
// 形式2
const PropsComponent:React.FC<IProps> = ({ text }) => <div>{text}</div>;

function App() {
  return (
    <div className="App">
        <PropsComponent text="Hello Chris1993.">
            <span>children</span>
        </PropsComponent>
    </div>
  );
}

4.4)使用 JSX.Element

使用 JSX.Element 类型作为函数式组件的返回值类型,当组件的返回值不是 JSX.Element 类型时,TypeScript 就会提示错误。

type FCProps = { text: string };
const ElementComponent = ({ text }: FCProps): JSX.Element => <div>{text}</div>;
function App() {
  return (
    <div className="App">
        <ElementComponent text="Hello Chris1993."></ElementComponent>
    </div>
  );
}

5. 组件嵌套使用

6. React UI 组件库

Ant Design 是一个致力于提升『用户!和『设计者』使用体验的设计语言;旨在统一中台项目的前端 UI 设计,屏蔽不必要的设计差异和实现成本,解放设计和前端的研发资源;包含很多设计原则和配套的组件库。

Ant Design(PC 端):https://ant.design/index-cn

Ant Design Mobile(移动端):https://mobile.ant.design/zh

标签:函数,框架,text,React,组件,type,children
From: https://www.cnblogs.com/hubert-style/p/17849897.html

相关文章

  • 封装 luckysheet 组件
    一维数组和二维数组根据luckysheet.getAllSheets()获得所有的数据表数组,其中:cellData是一维数组data是二维数组代码父组件<template><divclass="app-container"v-hasPermi="['proMana:directory:detail:proHome']"><!--项目首页,projectId:......
  • 分享教学项目:开源一个对象映射框架
    Maomi.Mapper项目地址:https://github.com/whuanle/Maomi.Mapper注:本项目用于教学目的,性能较差,请勿用于生产环境。MaomiMapper是一个使用表达式树构造生成对象成员映射的框架,即对象映射框架,用于配合笔者其它系列文章,用于教学目的。笔者此系列教程还没有公开,是讲解如何编写各类框架......
  • 16、Flutter Wrap组件 实现流布局
    Wrap可以实现流布局,单行的Wrap跟Row表现几乎一致,单列的Wrap则跟Column表现几乎一致。但Row与Column都是单行单列的,Wrap则突破了这个限制,mainAxis上空间不足时,则向crossAxis上去扩展显示。 Wrap组件的使用//自定义按钮组件classMyAppextendsStatelessWidget{String......
  • 简单的低开编辑器(二):实现组件拖拽
    好家伙, 0.代码已开源Fattiger4399/lowcode-demo:一个简单的低代码编辑器技术栈:Vue3element-plusjsx(github.com)该章实现的效果:组件从物料区到画布的拖拽 1.分析  先来分析,鼠标点击物料区的某个组件,再将其拖拽到画布这个过程我们如何实现组件的拖拽??......
  • 领域驱动设计之银行转账:Wow框架实战
    银行账户转账案例银行账户转账案例是一个经典的领域驱动设计(DDD)应用场景。接下来我们通过一个简单的银行账户转账案例,来了解如何使用Wow进行领域驱动设计以及服务开发。银行转账流程准备转账(Prepare):用户发起转账请求,触发Prepare步骤。这个步骤会向源账户发送准备转账的请......
  • IdentityServer4: 集成 AspNetCore Identity 框架
    IdentityServer4:集成AspNetCoreIdentity框架  目录IdentityServer4集成AspNetCoreIdentity框架新增依赖包集成AspNetIdentity代码迁移AspNetIdentity数据库生成用户信息修改IdentityServer.QuickstartUI代码登录退出使用IdentityUser用......
  • nodejs学习04——express框架
    搭建环境新建一个文件夹LearnExpress,命令行://初始化包npminit//安装expressnpmiexpress初体验//1.导入expressconstexpress=require('express');//2.创建应用对象constapp=express();//3.创建路由规则app.get('/home',(req,res)=>{ //res.end('......
  • 15、Flutter 按钮组件
    按钮组件的属性ButtonStylee里面的常用的参数 ElevatedButtonElevatedButton即"凸起"按钮,它默认带有阴影和灰色背景。按下后,阴影会变大classMyAppextendsStatelessWidget{constMyApp({super.key});@overrideWidgetbuild(BuildContextcontext){......
  • 用java框架spring boot写一个文件上传
    在SpringBoot中,实现文件上传可以使用SpringFramework提供的MultipartResolver。以下是一个简单的SpringBoot文件上传示例:在POM文件中添加以下依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></depend......
  • Util应用框架基础(七) - 缓存
    本节介绍Util应用框架如何操作缓存.概述缓存是提升性能的关键手段之一.除了提升性能,缓存对系统健壮性和安全性也有影响.不同类型的系统对缓存的依赖程度不同.对于后台管理系统,由于是给管理人员使用的,用户有限,而且操作基本都需要身份认证和授权,甚至可能部署在局域网内,一......