HOC 中的样式化组件

2024-06-24

我想使用高阶组件将样式添加到我的组件包装器中。打字稿说有错误ComponentWithAdddedColors.

type Props = {
  bg?: string;
};

function withColors<TProps>(
  Component: React.ComponentType<TProps>
): React.ComponentType<TProps & Props> {

  const ColoredComponent: React.ComponentType<TProps & Props> = props => {
    const { bg, ...componentProps } = props;

    const ComponentWithAdddedColors = styled(Component)`
      ${bg && `background: ${bg};`}
    `;

    return <ComponentWithAdddedColors {...componentProps} />; //Typecheck error
  };

  return ColoredComponent;
}

当我想返回传递给 HOC 的组件时{...componentProps}还有类型检查错误。

...
{
  const ColoredComponent: React.ComponentType<TProps & Props> = props => {
    const { bg, ...componentProps } = props;

    return <Component {...componentProps} />; //Typecheck error
  };

  return ColoredComponent;
}

但是,当我将所有内容传递给组件时{...props}没有类型检查错误。

...
{
  const ColoredComponent: React.ComponentType<TProps & Props> = props => {
    return <Component {...props} />; //No error
  };

  return ColoredComponent;
}

这就是你想做的吗?

export function withColors<T>(Component: React.ComponentType<T>) {
    return styled(Component)<Props>`
        ${({ bg }) => bg && `background: ${bg};`}
    `
}

const Foo: React.FC<{ bar: string }> = props => <div>{props.bar}</div>
const ColoredFoo = withColors(Foo)
export const redFoo = <ColoredFoo bg="red" bar="baz" />

但是,如果您想锁定颜色而不暴露颜色道具,那么恐怕您可能暴露了 TypeScript 错误。我自己似乎无法解决它(不使用additionalProps as any);然而,我的做法确实有点不同。

function withColors<T>(Component: React.ComponentType<T>, additionalProps: Props) {
    const { bg } = additionalProps;
    const ComponentWithAddedColors = styled(Component)<Props>`
        ${bg && `background: ${bg};`}
    `
    const result: React.FC<T> = props => (
        <ComponentWithAddedColors {...props} {...(additionalProps as any)} />
    )
    return result
}

export const RedFoo = withColors(Foo, { bg: 'red' })
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HOC 中的样式化组件 的相关文章

