如何设置 react-select 选项的样式
How to style react-select options
设置 react-select
组件的 (https://github.com/JedWatson/react-select) 选项样式的最佳方式是什么?
我可以很好地定位 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}
/>
问题是,展开 select 时的实际选项仍保持默认样式。我如何定位这些样式选项?
这是我所说的一个例子。我可以设置占位符的样式,但不能设置选项:
反应 select v2(更新)
这个新版本引入了新的 styles-api
和其他一些重大变化。
自定义样式
Style individual components with custom css using the styles prop.
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 中。内置选项渲染器还支持自定义类名。
将您的自定义 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
The className that gets used for options
我得到了使用风格:
const options = [
{label: "one", value: 1, style: { color: 'red' }},
{label: "two", value: 2, style: { color: 'blue' }}
// more options...
];
...
<Select options={options} />
const CustomStyle = {
option: (base, state) => ({
...base,
backgroundColor: state.isSelected ? {Color1} : {Color2},
})
}
<Select styles={customStyle} >
对此有更多选择。查看样式文档。
@btzr 的回答是正确的,并且使用 CSS 类 设计 react-select
是(相对)容易的。
但是,很难设置菜单项的样式,因为每次打开菜单并尝试检查项目时,菜单都会再次关闭。
有帮助的是(暂时)指定 menuIsOpen={true}
参数,这将使菜单保持打开状态以便于检查。
这是覆盖主题样式的方式:
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;
是正确的,让我们用在 React 中作为 props 传递的样式来设置元素的样式。
我仍然喜欢在设置元素样式时使用 Sass 或 Less,因为我在这些文件中有很多主题。这就是我传递 classNamePrefix='filter'
的原因。
<Select
classNamePrefix='filter'
options={this.getOptions()}
onChange={this.handleFilterChange}
isMulti
menuIsOpen
/>
然后在 Sass 或 Less class 名称 filter
.
中设置元素样式
.filter {
&__menu {
margin: 0.125rem auto;
}
&__option {
background-color: white;
&--is-focused {
background-color: lightblue;
}
}
&__group {
padding: 0;
}
&__menu-portal {
border: 1px solid darkblue;
}
}
和其他参与者一样,我对如何根据数据设置不同选项的样式感到困惑。版本 1 的语法看起来很简单,我考虑使用 3 年前的旧版本!我发现文档中的示例很难理解,因为它们将数据样式与 isDisabled、isFocused、多个回调等结合起来。
最后我在 Dmitry Rogozhny 的 CodeSandBox 中找到了一个简单的例子。这是一个分支版本,更新为 React 函数式语法,代码进一步简化:https://codesandbox.io/s/react-select-css-styling-forked-mrspe
我认为 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}
/>
设置 react-select
组件的 (https://github.com/JedWatson/react-select) 选项样式的最佳方式是什么?
我可以很好地定位 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}
/>
问题是,展开 select 时的实际选项仍保持默认样式。我如何定位这些样式选项?
这是我所说的一个例子。我可以设置占位符的样式,但不能设置选项:
反应 select v2(更新)
这个新版本引入了新的 styles-api
和其他一些重大变化。
自定义样式
Style individual components with custom css using the styles prop.
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 中。内置选项渲染器还支持自定义类名。
将您的自定义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
The className that gets used for options
我得到了使用风格:
const options = [
{label: "one", value: 1, style: { color: 'red' }},
{label: "two", value: 2, style: { color: 'blue' }}
// more options...
];
...
<Select options={options} />
const CustomStyle = {
option: (base, state) => ({
...base,
backgroundColor: state.isSelected ? {Color1} : {Color2},
})
}
<Select styles={customStyle} >
对此有更多选择。查看样式文档。
@btzr 的回答是正确的,并且使用 CSS 类 设计 react-select
是(相对)容易的。
但是,很难设置菜单项的样式,因为每次打开菜单并尝试检查项目时,菜单都会再次关闭。
有帮助的是(暂时)指定 menuIsOpen={true}
参数,这将使菜单保持打开状态以便于检查。
这是覆盖主题样式的方式:
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;
我仍然喜欢在设置元素样式时使用 Sass 或 Less,因为我在这些文件中有很多主题。这就是我传递 classNamePrefix='filter'
的原因。
<Select
classNamePrefix='filter'
options={this.getOptions()}
onChange={this.handleFilterChange}
isMulti
menuIsOpen
/>
然后在 Sass 或 Less class 名称 filter
.
.filter {
&__menu {
margin: 0.125rem auto;
}
&__option {
background-color: white;
&--is-focused {
background-color: lightblue;
}
}
&__group {
padding: 0;
}
&__menu-portal {
border: 1px solid darkblue;
}
}
和其他参与者一样,我对如何根据数据设置不同选项的样式感到困惑。版本 1 的语法看起来很简单,我考虑使用 3 年前的旧版本!我发现文档中的示例很难理解,因为它们将数据样式与 isDisabled、isFocused、多个回调等结合起来。
最后我在 Dmitry Rogozhny 的 CodeSandBox 中找到了一个简单的例子。这是一个分支版本,更新为 React 函数式语法,代码进一步简化:https://codesandbox.io/s/react-select-css-styling-forked-mrspe
我认为 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}
/>