对自定义 react-select 样式对象的内联更新

Inline update to a custom react-select styles object

我们有一个使用 react-select 构建的 select 小部件的自定义样式,称为 darkSelectStyles,其用法如下:

<Select
    isMulti
    styles={darkSelectStyles}
    value={ourValuesArray}
    onChange={ourHandlerFunction}
    options={ourSelectOptions}
/>

darkSelectStyles 是一个函数对象,其中每个函数 returns 是 select 特定部分的样式,我们想对 select 进行内联更新select 的 control 部分的样式。类似于:

const updatedStyles = {
    ...darkSelectStyles,
    control: (provided) => ({
        ...provided,
        minWidth: '300px'
    })   
}

然而,这完全取代了我们之前的 control 样式功能...这就是我们的 darkSelectStyles 对象的样子(注意它已经有 7-8 种样式 control,在上面的例子中丢失了):

export const darkSelectStyles = {
    container: (base) => ({
        ...base,
        display: 'inline-block'
    }),
    control: (provided, state) => ({
        ...provided,
        minHeight: '5px',
        fontSize: '1.05em',
        cursor: 'pointer',
        boxShadow: 'none',
        borderRadius: 5,
        border: 'none',
        backgroundColor: state.isDisabled ? 'rgba(167, 0, 0, 0.45)' : null,
        '&:hover': {
            backgroundColor: '#EEEEEE'
        }
    }),
    option: (provided) => ({
        ...provided,
        cursor: 'pointer',
        padding: '2px 6px 3px 6px',
        fontSize: '0.95em',
        marginTop: 0
    }),
    menu: (provided) => ({
        ...provided,
        backgroundColor: 'white',
        border: '1px solid #222222',
        boxShadow: cbbBoxShadow,
        zIndex: 999
    }),
    menuList: (provided) => ({
        ...provided,
        color: '#222222'
    }),
    singleValue: (provided, state) => ({
        ...provided,
        maxWidth: 'none',
        position: 'static',
        transform: 'none',

        // left: 0,
        color: state.isDisabled ? 'white' : '#222222',
        fontWeight: 700,
        overflow: 'initial'
    }),
    valueContainer: (provided) => ({ 
        ...provided, paddingBottom: 
        '0px', 
        paddingRight: '0px' 
    }),
    input: (provided) => ({
        ...provided,
        color: '#EEEEEE' 
    }),
    indicatorSeparator: () => ({ display: 'none' }),
    dropdownIndicator: (provided, state) => ({
        ...provided,
        padding: '0px 6px 0 2px',
        color: state.isDisabled ? 'white' : '#222222'
    })
};

如何修复 updatedStyles 函数以在不丢失其他样式的情况下处理新宽度?

编辑

我们可以将 darkSelectStyles 更改为一个函数,该函数接受参数 (minWidth) 和 returns 一个具有所有函数的对象,但是如果使用大量参数,这种方法可能会变得非常混乱为 select 小部件的不同部分设置样式...

这样的东西行得通吗?

const updatedStyles = {
    ...darkSelectStyles,
    control: (provided) => ({
        ...darkSelectStyles.control(provided, state), //assuming state is available
        minWidth: '300px'
    })   
}

这会调用 darkSelectStyles 中的原始 control 函数作为更新后的 control 函数中 return 的一部分,然后还会更新 minWidth .