选择器

当用户需要从一组同类数据中选择一个或多个时,可以使用下拉选择器,点击后选择对应项。

导入

import { Select, NativeSelect } from "@resolid/react-ui";
  • Select 选择器
  • NativeSelect 原生选择器

基本

<Select
  className={"w-36"}
  options={Array(10)
    .fill(null)
    .map((_, idx) => idx + 1)
    .map((eve) => ({ value: eve, label: `选项 ${eve}` }))}
/>
<Select
  multiple
  className={"min-w-56"}
  options={Array(10)
    .fill(null)
    .map((_, idx) => idx + 1)
    .map((eve) => ({ value: eve, label: `选项 ${eve}` }))}
/>

可控

你最常用的库:

你曾学习的库:

const [value, setValue] = useState("");
const [values, setValues] = useState([]);

return (
  <>
    <div className={"flex w-full flex-col gap-2 md:w-1/3"}>
      <p>你最常用的库: {value}</p>
      <Select
        className={"w-36"}
        value={value}
        onChange={(value) => setValue(value)}
        options={[
          { value: "react", label: "React" },
          { value: "angular", label: "Angular" },
          { value: "svelte", label: "Svelte" },
          { value: "vue", label: "Vue" },
          { value: "solid", label: "Solid" },
          { value: "preact", label: "Preact" },
        ]}
      />
    </div>
    <div className={"flex w-full flex-col gap-2 md:w-2/3"}>
      <p>你曾学习的库: {values.join(", ")}</p>
      <Select
        multiple
        closeOnSelect={false}
        className={"min-w-36"}
        value={values}
        onChange={(values) => setValues(values)}
        options={[
          { value: "react", label: "React" },
          { value: "angular", label: "Angular" },
          { value: "svelte", label: "Svelte" },
          { value: "vue", label: "Vue" },
          { value: "solid", label: "Solid" },
          { value: "preact", label: "Preact" },
        ]}
      />
    </div>
  </>
);

状态

<Select
  disabled
  className={"w-36"}
  options={Array(10)
    .fill(null)
    .map((_, idx) => idx + 1)
    .map((eve) => ({ value: eve, label: `选项 ${eve}` }))}
/>
<Select
  invalid
  className={"w-36"}
  options={Array(10)
    .fill(null)
    .map((_, idx) => idx + 1)
    .map((eve) => ({ value: eve, label: `选项 ${eve}` }))}
/>
<Select
  readOnly
  className={"w-36"}
  options={Array(10)
    .fill(null)
    .map((_, idx) => idx + 1)
    .map((eve) => ({ value: eve, label: `选项 ${eve}` }))}
/>

大小

<Select
  className={"w-28"}
  options={Array(10)
    .fill(null)
    .map((_, idx) => idx + 1)
    .map((eve) => ({ value: eve, label: `选项 ${eve}` }))}
  size={'xs'}
/>
<Select
  multiple
  className={"w-28"}
  options={Array(10)
    .fill(null)
    .map((_, idx) => idx + 1)
    .map((eve) => ({ value: eve, label: `选项 ${eve}` }))}
  size={'sm'}
/>
<Select
  className={"w-28"}
  options={Array(10)
    .fill(null)
    .map((_, idx) => idx + 1)
    .map((eve) => ({ value: eve, label: `选项 ${eve}` }))}
  size={'md'}
/>
<Select
  multiple
  className={"w-36"}
  options={Array(10)
    .fill(null)
    .map((_, idx) => idx + 1)
    .map((eve) => ({ value: eve, label: `选项 ${eve}` }))}
  size={'lg'}
/>
<Select
  className={"w-36"}
  options={Array(10)
    .fill(null)
    .map((_, idx) => idx + 1)
    .map((eve) => ({ value: eve, label: `选项 ${eve}` }))}
  size={'xl'}
/>

选项组

<Select
  className={"w-52"}
  options={[
    {
      label: "前端",
      options: [
        { label: "React", value: "react" },
        { label: "Vue", value: "vue" },
        { label: "Angular", value: "angular" },
      ],
    },
    {
      label: "后端",
      options: [
        { label: "Express", value: "express" },
        { label: "Koa", value: "koa" },
        { label: "Laravel", value: "laravel" },
      ],
    },
    {
      label: "数据库",
      options: [
        { label: "Mysql", value: "mysql", disabled: true },
        { label: "Postgres", value: "postgres" },
        { label: "SQLite", value: "sqlite" },
      ],
    },
  ]}
/>

自定义渲染

const browsers = [
  {
    value: "chrome",
    name: "Google Chrome",
    icon: <BrowserIcon name={"chrome"} />,
    description: "Google Chrome 是一款快速、易于使用且安全的网络浏览器。",
  },
  {
    value: "firefox",
    name: "Firefox",
    icon: <BrowserIcon name={"firefox"} />,
    description: "Firefox 是由 Mozilla 支持的免费网络浏览器。",
  },
  {
    value: "safari",
    name: "Safari",
    icon: <BrowserIcon name={"safari"} />,
    description: "Safari 是在所有 Apple 设备上体验互联网的最佳方式。",
  },
  {
    value: "edge",
    name: "Microsoft Edge",
    icon: <BrowserIcon name={"edge"} />,
    description: "Microsoft Edge 是新 Bing 体验的最佳浏览器。",
  },
  {
    value: "opera",
    name: "Opera",
    icon: <BrowserIcon name={"opera"} />,
    description: "比默认浏览器更快、更安全、更智能。 功能齐全,可保护隐私、安全等。",
  },
  {
    value: "brave",
    name: "Brave",
    icon: <BrowserIcon name={"brave"} />,
    description: "Brave 浏览器是一款超快速、私密且安全的网络浏览器,带有 Adblock。",
  },
  {
    value: "vivaldi",
    name: "Vivaldi",
    icon: <BrowserIcon name={"vivaldi"} />,
    description: "我们正在构建一个快速、高度可定制的浏览器,优先考虑您的隐私。",
  },
];

