使用React Hooks实现表格搜索功能

news2024/12/24 9:57:45

React Hooks是React 16.8版本引入的新特性,它的作用是为函数组件提供了状态管理和副作用处理的能力。

在React之前,函数组件被限制在只能使用无状态的函数组件,无法使用状态生命周期方法。Hooks的引入解决了这个限制,使得函数组件可以拥有和类组件相似的功能。

React Hooks的主要作用包括:

  • 状态管理:通过useState Hook,函数组件可以定义和使用状态。useState返回一个状态值和一个更新该状态值的函数,并且在组件重新渲染时能够保持状态的持久性。这使得函数组件能够保存和更新自己的状态,使得组件变得更加灵活和可复用。

  • 副作用处理:通过useEffect Hook,函数组件可以处理副作用操作,例如订阅数据、请求数据、操作DOM等。useEffect接收一个副作用函数和一个依赖数组作为参数,它会在每次组件渲染完成后执行副作用函数。这使得函数组件能够在需要时执行副作用操作,并且可以在组件卸载时清理副作用。

  • 上下文访问:通过useContext Hook,函数组件可以访问React的上下文(Context)。上下文提供了一种在组件树中共享数据的方式,而不需要通过逐层传递props。useContext接收一个上下文对象作为参数,并返回当前上下文的值。这使得函数组件能够更方便地使用上下文中的数据。

  • 自定义Hook:除了React提供的Hooks,开发者还可以自定义自己的Hooks。自定义Hook是一个函数,以"use"开头,并可以使用其他Hooks。通过自定义Hook,开发者可以将组件逻辑抽象为可复用的函数,使得组件变得更加简洁和可维护。

总体而言,React Hooks的作用是为函数组件提供了更多的功能和灵活性,使得函数组件能够更好地管理状态、处理副作用和访问上下文,从而简化了组件的开发和维护。它们使得函数组件成为了开发React应用的首选方式,并且在实际项目中得到了广泛的应用和验证。

表格搜索功能

d75423ca125d8b57c0e09e500def787c.png

在很多表格中,数据量是一次性直接返回的,如果增加一个搜索输入框+搜索按钮的话有点笨重,可以直接在表头位置增加搜索按钮

在表格所在组件中实现这个功能直接编写代码就行了,但是如果有多个表格需要使用到该功能,就需要将它提取出来

代码编写

创建了一个名为searchInput的引用,用于获取搜索输入框的DOM元素。

然后,使用useState定义了两个状态变量:searchText和searchedColumn。

  • searchText用于存储搜索关键词

  • searchedColumn用于存储当前正在搜索的列

定义了handleSearch方法和handleReset方法。

  • handleSearch方法用于处理搜索操作,它接收选中的关键词selectedKeys、确认函数confirm和数据索引dataIndex作为参数。在这个方法中,我们调用了confirm函数来关闭搜索框,并更新searchText和searchedColumn的值。

  • handleReset方法用于重置搜索操作,它接收清除过滤器函数clearFilters作为参数,用于清空搜索关键词并重置搜索状态

getColumnSearchProps

定义了getColumnSearchProps方法,它接收三个参数:dataIndex、title和index2。这个方法返回一个包含多个属性和方法的对象,用于配置表格搜索功能。

filterDropdown

返回一个包含搜索输入框和两个按钮的div元素。

  • 查找按钮触发handleSearch方法

  • 重置按钮触发handleReset方法

filterIcon

包含搜索图标的Icon组件

根据搜索状态来决定图标的颜色,当进行搜索时,图标会变为蓝色

onFilter

实现具体的搜索逻辑。

根据dataIndex和index2参数来判断记录中对应字段的值是否包含搜索关键词。

如果传入了index2,则比对那一列中的

record[dataIndex][index2]

不传入则是

record[dataIndex]

根据获取数据的层级来判断是否需要使用index2

使用index2的原因是,某些数据的层级较深,比如数据是「identity.uri」

{
   title: '录制Identity',
   dataIndex: 'identity.uri',
   key: 'identity',
   width: 200,
   ...getColumnSearchProps('identity', '录制Identity', 'uri'),
 },

不使用index2的数据是:

{
  title: '录制Identity',
  dataIndex: 'originUri',
  key: 'originUri',
  width: 200,
  ...getColumnSearchProps('originUri', '录制Identity'),
},

onFilterDropdownVisibleChange

当搜索框显示时自动选中搜索框

render

渲染表格中的每一行数据。

如果当前列是正在搜索的列,它会使用react-highlight-words组件对匹配的关键词进行高亮显示。

使用

import useTableColumnSearch from '@/hooks/useTableColumnSearch';

const { getColumnSearchProps } = useTableColumnSearch();

// 表格的Columns
{
  title: '录制Identity',
  dataIndex: 'identity.uri',
  key: 'identity',
  width: 200,
  ...getColumnSearchProps('identity', '录制Identity', 'uri'),
},

