Skip to content

react-widget/listbox

Repository files navigation

ListBox

ListBox组件

安装

npm install --save react-widget-listbox

使用

Edit react-widget-listbox

import React from "react";
import Trigger from "react-widget-listbox";
import "react-widget-listbox/style";

export default function App() {
  return (
    <div
      className="App"
      style={{
        padding: 100
      }}
    >
      <ListBox
        data={[
            {
                value: 'Banana',
                label: 'Banana'
            }, {
                value: 'Orange',
                label: 'Orange'
            }, {
                value: 'Apple',
                label: 'Apple'
            }, {
                value: 'Mango',
                label: 'Mango'
            }, 
        ]}  
      />
    </div>
  );
}

Interfaces

export declare type ItemData = Record<string | number, any>;
export declare type ValueType = number | string;
export declare type Item = {
    value: any;
    label: React.ReactNode;
    disabled: boolean;
    children?: Item[];
    data: ItemData;
    ref: React.RefObject<ListItem>;
};
export interface ListBoxProps {
    /** 样式前缀 */
    prefixCls?: string;
    /** 样式名 */
    className?: string;
    /** 样式属性 */
    style?: React.CSSProperties;
    /** tabIndex值 */
    tabIndex?: number;
    /** 支持多选,开启多选后,defaultValue/value为数组 */
    multiple?: boolean;
    /** 默认选中值 */
    defaultValue?: ValueType | ValueType[];
    /** 选中值(受控) */
    value?: ValueType | ValueType[];
    /** 禁用 */
    disabled?: boolean;
    /** 只读 */
    readOnly?: boolean;
    /** 自动获取焦点 */
    autoFocus?: boolean;
    /** 数据集 */
    data?: ItemData[];
    /** 设置data数据的值字段 */
    valueField?: string;
    /** 设置data数据的显示字段 */
    labelField?: string;
    /** 设置data数据的禁用字段 */
    disabledField?: string;
    /** 设置data数据的子节点字段 */
    childrenField?: string;
    /** 设置renderHeader后CSS属性 */
    headerStyle?: React.CSSProperties;
    /** 设置renderFooter后CSS属性 */
    footerStyle?: React.CSSProperties;
    /** 设置列表容器CSS属性 */
    bodyStyle?: React.CSSProperties;
    /** 无数据时显示内容 */
    emptyLabel?: React.ReactNode;
    /** 获取列表项属性 */
    getItemProps?: (data: ItemData) => React.HTMLAttributes<HTMLElement>;
    /** 获取分组标题项属性 */
    getGroupTitleProps?: (data: ItemData) => React.HTMLAttributes<HTMLElement>;
    /** 自定义渲染分组标题 */
    renderGroupTitle?: (data: ItemData) => React.ReactNode;
    /** 自定义渲染列表项内容 */
    renderItem?: (data: ItemData, item: Item) => React.ReactNode;
    /** 自定义渲染器 */
    renderer?: (listBody: React.ReactNode) => React.ReactNode;
    fixListBodyHeightOnIE?: boolean;
    onSelect?: (value: string | number, data: ItemData) => void;
    onDeselect?: (value: ValueType, data: ItemData) => void;
    onChange?: (value: ValueType | ValueType[], data: ItemData[] | ItemData) => void;
    onFocus?: (e: React.FocusEvent) => void;
    onBlur?: (e: React.FocusEvent) => void;
    onKeyDown?: (e: React.KeyboardEvent) => void;
    onMouseLeave?: (e: React.MouseEvent) => void;
    wrapperComponent: React.ElementType;
    bodyWrapperComponent: React.ElementType;
}

defaultProps

{
	prefixCls: "rw-listbox",
	valueField: "value",
	labelField: "label",
	disabledField: "disabled",
	childrenField: "children",
	tabIndex: 0,
	emptyLabel: "Not Found",
	fixListBodyHeightOnIE: true,
	data: [],
	wrapperComponent: "div",
	bodyWrapperComponent: "div",
}

基础样式

.rw-listbox {
	border-radius: 3px;
	position: relative;
	background: #fff;
	display: flex;
	flex-direction: column;
	border: 1px solid #10161a26;
	padding: 5px;
}

.rw-listbox-body {
	flex: 1;
	overflow: auto;
	overflow-x: hidden;
}

.rw-listbox-item-group .rw-listbox-item {
	padding-left: 23px;
}

.rw-listbox-group-title {
	display: flex;
	padding: 5px 7px;
	line-height: 20px;
	user-select: none;
	color: rgb(24, 32, 38);
}

.rw-listbox-item {
	display: flex;
	border-radius: 2px;
	padding: 5px 7px;
	line-height: 20px;
	cursor: pointer;
	user-select: none;
	color: rgb(24, 32, 38);
}

.rw-listbox-item-active {
	background-color: rgba(167, 182, 194, 0.3);
}

.rw-listbox-item:active {
	background-color: rgba(115, 134, 148, 0.3);
}

.rw-listbox-item.rw-listbox-item-selected {
	color: #fff;
	background-color: #137cbd;
}
.rw-listbox-disabled .rw-listbox-item,
.rw-listbox-item.rw-listbox-item-disabled {
	background-color: inherit;
	color: rgba(167, 182, 194, 0.6);
	cursor: default;
}

.rw-listbox-group-title {
	font-weight: 400;
}
.rw-listbox-group-list .rw-listbox-item {
	padding-left: 24px;
}