广告
返回顶部
首页 > 资讯 > 精选 >react结合typescript封装组件的方法是什么
  • 865
分享到

react结合typescript封装组件的方法是什么

2023-07-06 03:07:43 865人浏览 薄情痞子
摘要

今天小编给大家分享一下React结合typescript封装组件的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。项

今天小编给大家分享一下React结合typescript封装组件的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

项目环境搭建

项目依赖

创建支持 TypeScript 的 React 项目

npx create-react-app my-demo --template typescript

根据 typescript 官网文档的说明,还可以使用下面的命令

npx create-react-app my-demo --scripts-version=react-scripts-ts

css样式初始化的插件

npm install --save nORMalize.CSS

处理scss文件

npm install node-sass --save

一个简单的、有条件的绑定多个 className 的 JavaScript 实用函数

npm install classnames

@types 支持全局和模块类型定义

npm install @types/classnames --save

项目目录结构

my-demo  |—— node_modules  |——public  |     └─ favicon.ico  |     └─ index.html  |     └─ manifest.JSON|—— src| └─ ...  |─   .gitignore  |─   package.json  |─   package-lock.json  |─   README.md  └─   tsconfig.json //文件中指定了用来编译这个项目的根文件和编译选项

创建一个组件

在项目中 删除src目录下除src/index.tsx之外所有的文件

import React from 'react';import ReactDOM from 'react-dom/client';import Hello from './src/Hello'const root = ReactDOM.createRoot(  document.getElementById('root') as HTMLElement);root.render(  <div>hellow TS</div>);

在src下创建 Hello.tsx文件

import React form 'react'//声明 Hello 组件 props 接口类型interface BaseProps {  message?:string //可选填 string 类型}const Hello:FunctionComponent<BaseProps> =(props) => {        return <h2>{props.message}</h2>  }

在终端执行 npm start启动项目查看结果

封装一个Button组件

Button按钮需求分析

react结合typescript封装组件的方法是什么

依赖

classnames: 一个简单的 JavaScript 实用程序,用于有条件地将 classNames 连接在一起

$ npm install classnames --save

$ npm install @types/classnames --save //@types 支持全局和模块类型定义

用于编译css

npm install node-sass --save

classnames 使用示例

var classNames = require('classnames');classNames('foo', 'bar'); // => 'foo bar'classNames('foo', 'bar'); // => 'foo bar'classNames('foo', { bar: true }); // => 'foo bar'classNames({ 'foo-bar': true }); // => 'foo-bar'classNames({ 'foo-bar': false }); // => ''classNames({ foo: true }, { bar: true }); // => 'foo bar'classNames({ foo: true, bar: true }); // => 'foo bar'classNames('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux'// other falsy values are just ignoredclassNames(null, false, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1'             class Button extends React.Component {  // ...  render () {    var btnClass = 'btn';    if (this.state.isPressed) btnClass += ' btn-pressed';    else if (this.state.isHovered) btnClass += ' btn-over';    return <button className={btnClass}>{this.props.label}</button>;}}var classNames = require('classnames');class Button extends React.Component {  // ...  render () {    var btnClass = classNames({      btn: true,      'btn-pressed': this.state.isPressed,      'btn-over': !this.state.isPressed && this.state.isHovered    });    return <button className={btnClass}>{this.props.label}</button>;}}var btnClass = classNames('btn', this.props.className, {  'btn-pressed': this.state.isPressed,  'btn-over': !this.state.isPressed && this.state.isHovered});

在src新建components/Button/buttom.tsx组件

