如何改变 Ant-Design 'Select' 组件的样式?

How to change the style of a Ant-Design 'Select' component?

假设我想将 Select 组件的标准白色背景颜色更改为绿色。

我的尝试...

<Select
 style={{ backgroundColor: 'green' }}>
   // Options...
</Select>

...没做。

有人能指出我正确的方向吗?

[编辑]

我最终使用了 Jesper We 中建议的方法。

覆盖所有选择的颜色...

.ant-select-selection {
  background-color: transparent;
}

...然后我可以单独设置 Select 组件的样式。

<Select> 渲染了一整套 <div>s,你需要看看生成的 HTML 元素树来理解你在做什么。不能通过style属性来做,需要在CSS.

中做

附加背景颜色的正确位置是

.ant-select-selection {
  background-color: green;
}

这将使您的所有选择变为绿色。如果您想为不同的选择使用不同的颜色,请给它们单独的 className

尝试使用 dropdownStyle 而不是样式。

<Select
 dropdownStyle={{ backgroundColor: 'green' }}>
   // Options...
</Select>

dropdownStyle 是 select 道具之一。

参考:antd select

对于我的带有 Select 元素的表单,在 render 中有一些代码:

const stateTasksOptions =
    this.tasksStore.filters.init.state.map(item =>
        <Select.Option key={item.id} value={item.id} title={<span className={`${item.id}Label`}>{item.title}</span>}>
            <span className={`${item.id}Label`}>{item.title}</span> - <span class="normal-text">{item.help}</span>
        </Select.Option>
    )

return (
    ....
    <Select
        mode="multiple"
        value={this.tasksStore.filters.selected.state.map(d => d)}
        onChange={this.handleTasksStatus}
        optionLabelProp="title"
    >
        {stateTasksOptions}
    </Select>
    ....
)

还有一些 css 用于着色。

结果:

对于以上所有答案,您不能有条件地更改标签的样式,但可以使用以下方法。

您可以随意更改 select 下拉列表标签的样式。 您可以使用 select 的 dropdownRender,它接受 2 个参数

  • 菜单节点
  • 道具

使用 props children 属性 到达每个标签并更改样式,您可以根据需要有条件地更改样式。

以下是代码沙箱

的示例link供参考

Select Tags Styles Sanbox

这可能不是一种有效的方法,但您现在可以使用它来满足您的业务需求。

谢谢

他们用 ant design v4 实现了这个特性:
https://github.com/ant-design/ant-design/pull/21064

但在盲目地从 v3 升级到 v4 之前要当心 - 有很多变化:
https://github.com/ant-design/ant-design/issues/20661

有人说选择器是

.ant-select-selection {...

不过应该是选择器如下:

.ant-select-selector {
  background-color: green;
}

来自他们的官方文档https://pro.ant.design/docs/style

覆盖组件样式 由于项目的特殊需要,我们经常会遇到覆盖组件样式的需求,这里简单举个例子。

antd Select multi-select状态下,默认会显示所有select项,这里我们添加一个限制高度,当内容超出这个高度时显示滚动条.

// TestPage.ts
import { Select } from 'antd';
import styles from './TestPage.less';
const Option = Select.Option;

const children = [];
for (let i = 10; i < 36; i++) {
  children.push(<Option key={i.toString(36) + i}>{i.toString(36) + i}</Option>);
}

ReactDOM.render(
  <Select
    mode="multiple"
    style={{ width: 300 }}
    placeholder="Please select"
    className={styles.customSelect}
  >
        {children}
      
  </Select>,
  mountNode,
);
/* TestPage.less */
.customSelect {
  :global {
    .ant-select-selection {
      max-height: 51px;
      overflow: auto;
    }
  }
}

需要注意两点:

导入的antd组件class名称没有被CSS模块翻译,所以覆盖class名称.ant-select-selection必须放在 :global 中。 由于前面的注释,覆盖是全局的。为避免影响其他 Select 组件,该设置需要用额外的 class 名称包装以添加范围限制

在angular中,可以用ng-deep覆盖样式

::ng-deep .ant-select-selector {
  background-color: red;
}