如何设置反应选择选项的样式

Posted

技术标签:

【中文标题】如何设置反应选择选项的样式【英文标题】:How to style react-select options 【发布时间】:2017-12-30 16:24:59 【问题描述】:

react-select 组件的 (https://github.com/JedWatson/react-select) 选项设置样式的最佳方式是什么?

我可以很好地定位选择本身,例如:

...
import Select from 'react-select'
...
const styles = 
  fontSize: 14,
  color: 'blue',

<Select
    options=[1,2,3,4]
    placeholder='Select something'
    clearable=false
    style=styles.select
/>

问题是,展开选择时的实际选项仍保持默认样式。如何定位这些样式选项?

这是我所说的一个例子。我可以设置占位符的样式,但不能设置选项:

【问题讨论】:

【参考方案1】:

反应选择 v2(更新)

这个新版本引入了新的styles-api 和其他一些重大变化。

自定义样式

使用样式属性使用自定义 css 为单个组件设置样式。

const colourStyles = 
  control: styles => ( ...styles, backgroundColor: 'white' ),
  option: (styles,  data, isDisabled, isFocused, isSelected ) => 
    const color = chroma(data.color);
    return 
      ...styles,
      backgroundColor: isDisabled ? 'red' : blue,
      color: '#FFF',
      cursor: isDisabled ? 'not-allowed' : 'default',
      ...
    ;
  ,
  ...
;

export default () => (
  <Select
    defaultValue=items[0]
    label="Single select"
    options=items
    styles=colourStyles
  />
);

现在项目网站上有更好的文档和更清晰的示例:

https://react-select.com/upgrade-guide#new-styles-api

https://react-select.com/home#custom-styles

https://react-select.com/styles#styles

react-select v1(旧答案 - 已弃用)

Custom classNames

您可以为组件提供自定义 className 属性,该属性将添加到基础 .Select 外部容器的 className 中。内置的 Options 渲染器也支持自定义类名。

将您的自定义 className 作为属性添加到选项数组中的对象:
const options = [
    label: "one", value: 1, className: 'custom-class',
    label: "two", value: 2, className: 'awesome-class'
    // more options...
];
...
<Select options=options />

MenuRender

menuRenderer 属性可用于覆盖默认下拉选项列表。

optionClassName String 用于选项的类名

示例:react-select/master/src/utils/defaultMenuRenderer.js

【讨论】:

感谢您的解决方案。它使我免于寻找解决方案的几个小时:D。它奏效了。 链接已修复! :) 什么是色度?为什么不添加导入?请给出完整的答案! 嘿@btzr,你知道关于设置特定选项的样式吗,比如最后一个选项文本应该是粗体,搜索了几个小时,.basic-single div:last-child 字体粗细:400; 对我不起作用,它正在申请所有选项。提前致谢【参考方案2】:

@btzr 的回答是正确的,使用 CSS 类设置 react-select 的样式(相对)容易。

但是,很难设置菜单项的样式,因为每次打开菜单并尝试检查项目时,菜单都会再次关闭。

有助于(临时)指定menuIsOpen=true 参数,这将保持菜单打开以便于检查。

【讨论】:

这非常有用! 好的,谢谢。这正是我一直在寻找的。超细粒度控制。使用前缀并保持菜单打开是定位正确元素和状态的关键。完美! 你拯救了我的一天!谢谢!即使您在开发人员控制台中单击,我也无法理解组件如何检测到单击,因为它不是 DOM 在不更改代码的情况下进行检查的另一种解决方案是在控制台中添加带有调试器语句的单击侦听器。打开菜单后它将停止执行。它有缺点,但快速且不引人注目addEventListener('click', ()=&gt;debugger) 另一种选择是删除浏览器开发工具中的“模糊”事件。这样菜单可以展开并检查它【参考方案3】:
const CustomStyle = 
  option: (base, state) => (
    ...base,
    backgroundColor: state.isSelected ? Color1 : Color2,
  )

<Select styles=customStyle >

对此有更多选择。查看样式文档。

https://react-select.com/styles

【讨论】:

【参考方案4】:

Accepted answer by btzr 是正确的,让我们使用 React 中作为 props 传递的样式来设置元素的样式。

当我为元素设置样式时,我仍然更喜欢使用 Sass 或 Less,因为我在这些文件中有很多主题。这就是为什么我改为传递classNamePrefix='filter'

<Select
  classNamePrefix='filter'
  options=this.getOptions()
  onChange=this.handleFilterChange
  isMulti
  menuIsOpen
/>

然后在类名filter 上为 Sass 或 Less 中的元素设置样式。

.filter 
  &__menu 
    margin: 0.125rem auto;
  

  &__option 
    background-color: white;

    &--is-focused 
      background-color: lightblue;
    
  

  &__group 
    padding: 0;
  

  &__menu-portal 
    border: 1px solid darkblue;
  

