当前位置:首页 > React

react实现搜索的select

2026-01-27 15:43:49React

react实现搜索的select

React 实现搜索 Select 组件

使用原生 select 实现基础搜索

import React, { useState } from 'react';

function SearchSelect({ options }) {
  const [searchTerm, setSearchTerm] = useState('');
  const [selectedOption, setSelectedOption] = useState('');

  const filteredOptions = options.filter(option =>
    option.toLowerCase().includes(searchTerm.toLowerCase())
  );

  return (
    <div>
      <input
        type="text"
        placeholder="Search..."
        value={searchTerm}
        onChange={(e) => setSearchTerm(e.target.value)}
      />
      <select
        value={selectedOption}
        onChange={(e) => setSelectedOption(e.target.value)}
      >
        <option value="">Select an option</option>
        {filteredOptions.map((option, index) => (
          <option key={index} value={option}>
            {option}
          </option>
        ))}
      </select>
    </div>
  );
}

使用第三方库 react-select

安装 react-select 库:

react实现搜索的select

npm install react-select

实现代码:

import React, { useState } from 'react';
import Select from 'react-select';

function SearchableSelect({ options }) {
  const [selectedOption, setSelectedOption] = useState(null);

  return (
    <Select
      value={selectedOption}
      onChange={setSelectedOption}
      options={options}
      isSearchable
      placeholder="Search..."
    />
  );
}

自定义搜索下拉组件

import React, { useState, useRef, useEffect } from 'react';

function CustomSearchSelect({ options }) {
  const [searchTerm, setSearchTerm] = useState('');
  const [isOpen, setIsOpen] = useState(false);
  const [selectedOption, setSelectedOption] = useState('');
  const dropdownRef = useRef(null);

  const filteredOptions = options.filter(option =>
    option.toLowerCase().includes(searchTerm.toLowerCase())
  );

  useEffect(() => {
    const handleClickOutside = (event) => {
      if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
        setIsOpen(false);
      }
    };
    document.addEventListener('mousedown', handleClickOutside);
    return () => {
      document.removeEventListener('mousedown', handleClickOutside);
    };
  }, []);

  return (
    <div ref={dropdownRef} style={{ position: 'relative' }}>
      <input
        type="text"
        placeholder="Search..."
        value={isOpen ? searchTerm : selectedOption}
        onChange={(e) => setSearchTerm(e.target.value)}
        onFocus={() => setIsOpen(true)}
      />
      {isOpen && (
        <ul style={{
          position: 'absolute',
          top: '100%',
          left: 0,
          right: 0,
          zIndex: 1,
          border: '1px solid #ccc',
          maxHeight: '200px',
          overflowY: 'auto',
          backgroundColor: 'white'
        }}>
          {filteredOptions.map((option, index) => (
            <li
              key={index}
              style={{ padding: '8px', cursor: 'pointer' }}
              onClick={() => {
                setSelectedOption(option);
                setIsOpen(false);
              }}
            >
              {option}
            </li>
          ))}
        </ul>
      )}
    </div>
  );
}

实现异步搜索

import React, { useState, useEffect } from 'react';
import Select from 'react-select';
import axios from 'axios';

function AsyncSearchSelect() {
  const [inputValue, setInputValue] = useState('');
  const [options, setOptions] = useState([]);
  const [isLoading, setIsLoading] = useState(false);

  useEffect(() => {
    if (inputValue) {
      setIsLoading(true);
      const timer = setTimeout(() => {
        axios.get(`https://api.example.com/search?q=${inputValue}`)
          .then(response => {
            setOptions(response.data.map(item => ({
              value: item.id,
              label: item.name
            })));
            setIsLoading(false);
          });
      }, 500);
      return () => clearTimeout(timer);
    }
  }, [inputValue]);

  return (
    <Select
      options={options}
      onInputChange={setInputValue}
      isLoading={isLoading}
      isSearchable
      placeholder="Search..."
    />
  );
}

多选搜索组件

import React, { useState } from 'react';
import Select from 'react-select';

function MultiSearchSelect() {
  const [selectedOptions, setSelectedOptions] = useState([]);
  const options = [
    { value: 'apple', label: 'Apple' },
    { value: 'banana', label: 'Banana' },
    { value: 'orange', label: 'Orange' }
  ];

  return (
    <Select
      isMulti
      value={selectedOptions}
      onChange={setSelectedOptions}
      options={options}
      isSearchable
      placeholder="Search and select multiple items..."
    />
  );
}

这些实现方式涵盖了从简单到复杂的各种搜索选择需求,可以根据项目需求选择合适的方案。react-select 提供了丰富的功能和定制选项,是大多数情况下的推荐选择。

标签: reactselect
分享给朋友:

相关文章

react 如何引入jquery

react 如何引入jquery

安装 jQuery 库 在 React 项目中引入 jQuery 的第一步是安装 jQuery。可以通过 npm 或 yarn 安装: npm install jquery # 或 yarn a…

如何选购react

如何选购react

选购 React 相关产品或服务的建议 React 是一个用于构建用户界面的 JavaScript 库,广泛应用于前端开发。以下是选购 React 相关产品(如课程、书籍、工具、组件库等)的参考方法:…

react如何运行

react如何运行

运行React项目的步骤 安装Node.js 确保系统已安装Node.js(建议版本12以上),可从官网下载并安装。Node.js自带npm包管理器,用于后续依赖安装。 创建React项目 使用官方…

react如何调试

react如何调试

调试 React 应用的方法 使用 React Developer Tools React Developer Tools 是 Chrome 和 Firefox 的浏览器扩展,可以检查组件树、状态和…

如何安装react

如何安装react

安装React的方法 方法一:使用Create React App(官方推荐) Create React App是官方提供的脚手架工具,适合快速搭建React项目。确保已安装Node.js(建议版本≥…

react如何刷新

react如何刷新

刷新React组件的方法 使用状态更新触发重新渲染 通过更新组件的状态可以触发重新渲染。React会在状态变化时自动重新渲染组件。 const [count, setCount] = useStat…