zoukankan      html  css  js  c++  java
  • react-hook手动封装可搜索远程数据的搜索框

    废话不多说,直接上代码!!!

     1 import React, { useState, useRef } from 'react'
     2 import { SearchOutlined } from '@ant-design/icons'
     3 import './styles.less'
     4 
     5 const arr = [ // 模拟数据
     6   { id: 0, name: '张三15324680666' },
     7   { id: 1, name: '李四13603885241' },
     8   { id: 2, name: '王五18939752514' },
     9   { id: 3, name: '王珊15525242514' },
    10   { id: 4, name: '刘振19852524868' },
    11   { id: 5, name: '王啊15525242514' },
    12   { id: 6, name: '王我15525242514' },
    13   { id: 7, name: '王屙15525242514' },
    14   { id: 8, name: '王去15525242514' },
    15 ]
    16 
    17 export default function Test() {
    18 
    19   const putEle = useRef() // 获取输入框元素
    20   const [iconS, setIconS] = useState(false) // 搜索按钮的显示隐藏状态
    21   const [openS, setOpenS] = useState(false) // 数据列表的状态
    22   const [data, setData] = useState([]) // 搜索完之后的数据存放
    23   const [enterI, setEnterI] = useState(null) // 鼠标移入数据列表
    24 
    25   const putEnter = () => setIconS(true)
    26 
    27   const putLeave = () => { setIconS(false), setOpenS(false) }
    28 
    29   const searchClick = () => { // 点击搜索
    30     let value = putEle.current.value
    31     if (value) {
    32       const itemArr = []
    33       arr.forEach(v => {
    34         if (v.name.indexOf(value) != -1) {
    35           itemArr.push(v)
    36         }
    37       })
    38       setData(itemArr)
    39       setOpenS(true)
    40     } else { setOpenS(false) }
    41   }
    42   
    43   const itemStylesAdd = (index) => setEnterI(index) // 数据列表划过添加样式
    44 
    45   const itemClick = (value) => {
    46     putEle.current.value = value
    47     setOpenS(false)
    48     setData([])
    49   }
    50 
    51   const TextLeave = () => setEnterI(-1)
    52 
    53   return (
    54     <div className="pages-test">
    55       <div onMouseEnter={putEnter} onMouseLeave={putLeave} className="input-box">
    56         <input type="text" ref={putEle} />
    57         {openS ? <div onMouseLeave={TextLeave} className="sourse-text">
    58           {
    59             data.length ? data.map((v, i) => {
    60               return (
    61                 <div
    62                   key={i}
    63                   className={enterI === i ? "data-item itemStyle" : "data-item"}
    64                   onMouseEnter={() => { itemStylesAdd(i) }}
    65                   onClick={() => { itemClick(v.name) }}
    66                 >
    67                   {v.name}
    68                 </div>
    69               )
    70             }) : <div className="not-found">不好意思,没有搜索结果</div>
    71           }
    72         </div> : null}
    73         {iconS ? <SearchOutlined onClick={searchClick} /> : null}
    74       </div>
    75     </div>
    76   )
    77 }

    样式代码

    .pages-test {
      .input-box {
        width: 200px;
        display: inline-block;
        position: relative;
        input {
          width: 200px;
          height: 32px;
          border: 1px solid #D9D9D9;
          border-radius: 3px;
          padding-left: 5px;
        }
        .sourse-text {
          width: 200px;
          height: 150px;
          background: white;
          border: 1px solid #D9D9D9;
          position: absolute;
          bottom: -150px;
          overflow: auto;
          .data-item {
            width: 100%;
            height: 30px;
            line-height: 30px;
            padding-left: 10px;
            cursor: pointer;
          }
          .itemStyle {
            background: #C8E0F0;
          }
          .not-found {
            text-align: center;
            line-height: 140px;
          }
        }
        .anticon-search {
          position: absolute;
          right: 3%;
          top: 15%;
          font-size: 22px;
          cursor: pointer;
        }
      }
    }
    
    
    /*滚动条样式*/
    
    ::-webkit-scrollbar {
    
      /*滚动条整体样式*/
      
      width: 4px; /*高宽分别对应横竖滚动条的尺寸*/
      
      height: 4px;
      
      }
      
      ::-webkit-scrollbar-thumb {
      
      /*滚动条里面小方块*/
      
      border-radius: 5px;
      
      -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
      
      background: rgba(0, 0, 0, 0.2);
      
      }
      
      ::-webkit-scrollbar-track {
      
      /*滚动条里面轨道*/
      
      -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
      
      border-radius: 0;
      
      background: rgba(0, 0, 0, 0.1);
      
      }
  • 相关阅读:
    如何在 Linux 虚拟机上扩展根文件系统
    Linux 虚拟机中配置 GNOME + VNC
    在 Linux 中使用 Azure Premium 存储的基本优化指南
    如何为运行的 ARM Linux 启用 LAD2.3 版本的诊断扩展
    不要在构造函数中抛出异常
    vtk java
    富文本keditor的一些使用问题
    几个问题
    Java并发编程(十四)并发容器类
    FreeBSD编译安装emacs,不要用ports
  • 原文地址:https://www.cnblogs.com/fengxiana/p/13551376.html
Copyright © 2011-2022 走看看