当前位置:首页 > React

react实现搜索的select

2026-01-27 15:43:49React

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 库:

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 提供了丰富的功能和定制选项,是大多数情况下的推荐选择。

react实现搜索的select

标签: reactselect
分享给朋友:

相关文章

如何学习react

如何学习react

学习 React 的步骤 理解基础概念 React 是一个用于构建用户界面的 JavaScript 库。学习 React 之前,建议掌握 JavaScript 的基础知识,包括 ES6+ 语法(如箭头…

react中monent如何获取日期

react中monent如何获取日期

使用 Moment.js 获取当前日期 在 React 中通过 Moment.js 获取当前日期,可以直接调用 moment() 函数。它会返回包含当前日期和时间的 Moment 对象。 impo…

如何生成react代码

如何生成react代码

使用 Create React App 生成项目 安装 Node.js 后,通过命令行工具运行以下命令创建新项目: npx create-react-app my-app cd my-app npm…

电脑如何安装react

电脑如何安装react

安装 Node.js 和 npm React 依赖于 Node.js 和 npm(Node Package Manager)。从 Node.js 官网下载并安装最新稳定版本,安装完成后会自动包含 np…

如何手写一个react

如何手写一个react

手写一个简单的 React 创建一个基础的 React 实现需要理解其核心概念:虚拟 DOM、组件、状态管理和渲染。以下是一个简化版的 React 实现。 创建虚拟 DOM 虚拟 DOM 是真实…

如何react页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 基础页面结构 在 s…