总结

使用该方式后可以:简化组件逻辑,方便复用

完整代码

import React, { useRef, useState } from 'react';
import { Input, Button, Icon } from 'antd';
import Highlighter from 'react-highlight-words';

/*
 * 表格搜索
 * */
const useTableColumnSearch = () => {
  const searchInput = useRef();
  const [searchText, setSearchText] = useState('');
  const [searchedColumn, setSearchedColumn] = useState('');

  const handleSearch = (selectedKeys, confirm, dataIndex) => {
    confirm();
    setSearchText(selectedKeys[0]);
    setSearchedColumn(dataIndex);
  };
  const handleReset = (clearFilters) => {
    clearFilters();
    setSearchText('');
  };

  /*
   * @param dataIndex: 搜索的字段
   * @param title: 搜索的字段中文名
   * @param index2: 搜索的字段中的子字段
   * */
  const getColumnSearchProps = (dataIndex, title, index2 = null) => ({
    filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (
      <div style={{ padding: 8 }}>
        <Input
          ref={searchInput}
          placeholder={`搜索${title}`}
          value={selectedKeys[0]}
          onChange={(e) => setSelectedKeys(e.target.value ? [e.target?.value.trim()] : [])}
          onPressEnter={() => handleSearch(selectedKeys, confirm, dataIndex)}
          style={{ width: 188, marginBottom: 8, display: 'block' }}
        />
        <Button type="primary" onClick={() => handleSearch(selectedKeys, confirm, dataIndex)} icon="search" size="small" style={{ width: 90, marginRight: 8 }}>
          查找
        </Button>
        <Button onClick={() => handleReset(clearFilters)} size="small" style={{ width: 90 }}>
          重置
        </Button>
      </div>
    ),
    filterIcon: (filtered) => <Icon type="search" style={{ color: filtered ? '#1890ff' : undefined }} />,
    onFilter: (value, record) => {
      if (index2) {
        return record[dataIndex][index2]?.toString().toLowerCase().includes(value.toLowerCase());
      }
      return record[dataIndex]?.toString().toLowerCase().includes(value.toLowerCase());
    },
    onFilterDropdownVisibleChange: (visible) => {
      if (visible) {
        setTimeout(() => searchInput.current.select());
      }
    },
    render: (text) => {
      return searchedColumn === dataIndex ? <Highlighter highlightStyle={{ backgroundColor: '#ffc069', padding: 0 }} searchWords={[searchText]} autoEscape textToHighlight={text?.toString()} /> : text;
    },
  });

  return { getColumnSearchProps };
};

export default useTableColumnSearch;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/994475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为全光园区商业市场解决方案

随着全球碳中和实践发展&#xff0c;光进铜退是必然发展趋势&#xff0c;园区网络全光化已经成为新一代智慧园区的新名片。相较传统网络方案&#xff0c;全光园区采用光纤下沉&#xff0c;将光纤从弱电机房延伸到每个房间&#xff0c;每个桌面&#xff0c;每个机器&#xff0c;…

txt实现日期计算器前端代码【搬代码】

使用txt文件实现日期计算器 操作步骤&#xff1a; 1.首先在桌面创建txt文本文档 2.打开文本复制下面代码到文本中 3.修改文本的txt为html 4.右键该html文本&#xff0c;打开方式浏览器&#xff0c;结果如下 5.当然也可以作用于idea 此处是所有代码&#xff0c;复制粘贴即…

上手SpringBoot

设置Maven镜像为阿里云 找到Maven的目录所在位置找到conf目录找到settings.xml文件 找到Maven的目录所在位置&#xff1a;去idea 的设置中 直接搜索Maven 找到conf目录 修改Maven本地仓库的地址 地址自定义 修改Maven的镜像为阿里云镜像 <mirror><id>nexus-aliy…

app源代码安全检测的重要性

源代码审计 app软件代码漏洞扫描&#xff08;源代码安全检测&#xff09;是从安全的角度对代码进行安全测试和评估。同时结合丰富的安全知识、编程经验和测试技术&#xff0c;采用静态分析和人工审查的方法&#xff0c;发现代码架构和编码中的安全漏洞&#xff0c;在代码之前将…

LeetCode 297. Serialize and Deserialize Binary Tree【树,DFS,BFS,设计,二叉树,字符串】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

LeetCode 428. Serialize and Deserialize N-ary Tree【树,BFS,DFS】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

华为倒逼苹果?走出舒适圈积极创新,苹果推出首批CIS堆叠式手机

9月9日消息&#xff0c;苹果公司最近推出了iPhone 15系列&#xff0c;这是业内首批搭载CIS堆叠式传感器的手机。这一消息得到了相关业内人士的关注。知名分析师郭明錤认为&#xff0c;尽管美国施加了制裁&#xff0c;在一些方面对苹果的影响是负面的&#xff0c;但华为的归来将…