import React,{  ButtonHTMLAttributes, AnchorHTMLAttributes, FC } from 'react'import classNames form 'classnames'//声明按钮尺寸-枚举export enum ButtonSize {    Large = 'lg',    Small = 'sm'}//声明按钮样式-枚举export enum ButtonType{  Primary = 'primary',    Default = 'default',    Danger = 'danger',    Link = 'link'}//声明按钮组件 props 接口interface BaseButtonProps {  className?: string;    disabled?:boolean;    size?:ButtonSize;    btnType?:ButtonType;  children: React.ReactNode; //ReactNode reactnode节点    href?:string;}//声明按钮与超链接标签的原生事件type NativeButtonProps = BaseButtonProps & ButtonHTMLAttributes<HTMLElement>type AnchorButtonProps = BaseButtonProps & AnchorHTMLAttributes<HTMLElement>export type ButtonProps = Partial<NativeButtonProps & AnchorButtonProps>export conast Button:FC<ButtonProps> = (props) =>{  const {    btnType, //传递进来按钮样式属性    className, //传递进来自定义样式属性    disabled, //传递进来是否禁用属性    size,    children,    href,    ...restProps  //解析按钮与超链接的原生事件属性  } = props;    const classes = classNames('btn', className, {      [`btn-${btnType}`]: btnType,    [`btn-${size}`]:size,    'disabled':(btnType === 'link') && disabled //如果传递btnType的属性值为link并设置disabled属性,按钮就是禁用状态。  });  if(btnType === "link" && href){    return (      <a        className={classes}        href={href}        {...restProps} //解析按钮与超链接的原生事件属性      >         {children}      </a>    )  }else{    return(      <button          className={classes}          disabled={disabled}        {...restProps}      >        {children}      </button>    )  }}Button.defaultProps = {  disabled:false,  btntype:ButtonType.Default,  btntype:ButtonSize.Large,}export default Button;

添加默认样式

npm install --save normalize.css

在src目录先新建styles文件夹,在styles文件夹下新建index.css | index.scss文件

在styles/index.css文件中引入normalize.css & components/Button/buttom.css

在src/index.tsx文件中引入styles/index.css

import React from 'react';import ReactDOM from 'react-dom/client';import './styles/index.scss'import App from './App';const root = ReactDOM.createRoot(  document.getElementById('root') as HTMLElement);root.render(  <React.StrictMode>    <App />  </React.StrictMode>);

在src新建components/Button/buttom.css | buttom.scss组件

