leiwuhen-67's blog leiwuhen-67's blog
首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)

我的公众号

首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)
  • React

    • 使用React脚手架快速搭建项目
    • hooks之useEffect
    • React之事件绑定及简写方式
    • React之props传值并对其进行限制
    • React之Refs的基本使用
    • React之生命周期钩子
    • React之key的使用
    • React之代理服务器配置
    • React之封装全局Loading组件
    • React之消息的发布-订阅(pubsub-js)
    • React之Redux的基本使用
    • React之react-redux的基本使用
    • React之redux的数据持久化存储
    • React之路由懒加载
    • React之Render Props的使用
    • React之createBrowserRouter
    • React之路径别名@配置
    • React之craco打包优化配置
    • React之项目国际化
    • React之postcss-pxtorem移动端适配
    • React之使用vite创建项目
    • React之ts类型标注汇总
    • React之使用 ant design搭建后台管理之踩坑
    • React之路由切换动画
    • React之使用vite创建组件库并发布到npm
    • React之项目打包部署到nginx
    • React之自定义组件添加className与style
  • React Native

  • 《React》笔记
  • React
心欲无痕
2024-08-31

React之自定义组件添加className与style

最近在使用 React 做项目的时候,发现了个问题,就是使用之前 React+ts 搭建好的框架来开发项目,在给自定义组件添加 className 或者设置 style 的时候会 ts 类型错误。虽说是自己封装的组件,直接在组件里改下就行了,但是确实不太智能,因为在使用组件的时候你不知道会遇到什么奇葩需求,因此给组件重新设置 className 或者设置内联样式是非常常见的需求,特别是你封装的组件别人可能也会用到,然而你没法预料到别人的需求。

因此,在使用组件的时候,可以自定义 className 或者设置内联 style 是很有必要的。这就要求我们在封装组件的时候,需要采取合并样式和类名的方式来解决问题,即在组件中定义 className 和 style 属性,并使用 TypeScript 的 React.HTMLAttributes 类型来接受用户传入的这些属性,手动拼接 className,并使用对象扩展语法来合并 style。

import React from "react";

interface MyComponentProps extends React.HTMLAttributes<HTMLDivElement> {
  // 自定义属性
  customProp?: string;
  className?: string;
  style?: React.CSSProperties
}

const MyComponent: React.FC<MyComponentProps> = ({ customProp, className, style, ...rest }) => {
  // 定义组件内部的 className 和 style
  const defaultClassName = "default-class";
  const defaultStyle: React.CSSProperties = {
    backgroundColor: "lightblue",
    padding: "10px",
  };

  // 合并用户传入的 className 和 style
  const combinedClassName = `${defaultClassName} ${className || ""}`.trim();
  const combinedStyle = { ...defaultStyle, ...style };

  return (
    <div className={combinedClassName} style={combinedStyle} {...rest}>
      <p>组件: {customProp}</p>
    </div>
  );
};

export default MyComponent;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

这样,我们在使用组件的时候就可以设置任意 className 和 style 了,他们会与组件原本的样式进行合并。

编辑 (opens new window)
上次更新: 3/4/2025, 5:46:30 PM
React之项目打包部署到nginx
React Native之打包安卓apk优化

← React之项目打包部署到nginx React Native之打包安卓apk优化→

Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式