Skip to content

React

@selkit/react 提供 <SelkitSelect> 元件與 useSelkit hook。State 以 useSyncExternalStore 橋接,因此重新渲染由核心驅動且不會 tearing。

元件

<SelkitSelect>value + onChange 受控

jsx
import { useState } from 'react'
import { SelkitSelect } from '@selkit/react'
import '@selkit/themes/base.css'

const options = [
  { value: 'apple', label: 'Apple' },
  { value: 'banana', label: 'Banana' },
]

export function Example() {
  const [value, setValue] = useState(null)
  return (
    <SelkitSelect
      options={options}
      value={value}
      onChange={(next, payload) => setValue(next)}
      placeholder="Pick a fruit…"
    />
  )
}

onChange 收到 (value, payload),其中 payload{ selected, value }。設定 multiplevalue 為陣列。

Props

Prop型別備註
optionsSelkitItem<T>[]扁平選項或分組。
valueSelkitValue受控值。
onChange(value, payload) => void
multipleboolean
placeholderstring
searchableboolean預設 true
fuzzybooleanfuzzy 子序列比對。
minInputLengthnumber達字數才過濾/載入。
minResultsForSearchnumber清單太短時隱藏搜尋框。
hideSelectedboolean把已選項從清單移除。
loadOptions(query, page) => Promise非同步 / 分頁載入。
taggable / createTagtagging。
maxSelectionsnumber
virtualScroll / itemHeight虛擬捲動。
dropdownParentHTMLElement | string用 createPortal 把下拉送出裁切祖先。
clearableboolean
renderOption(option, meta) => ReactNode自訂選項渲染。
renderSelection(option, meta) => ReactNode自訂已選 tag/單值內容。
classPrefixstring

完整清單見 Config 參考

自訂選項渲染

jsx
<SelkitSelect
  options={options}
  renderOption={(option, { active, selected }) => (
    <span className={selected ? 'is-selected' : undefined}>⭐ {option.label}</span>
  )}
/>

自訂已選渲染

自訂顯示的 tag/單值(例如加 icon)。元件仍保留 tag 外殼與移除鈕;meta{ index, multiple }

jsx
<SelkitSelect
  options={options}
  multiple
  renderSelection={(option) => (
    <span>🔖 {option.label}</span>
  )}
/>

Hook

若要自訂 markup,使用 useSelkit

jsx
import { useSelkit } from '@selkit/react'

function Custom() {
  const { controller, state } = useSelkit({ options })
  // state 是透過 useSyncExternalStore 取得的即時核心 state
  return <div>{state.visibleOptions.length} options</div>
}

controllerController 參考所載的同一個物件。

依 MIT 授權釋出。