.btn {  position: relative;  display: inline-block;  font-weight: 400;  line-height: 1.5;  white-space: nowrap;  text-align: center;  vertical-align: middle;  background-image: none;  border: 1px solid transparent;  border-radius: 0.25rem;  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;  cursor: pointer;}.btn-danger {   color: #fff;  background: #dc3545;  border-color: #dc3545;}.btn-primary {   color: #fff;  background: #0d6efd;  border-color: #0d6efd;}.btn-lg {   padding: 0.5rem 1rem;  font-size: 1.25rem;  border-radius: 0.3rem;}.btn-sm {   padding: 0.25rem 0.5rem;  font-size: 0.875rem;  border-radius: 0.2rem;}.btn-xxx {   width:200px;  height:200px;}.btn-link {  font-weight: 400;  color: #0d6efd;  text-decoration: none;  box-shadow: none;}.disabled,.btn[disabled]{  cursor: not-allowed;  opacity: 0.65;  box-shadow: none;}

在scr/App.tsx组件中引入Button组件

import React from 'react';// 导入Button 组件import Button,{ButtonType,ButtonSize} from './conponents/Button/button';function App() {  return (    <div className="App">      <Button autoFocus>Hello</Button>      <Button className='btn-xxx'>Hello</Button>      <Button disabled>Disabled Button</Button>      <Button btnType={ButtonType.Primary} size={ButtonSize.Large}>Primary-Lrage-Button</Button>      <Button btnType={ButtonType.Danger} size={ButtonSize.Small}>Danger-Small-Button</Button>      <Button btnType={ButtonType.Link} href='Http://www.xxx.com' disabled>被禁用的按钮</Button>      <Button btnType={ButtonType.Link} href='http://www.xxx.com'  target='target'>在新窗口打开</Button>    </div>  );}export default App;

在当前项目终端组输入npm start启动项目查看结果

react结合typescript封装组件的方法是什么

react结合typescript封装组件的方法是什么

以上就是“react结合typescript封装组件的方法是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: react结合typescript封装组件的方法是什么

本文链接: https://www.lsjlt.com/news/357682.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • react结合typescript封装组件的方法是什么
    今天小编给大家分享一下react结合typescript封装组件的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。项...
    99+
    2023-07-06
  • react结合typescript 封装组件实例详解
    目录项目环境搭建项目依赖项目目录结构创建一个组件封装一个Button组件Button按钮需求分析依赖项目环境搭建 项目依赖 创建支持 TypeScript 的 React 项目 ...
    99+
    2023-05-16
    react typescript 封装组件 react typescript
  • 基于React封装一个组件的方法是什么
    这篇文章主要讲解了“基于React封装一个组件的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于React封装一个组件的方法是什么”吧!antd 是如何封装组件的仓库地址divi...
    99+
    2023-06-29
  • React封装弹出框组件的方法
    本文实例为大家分享了React封装弹出框组件的方法,供大家参考,具体内容如下 效果图 文件目录 alertList.tsx 用于容纳弹出框的容器 import React f...
    99+
    2022-11-13
  • React日期时间显示组件的封装方法
    本文实例为大家分享了React日期时间显示组件的封装具体代码,供大家参考,具体内容如下 时间日期展示器 import ProtoType from 'prop-types'; im...
    99+
    2022-11-13
  • C++的封装方法是什么
    本篇内容介绍了“C++的封装方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!封装c++认为万事万物皆为对象,对象上有其属性和行为封装...
    99+
    2023-06-29
  • react三种定义组件方法是什么
    这篇文章主要介绍“react三种定义组件方法是什么”,在日常操作中,相信很多人在react三种定义组件方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”react三种定...
    99+
    2022-10-19
  • C++的socket封装方法是什么
    本篇内容介绍了“C++的socket封装方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!配置QT下的pro文件TEMPLATE = ...
    99+
    2023-06-04
  • vue封装自定义分页器组件与使用方法是什么
    这篇文章给大家介绍vue封装自定义分页器组件与使用方法是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言分页是开发各种系统时候最常用的功能,下面为本人封装的一个分页组件。实现分页器操作需要以下参数当前页: pag...
    99+
    2023-06-26
  • C#对mysql封装的方法是什么
    在C#中,可以使用MySQL Connector/NET来与MySQL数据库进行交互。MySQL Connector/NET是一个A...
    99+
    2023-10-24
    C# mysql
  • springboot封装接口的方法是什么
    在Spring Boot中封装接口的方法有很多种,下面列举其中一种常用的方法:1. 创建一个接口类,定义接口的请求路径、请求方法和请...
    99+
    2023-10-21
    springboot
  • java程序封装的方法是什么
    在Java中,封装是一种将数据和相关操作封装在一起的面向对象编程的概念。封装可以通过使用访问修饰符(如private、public、...
    99+
    2023-09-23
    java
  • python程序封装的方法是什么
    Python中的封装方法包括以下几种:1. 使用类:Python是一种面向对象的编程语言,可以使用类来封装数据和方法。通过定义类和类...
    99+
    2023-09-23
    python
  • React组件的三种写法是什么
    这篇文章将为大家详细讲解有关React组件的三种写法是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。React 专注于 view 层,组件化则是 React 的基础,...
    99+
    2022-10-19
  • Java类对象封装的方法是什么
    Java类对象封装的方法是通过定义类、属性和方法来封装数据和行为。类是一种模板或蓝图,用于创建具有相似属性和行为的对象。属性是类的成...
    99+
    2023-10-23
    Java
  • vue封装axios请求的方法是什么
    本文小编为大家详细介绍“vue封装axios请求的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue封装axios请求的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。其实vue封装axio...
    99+
    2023-07-04
  • sql多条件组合查询的方法是什么
    在SQL中,可以使用AND或者OR运算符来组合多个条件查询。AND运算符用于同时满足多个条件的查询,而OR运算符用于满足其中一个条件...
    99+
    2023-08-21
    sql
  • ThinkPHP封装方法的概念和使用方法是什么
    今天小编给大家分享一下ThinkPHP封装方法的概念和使用方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是封装...
    99+
    2023-07-05
  • Vue组件二次封装的实用技巧是什么
    这篇文章主要讲解了“Vue组件二次封装的实用技巧是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue组件二次封装的实用技巧是什么”吧!透传 Attribute我们可以使用一个没有参数的...
    99+
    2023-06-30
  • 基python+selenium的二次封装方法是什么
    本篇内容主要讲解“基python+selenium的二次封装方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基python+selenium的二次封装方法是什么”吧!  首先在根目录下创...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作