Spring-MVC的文件上传下载,及插件的使用(让项目开发更节省时间)

目录 一、概述 ( 1 ) 介绍 ( 2 ) 讲述 二、上传 三、下载 四、jrebel的使用 五、多文件上传 给我们带来什么收获 一、概述 ( 1 ) 介绍 Spring MVC的文件上传下载是指在Spring MVC框架中实现文件的上传和下载功能。文件上传是指将本地计算机上的文件上传到服务器端…

一种基于注意机制的快速、鲁棒的混合气体识别和浓度检测算法,配备了具有双损失函数的递归神经网络

A fast and robust mixture gases identification and concentration detection algorithm based on attention mechanism equipped recurrent neural network with double loss function 摘要 提出一个由注意力机制组成的电子鼻系统。首先采用端到端的编码器译码器&#xff…

987. 二叉树的垂序遍历

987. 二叉树的垂序遍历 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;对中文的支持有点不友好IDEA 原题链接&#xff1a; 987. 二叉树的垂序遍历 https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/descriptio…

2.3 Java中的运算符

运算符&#xff0c;是表示各种不同运算的符号。 运算符按功能分为算术运算符、逻辑运算符、关系运算符、赋值运算符、位运算符等。 1. 算术运算符 算术运算符一般用于对整型数和浮点型数运算。 运算符 运算 范例 结果 正号 3 3 - 负号 b4;-b -4 加 55 10 …

恒运资本:开盘时间是几点到几点?

开盘时刻是指各种商场的正式开端生意时刻&#xff0c;包括股票商场、外汇商场、商品期货商场等。关于出资者来说&#xff0c;了解开盘时刻是十分重要的&#xff0c;由于它直接关系到生意的时刻和机会。本文将从多个角度分析开盘时刻的重要性、不同商场的开盘时刻以及对出资者带…

linux环境部署jmeter并执行测试

下载jmeter和jdk jmeter官网和java-jdk官网下载压缩包文件 jmeter下载地址&#xff1a;点此下载 jmeter Apache JMeter - Download Apache JMeter java-jdk下载地址&#xff1a;点此下载 jdk Java Downloads | Oracle 安装包根据Linux配置进行选择。 上传文件到Linux并解压文…

大厂案例 - 海量分类业务设计的一些思考

文章目录 业务背景描述方案演进v1 扩展字段扩展性需求查询需求 v2 垂直拆分拆分方案存在的问题 v3 三大中心服务 &#xff08;业界最佳实践&#xff09;统一帖子中心服务统一类目属性服务统一检索服务 小结 业务背景描述 一个分类信息平台&#xff0c;有很多垂直品类&#xff…

LeetCode(力扣)47.全排列 IIPython

LeetCode47.全排列 II 题目链接代码 题目链接 https://leetcode.cn/problems/permutations-ii/ 代码 class Solution:def permuteUnique(self, nums):nums.sort() # 排序result []self.backtracking(nums, [], [False] * len(nums), result)return resultdef backtrackin…

【Python】多线程

进程、线程 现代操作系统比如Mac OS X&#xff0c;UNIX&#xff0c;Linux&#xff0c;Windows等&#xff0c;都是支持“多任务”的操作系统。 进程&#xff1a;就是一个程序&#xff0c;运行在系统之上&#xff0c;那么便称之这个程序为一个运行进程&#xff0c;并分配进程ID…

JavaScript学习笔记02

JavaScript笔记02 数据类型详解 字符串 在 JavaScript 中正常的字符串都使用单引号 或者双引号" "包裹&#xff1a;例&#xff1a; 转义字符 在 JavaScript 字符串中也可用使用转义字符&#xff08;参考&#xff1a;详解转义字符&#xff09;&#xff1a;例&…

电工什么是电动势

什么是电动势&#xff1f;及电源电动势计算公式与方向确定 前面我们讲到在基本电路中的电流和电压的基础知识&#xff0c;而本文要讲的电动势和电压是一个很类似的概念。那么什么是电动势&#xff1f;电源电动势的计算公式是什么&#xff1f;它的方向如何确定及与电压有什么区…

【C语言】找单身狗问题

一.找单身狗问题初阶 1.问题描述 一个数组中只有一个数字是出现一次,其他所有数字都出现了两次.编写一个函数,找出这个只出现一次的数字. 例如: 有数组的元素是:1,2,3,4,5,1,2,3,4 只有5出现了一次,要找出5. 2.解题思路 常规思路: 在常规思路中,我们首先想到的肯定是使用两层…

腾讯云新用户有哪些优惠政策和专属活动?

腾讯云作为中国领先的云计算服务提供商&#xff0c;一直在为用户提供优质、高效且具有竞争力的服务。对于新用户&#xff0c;腾讯云更是诚意满满&#xff0c;推出了一系列优惠政策和专属活动。本文将详细介绍腾讯云新用户的优惠政策和专属活动&#xff0c;帮助大家更好地了解如…