当前位置: 首页 > 知识库问答 >
问题:

前端 - 如何优雅地覆盖antdesign的样式?

和选
2024-05-29

如何优雅地覆盖antdesign的样式?

我想要把将这个buttonborder去掉(只是这个button,不影响其他button的样式)。
image.png

import React from "react";import PropTypes from "prop-types";import { Button, Flex, ConfigProvider } from "antd";import Icon from "@ant-design/icons";import Sort from "../../assets/sort.svg?react";console.log("sort: ", Sort);function CommentTitle({ commentsCount, chooseSortRule }) {  return (    <Flex gap="middle" align="center">      <div>{commentsCount > 0 ? commentsCount + " " : ""}留言</div>      <Flex gap="small" align="center">        <ConfigProvider wave={{ disabled: true }} theme={{ cssVar: true }}>          <Button icon={<Icon component={Sort} />} />        </ConfigProvider>        排序      </Flex>    </Flex>  );}
  1. className or style都不行,Button组件没有提供这两个prop。倒是有一个classNames不知道是干什么的。
  2. index.css中添加以下规则,倒是可以去除Button上的border但是会影响所有的Button样式。

    .ant-btn { border: none;}
  3. 通过ConfigProvier来设置Button组件的token,但是没有将border直接设置为nonetoken,只有一些token用来设置不同状态下border的颜色。我可以将这些颜色设置为transparent,让它看起来没有border。此时,可以达到了预期,但是要修改不少的token

有没有其他更优雅一些的方法?

共有2个答案

路欣荣
2024-05-29

rootClassName

<Button rootClassName="my-button" icon={<Icon component={Sort} />} />
温星华
2024-05-29

要优雅地覆盖 Ant Design 的 Button 组件样式而不影响其他 Button,你可以使用 CSS Modules 或者 CSS-in-JS 库(如 styled-components 或 emotion)来创建一个具有特定样式的组件。这样,你可以为需要自定义样式的 Button 应用一个独特的类名或样式对象,而不会影响到其他 Button。

以下是使用 CSS Modules 的方法:

  1. 创建一个 CSS 文件(例如 CommentTitleButton.module.css),并在其中定义你的自定义样式:
/* CommentTitleButton.module.css */.noBorderButton {  border: none !important; /* 使用 !important 确保覆盖 Ant Design 的默认样式 */  /* 其他自定义样式 */}
  1. 在你的 React 组件中导入这个 CSS 文件,并使用它来应用样式:
import React from "react";import { Button, Flex } from "antd";import Icon from "@ant-design/icons";import Sort from "../../assets/sort.svg?react";import styles from './CommentTitleButton.module.css'; // 导入 CSS Modulesfunction CommentTitle({ commentsCount, chooseSortRule }) {  return (    <Flex gap="middle" align="center">      <div>{commentsCount > 0 ? commentsCount + " " : ""}留言</div>      <Flex gap="small" align="center">        <Button          className={styles.noBorderButton} // 应用自定义样式类名          icon={<Icon component={Sort} />}        />        排序      </Flex>    </Flex>  );}export default CommentTitle;

使用 CSS Modules,每个类名在构建时都会被转换成一个唯一的类名,这确保了样式的局部性,即样式只应用于当前组件,不会影响到其他组件。

注意:!important 的使用应谨慎,因为它会提高样式的优先级,可能导致样式难以覆盖。但是,在覆盖第三方库的默认样式时,有时它是必要的。

如果你更倾向于使用 CSS-in-JS 解决方案,你可以使用 styled-components 或 emotion 来创建一个带有自定义样式的组件,如下所示:

import React from "react";import styled from 'styled-components'; // 导入 styled-componentsimport { Button, Flex } from "antd";import Icon from "@ant-design/icons";import Sort from "../../assets/sort.svg?react";const StyledButton = styled(Button)`  border: none; /* 自定义样式 */  /* 其他自定义样式 */`;function CommentTitle({ commentsCount, chooseSortRule }) {  return (    <Flex gap="middle" align="center">      <div>{commentsCount > 0 ? commentsCount + " " : ""}留言</div>      <Flex gap="small" align="center">        <StyledButton icon={<Icon component={Sort} />} /> {/* 使用自定义样式的 Button */}        排序      </Flex>    </Flex>  );}export default CommentTitle;

使用 styled-components 或 emotion,你可以直接在组件内部定义样式,并且这些样式会自动应用到对应的组件实例上,同样达到了局部化和优雅覆盖 Ant Design 样式的效果。

 类似资料:
  • 问题内容: 我正在开发页面,现在以我的CSS样式我有以下代码行 为我的页面。现在,我的某些页面不需要此行 我可能会在页面的内部CSS中覆盖它,这将导致原始行为被忽略? 问题答案: 使用不推荐,但在这种情况下,我想你应该- 在您的内部CSS中编写此代码-

  • 问题内容: 我只是简单地尝试通过FireBug在生成的HTML中查找组件的名称,然后在JSF项目中手动定义的CSS中对其进行了更改,但无法覆盖PrimeFaces的CSS定义。预先感谢您的任何想法。 问题答案: 如果使用primefaces2.2.1,请使用h:outputStylesheet标记并将其包含在h:body中,而不要包含在h:head中,以覆盖primefaces样式表,与h:out

  • 问题内容: 如何覆盖Twitter Bootstrap中的样式?例如,我当前正在使用具有CSS规则“ float:left;”的.sidebar类。我该如何更改它以便使其转至右侧?我正在使用HAML和SASS,但对于Web开发来说相对较新。 问题答案: 添加您自己的类,例如:CSS:

  • 人生太短,不能写没人会读的废话,如果你写了废话,没人会去读。所以好一点的文档是最好的。经理不会去理解这些东西,因为不好的文档会给他们错误的安全感以至于他们不敢依赖他们的程序员。如果一些人绝对坚持你真的在写没用的文档,就告诉他们“是的”,然后安静的找一份更好的工作。 没有其他事情比精确估计 把好的文档转为放松文档要求的估计 更为有效率。真相是冷酷而艰难的:文档,就像测试,会花比开发代码多几倍的时间。

  • 问题内容: 我不确定这是否重复,但是我不知道要查找什么,因为我不知道这种现象的名称。 基本上,只要我使用和某些计算机上,以前的终端内容由当前文件(我认为)的缓冲液覆盖。如果我使用滚动条而不是当前程序的命令向后滚动,则可以看到以前的终端内容,但是当前程序已覆盖了前面的某些行。好像有很多行经过(例如,)的缓冲区是覆盖终端的前几行。当我退出/时,这些行仍然被覆盖,尽管它们显示在历史记录中,并且当我按一下

  • 由于后端接口不规范,返回的数据格式不统一,导致前端公共组件e-table接口里接收数据时要用多个||进行判断,这样写有一定的风险。 如:关于data.content.iTotalRecords,data里面可能没有content,故data.content.iTotalRecords就有可能发生错误。 希望代码能别出错,并且能在优化一下代码