随机推荐

  • Spring MVC 同一表单上的多个 ModelAttribute

    我有一个带有两个模型属性的表单 一个是公民 另一个是惩罚 这两个对象由 jquery 选项卡分隔 我在使表单上的项目正确显示时遇到问题 有些项目正在显示 有些则没有 我的意思是 html 元素 我不确定当页面上有多个 ModleAttrib
  • 使用 jQuery 获取 Google+ 订阅计数

    可以用与上相同的方式获取 Google 订阅总数http www tomanthony co uk google plus one api example php http www tomanthony co uk google plus
  • 如何使用 R、Java 和 JRI 绘制图表?

    我对 R 很陌生 所以如果这是一个非常非常基本的问题 请原谅我 我编写了一个 R 脚本 它执行一些计算并在最后绘制箱线图 如果我从 R 控制台运行此脚本 它会正常运行并绘制图表 如果我从 Java 程序 JRI 站点上提供的示例 rtest
  • Angularjs ui 路由器。如何重定向到登录页面

    我有4个状态 仪表板 仪表板 main 仪表板 次要 login 仪表板是抽象的 它是 minor 和 main 状态的父状态 下面是我的代码 state dashboard url dashboard abstract true temp
  • servlet 过滤器中的弹簧注入[重复]

    这个问题在这里已经有答案了 我正在尝试对 servlet 过滤器进行 spring 注入 该过滤器是引用的 jar 文件的一部分 所以 我无法将其更改为拦截器 在我的插件项目的 web xml 中
  • C++ 指向重载函数的指针

    我正在尝试使用 boost python 公开重载函数 函数原型是 define FMS lvl2 DLL API declspec dllexport void FMS lvl2 DLL API write const char key
  • 如何从 R 中的列表创建自动文本文件?

    如果我有包含多个数据帧的列表元素 并且我想将它们作为单独的文本文件写入磁盘上 名称为 NP1 NP2 NP3 我该怎么做 我使用了以下内容 lapply lst1 write table 但这并不能解决问题 我该怎么做 谢谢 这里有两种方法
  • 在 Postgres 中手动对列进行排序的正确方法是什么?

    我有一个用于开票的 SaaS 宠物项目 在其中 我希望我的客户每个都以票号 1001 开始 显然 我不能在 Postgres 中使用简单的自动字段 只需在值上添加 1000 因为我的所有客户将共享相同的数据库和相同的数据 tickets表
  • WPF DataGrid 双向绑定

    我有财产UserSet其中包含来自ObservableCollection
  • 使用 PHP 修改 HTML 标签元素

    我一直在尝试修改 HTML 标签元素 我有一个巨大的 HTML 文件列表需要修改 我需要删除图像和以下文本之间的线条 我正在使用 PHP 我使用 DOMDocument 来访问所有节点 并且还可以获得节点路径 但我无法从节点路径修改该特定的
  • Prolog - DCG 解析器,带有来自文件的输入

    作为项目的一部分 我需要编写一个解析器 它可以读取文件并解析为我可以在程序中使用的事实 文件结构如下所示 property el1 el2 我最终想要的是 property el1 property el2 我这样读我的文件 main op
  • 数据库设计 - 类别和子类别[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我需要在类似于黄金页面的东西上实现分类和子分类 假设我有下表 类别表 CategoryId Title 10 Home 20 Business
  • 无法将 int 字段设置为空值

    我有这个int column Column length 4 private int contract owner id 我不需要为每个表行设置始终值 当我进行选择查询时 出现此异常 Can not set int field org en
  • Javascript:让主体加载函数等待脚本完成

    我正在调用一些函数 它们需要一些时间 毫秒 但我不希望在这些函数完成之前显示页面 现在 我可以看出页面已加载 然后脚本最终完成 现在 我正在调用主体中的函数 onload 另外 我可能遇到的另一个问题是我需要访问 html 内容中的 div
  • Java:支持宏吗?

    我只是好奇人们如何解决这个问题 我经常一直编写相同类型的代码 例如 new Thread Change this line start 我不断更改显示 更改此行 的行 然后启动一个线程 这一变化可以是一行或几行 我将如何压缩这段代码 好吧
  • 如何将许多 numpy 文件逐个文件放入一个大 numpy 文件中?

    我有 166600 个 numpy 文件 我想将它们放入一个 numpy 文件中 逐个文件 我的意思是 我的新大文件的创建必须从头开始 第一个文件必须在文件中读取和写入 因此大文件只包含第一个文件 之后我需要读取和写入第二个文件 所以大文件
  • docker 服务更新与使用现有堆栈部署 docker 堆栈

    在部署了一组服务后 我对使用 docker swarm 模式命令来更新现有服务有疑问docker stack deploy 据我了解 每个服务在创建时都固定到图像的 SHA256 摘要 因此 如果您重建并推送图像 具有相同标签 并且尝试运行
  • 如何在swings中组合jtable中的两个列标题

    我需要在 swing 中制作一个像这样的 gui 你能帮我吗 有什么方法可以按列和行组合列标题 所以你想要多标题行jtable 您必须对标题进行分组 GroupableHeaderExample java public class Grou
  • 以不可检测的方式检查 WebSocket 帧

    如何以页面无法检测到的方式在 Chrome 扩展程序或 Firefox 附加组件中读取网页的 WebSocket 框架 从 Chrome 开发工具扩展检查 WebSockets 帧 https stackoverflow com quest
  • HOC 中的样式化组件

    我想使用高阶组件将样式添加到我的组件包装器中 打字稿说有错误ComponentWithAdddedColors type Props bg string function withColors