【讨论】:

对于任何想要这样做的人,我不得不为我的所有属性使用 !important 关键字,不知道为什么 &amp;__menu-portal 可用于设置下拉门户的样式。 __menu-portal 似乎对我不起作用。直接在__menu 上设置样式有效。此外,由于某些奇怪的原因,设置 backbround-color:&lt;color&gt; 不起作用。唯一有效的是设置线性渐变,background: linear-gradient(to right, var(--searchbar-color) 50%, var(--panel-color) 100%); 或者,@cosmichero2025 建议在__menu 属性上添加!important 有效。 您需要将 !important 添加到您自己的类中的所有自定义属性中,因为原始属性仍然在自定义属性之前应用。它应该是另一种方式。【参考方案5】:

我得到了使用风格:

const options = [
    label: "one", value: 1, style:  color: 'red' ,
    label: "two", value: 2, style:  color: 'blue' 
    // more options...
];
...
<Select options=options />

【讨论】:

嘿,这行不通。也许是因为我正在使用 react-select 2。知道如何实现这一点吗? @Mumfordwiz 我在 CodeSandBox 中发布了一个示例:codesandbox.io/s/react-select-css-styling-forked-mrspe?file=/…【参考方案6】:

这是您覆盖主题样式的方式:

import React from "react";
import Select from "react-select";

class SelectComponent extends React.Component 
  componentDidMount() 
  render() 
    const  data  = this.props;

    const options = [
       value: "21", label: "21%" ,
       value: "9", label: "9%" ,
       value: "0", label: "0%" 
    ];

    const theme = theme => (
      ...theme,
      colors: 
        ...theme.colors,
        primary25: "#f3f3f3",
        primary: "pink"

        // All possible overrides
        // primary: '#2684FF',
        // primary75: '#4C9AFF',
        // primary50: '#B2D4FF',
        // primary25: '#DEEBFF',

        // danger: '#DE350B',
        // dangerLight: '#FFBDAD',

        // neutral0: 'hsl(0, 0%, 100%)',
        // neutral5: 'hsl(0, 0%, 95%)',
        // neutral10: 'hsl(0, 0%, 90%)',
        // neutral20: 'hsl(0, 0%, 80%)',
        // neutral30: 'hsl(0, 0%, 70%)',
        // neutral40: 'hsl(0, 0%, 60%)',
        // neutral50: 'hsl(0, 0%, 50%)',
        // neutral60: 'hsl(0, 0%, 40%)',
        // neutral70: 'hsl(0, 0%, 30%)',
        // neutral80: 'hsl(0, 0%, 20%)',
        // neutral90: 'hsl(0, 0%, 10%)',
      
      // Other options you can use
      // borderRadius: 4
      // baseUnit: 4,
      // controlHeight: 38
      // menuGutter: baseUnit * 2
    );

    return (
      <Select
        className="select"
        defaultValue=options[0]
        options=options
        theme=theme
      />
    );
  


export default SelectComponent;

【讨论】:

【参考方案7】:

和其他参与者一样,我对如何从数据中设置不同选项的样式感到困惑。版本 1 的语法看起来很简单,我考虑使用 3 年前的版本!我发现文档中的示例很难理解,因为它们将数据样式与 isDisabled、isFocused、多个回调等结合在一起。

最后,我在 Dmitry Rogozhny 的 CodeSandBox 中找到了一个简单的示例。这是一个分支版本,更新为 React 函数式语法,代码进一步简化:https://codesandbox.io/s/react-select-css-styling-forked-mrspe

【讨论】:

【参考方案8】:

我认为样式化 react-select 的最佳方法如下,人们也遇到了一些 z-index 问题,也解决了

const colourStyles = 
menuList: styles => (
    ...styles,
    background: 'papayawhip'
),
option: (styles, isFocused, isSelected) => (
    ...styles,
    background: isFocused
        ? 'hsla(291, 64%, 42%, 0.5)'
        : isSelected
            ? 'hsla(291, 64%, 42%, 1)'
            : undefined,
    zIndex: 1
),
menu: base => (
    ...base,
    zIndex: 100
)


    const options = [
    value: 'chocolate', label: 'Chocolate',
    value: 'strawberry', label: 'Strawberry',
    ]

<Select
   // defaultValue=[colourOptions[2], colourOptions[3]]
      name="colors"
      options=options
      className="basic-multi-select"
      classNamePrefix="select"
      styles=colourStyles
   />

【讨论】:

以上是关于如何设置反应选择选项的样式的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应(或任何东西)中设置 PayPal 信用卡输入框的样式?

如何通过反应原生天才聊天设置气泡中显示的图像尺寸?

如何对子反应组件进行 css 样式设置?

如何有多个反应选择选项

如何设置反应表过滤器输入字段的样式?

如何在反应选择下拉菜单中的选项下添加子选项?