react-select中如何允许用户选中已选值及valueComponent的文本?
如何让react-select中已选值的文本可选中?
刚好我之前也碰到过这个需求——react-select官网的默认示例确实没支持已选值文本的选中功能,但咱们可以通过自定义样式和组件来搞定,分两种场景给你说明:
一、处理默认单选/多选的已选文本
默认情况下,react-select的已选文本是没法选中的,因为组件内部默认加了user-select: none的样式。咱们可以通过自定义样式对象来覆盖这个设置:
import Select from 'react-select'; // 自定义样式,开启文本选中 const customSelectStyles = { // 单选时的已选文本样式 singleValue: (baseStyle) => ({ ...baseStyle, userSelect: 'text', }), // 多选时每个选项的文本样式 multiValueLabel: (baseStyle) => ({ ...baseStyle, userSelect: 'text', }), }; // 使用自定义样式的Select组件 <Select styles={customSelectStyles} // 其他props... />
这样不管是单选还是多选,用户都能选中已选值的文本了。如果你的项目用了CSS模块或者全局样式,也可以直接给对应的类名加user-select: text,不过用组件自带的styles属性更灵活,不会影响全局。
二、自定义valueComponent时开启文本选中
如果你自己定制了valueComponent,那直接在你的自定义组件里给文本元素加上可选中的样式就行,举个例子:
// 自定义的valueComponent const CustomValue = ({ value, ...restProps }) => { return ( <div {...restProps} style={{ userSelect: 'text' }}> {/* 这里的文本就可以被选中了 */} {value.label} </div> ); }; // 使用自定义valueComponent的Select <Select valueComponent={CustomValue} // 其他props... />
要是你的自定义组件里有更细粒度的元素,比如单独的<span>放文本,直接给这个<span>加userSelect: text样式就好,原理都是一样的。
小提醒
如果样式不生效,先检查一下是不是有其他全局样式的优先级更高,实在不行可以临时加!important(不过尽量优先用组件的styles属性,避免全局污染)。
内容的提问来源于stack exchange,提问作者F0RR
相关产品推荐
相关产品推荐