const renderOption = (browser) => {
  return (
    <div className={"flex items-center gap-3"}>
      {browser.icon}
      <div>
        <div>{browser.name}</div>
        <div className={"text-fg-subtle text-sm"}>{browser.description}</div>
      </div>
    </div>
  );
};

const renderLabel = (browser) => {
  return (
    <div className={"flex flex-row items-center gap-2"}>
      {browser.icon}
      {browser.name}
    </div>
  );
};

return (
  <>
    <Select
      className={"w-56"}
      defaultValue={"chrome"}
      options={browsers}
      renderLabel={renderLabel}
      renderOption={renderOption}
    />
    <Select
      className={"w-96"}
      defaultValue={["firefox", "chrome"]}
      options={browsers}
      multiple
      renderLabel={renderLabel}
      renderOption={renderOption}
    />
  </>
);

虚拟滚动

当选项值超过 30 个并且没有分组的时候就会自动开启虚拟滚动

<Select
  className={"w-36"}
  options={Array(1000)
    .fill(null)
    .map((_, idx) => idx + 1)
    .map((eve) => ({ value: eve, label: `选项 ${eve}` }))}
/>
<Select
  className={"w-36"}
  defaultValue={102}
  options={Array(1000)
    .fill(null)
    .map((_, idx) => idx + 1)
    .map((eve) => ({ value: eve, label: `选项 ${eve}` }))}
/>
<Select
  multiple
  className={"min-w-56"}
  defaultValue={[102,252]}
  options={Array(1000)
    .fill(null)
    .map((_, idx) => idx + 1)
    .map((eve) => ({ value: eve, label: `选项 ${eve}` }))}
/>

原生选择器

<NativeSelect size={'xs'} placeholder={'选择框架'}>
  <option value={'react'}>React</option>
  <option value={'vue'}>Vue</option>
  <option value={'angular'} disabled>Angular</option>
  <option value={'solid'}>Solid</option>
  <option value={'svelte'}>Svelte</option>
</NativeSelect>
<NativeSelect size={'sm'} placeholder={'选择框架'}>
  <option value={'react'}>React</option>
  <option value={'vue'}>Vue</option>
  <option value={'angular'}>Angular</option>
  <option value={'solid'}>Solid</option>
  <option value={'svelte'}>Svelte</option>
</NativeSelect>
<NativeSelect defaultValue={'solid'} placeholder={'选择框架'}>
  <option value={'react'}>React</option>
  <option value={'vue'}>Vue</option>
  <option value={'angular'}>Angular</option>
  <option value={'solid'}>Solid</option>
  <option value={'svelte'}>Svelte</option>
</NativeSelect>
<NativeSelect size={'lg'} placeholder={'选择框架'}>
  <option value={'react'}>React</option>
  <option value={'vue'}>Vue</option>
  <option value={'angular'}>Angular</option>
  <option value={'solid'}>Solid</option>
  <option value={'svelte'}>Svelte</option>
</NativeSelect>
<NativeSelect size={'xl'} placeholder={'选择框架'}>
  <option value={'react'}>React</option>
  <option value={'vue'}>Vue</option>
  <option value={'angular'}>Angular</option>
  <option value={'solid'}>Solid</option>
  <option value={'svelte'}>Svelte</option>
</NativeSelect>

属性

选择器

属性options类型readonly Option[]默认值-必须true
属性fieldNames类型OptionFieldNames默认值-必须false
属性size类型"xs" | "sm" | "md" | "lg" | "xl"默认值'md'必须false
属性multiple类型boolean默认值false必须false
属性placeholder类型string默认值'请选择...'必须false
属性disabled类型boolean默认值false必须false
属性required类型boolean默认值false必须false
属性invalid类型boolean默认值false必须false
属性block类型boolean默认值false必须false
属性value类型string | number | (string | number)[] | null默认值-必须false
属性defaultValue类型string | number | (string | number)[] | null默认值-必须false
属性closeOnSelect类型boolean默认值true必须false
属性onChange类型((value: string | number | (string | number)[] | null) => void)默认值-必须false
属性onSearch类型(value: string) => void默认值-必须false
属性onSelect类型((value: string | number | null, option: Omit<Option, never>) => void)默认值-必须false
属性onDeselect类型((value: string | number | null, option: Omit<Option, never>) => void)默认值-必须false
属性renderLabel类型Render<Omit<Option, never>>默认值-必须false
属性renderOption类型Render<Omit<Option, never>>默认值-必须false
属性duration类型number默认值'250'必须false

原生选择器

属性size类型"xs" | "sm" | "md" | "lg" | "xl"默认值'md'必须false
属性disabled类型boolean默认值false必须false
属性invalid类型boolean默认值false必须false