写点什么

用 React Hooks 做一个搜索栏

  • 2020-04-24
  • 本文字数:2539 字

    阅读完需:约 8 分钟

用React Hooks做一个搜索栏

AI 大模型超全落地场景&金融应用实践,8 月 16 - 19 日 FCon x AICon 大会联诀来袭、干货翻倍!

本文最初发布于 Hackernoon 博客,经原作者授权由 InfoQ 中文站翻译并分享。


以下是我们将要构建的搜索框的动图。这是一个简单的搜索框,我们可以用它来搜索联系人列表。我们将使用函数式组件,而不是基于类的组件来实现它。



下面就开始吧。首先创建一个新的 React 应用:


npx create-react-app contacts-list 
复制代码


然后转到 contacts-list 目录。在你常用的代码编辑器中打开目录。就我而言,我使用的是 vscode,因此我要从命令行执行的操作是:


code .
复制代码


src 目录中创建一个名为 components 的新文件夹,并在其中创建一个 Numbers.js 文件。转到你的 App.js 文件并导入 Numbers.js 组件。


接下来我们需要创建一些人名,然后将这些人名作为 props 传递给 Numbers.js 组件来渲染。


import React, { useState } from "react";import { Numbers } from "./components/Numbers";export const App = () => {  const [persons] = useState([    { name: "Dayo Olorinla", number: "+234-1234-5678" },    { name: "Temi Otedola", number: "+234-9029-9229" },    { name: "Zlatan Ibile", number: "+234-1243-2345" },  ]);
return ( <div> <Numbers persons={persons} /> </div> );};export default App;
复制代码


现在在我们的 Numbers 组件中,我们将接收从 App 传递过来的 props,并使用它来显示 contacts list


参见下面的代码,其中包含每个步骤的解释说明。


import Rect, { useStae } from "react";export const Numbers = props => {// word 会跟踪 filter box 内输入的任何更改  const [word, setword] = useState("");// filterdisplay 会基于 search 来显示更新的列表,其默认状态是我们的 persons 列表 prop  const [filterDispllay, setFilterDisplay] = useStae(props.persons);// handleChange 每次运行时在输入字段都会有一个更改  const handleChange = e => {// 在一个新数组中存放原始列表,将所有人名转为小写字母,因为我们不知道用户要输入什么格式;然后我们返回 OldList 作为一个对象数组,来存放这个更改的列表  let oldList = props.persons.map(person => {    return { name: person.name.toLowerCase(), number: person.number };  });  // 如果输入栏不为空,则运行以下代码;否则,setFilterDisplay 设为原始列表 prop  if (e !== "") {    let newList =[];    // setWord 一直跟踪输入的任何更改    setWord(e);    // newList 是保存符合搜索参数的 persons 的数组    newList = oldList.filter(person =>// 我们调用 includes 方法并用小写传递进'word'状态,这会检查 oldList 是否包含名字中带有'word'的人名      person.name.includes(word.toLowerCase())    );// 我们会一直检查输入并返回 newList 数组。我们调用 setFilterDisplay 来在每次输入调整后更新状态      setFilterDisplay(newList);    }  };  return (    <div>      <hl>Number</hl>      filter: <input onChange={e => handleChange(e.target.value)} />      {filterDisplay.map((person, i) => (        <div key={i}>          <li>            {person.name} &nbsp;            <span>{person.number}</span>          </li>        </div>      ))}    </div>  );};
复制代码


最后,每次更新时,我们都会从 FilterDisplay 返回更新的信息。如果你和我一样想将搜索栏分成一个单独的组件,请继续看下去。下面我们来重构这个东西!将搜索拆分成一个单独的组件后,我们就可以在应用程序的其他组件中使用同样的搜索栏了。


首先我们创建一个 Filter 组件,在我们的 components 文件夹中将其命名为 Filter.js。它需要 2 个 props,分别用于输入值和 onChange 事件。


import React from "react";export const Filter = ({ value, handleChange }) => {  return (    <div>      filter: <input value={value} onChange={handleChange} />    </div>  );};
复制代码


接下来我们需要重构 Numbers.js 组件,让它只渲染过滤过的人员列表。它将接受一个 prop,也就是 list/array。


import React from "react";export const Numbers = ({ persons }) => {  return (    <div>      <hl>Numbers</hl>      {person.map((person, i) => (        <div key={i}>          <li>            {person.name} &nbsp;            <span>{person.number}</span>          </li>        </div>      ))}    </div>  );};
复制代码


回想一下,我们所有的状态都在 App 组件内管理,并作为 props 传递给我们的组件。最后,在 App 组件中我们将一个有状态值传递给 Filter 组件中的输入字段,还将传递一个 handleChange 方法,当输入字段中发生更改时将调用这个方法。


import React, { useState } from "react";import { Filter } from "./components/Filter";import { Numbers } from "./components/Numbers";export const App = () => {  const [word, setWord] = useState("");  const [persons] = useState([    { name: "Dayo Olorinla", number: "+234-1244-5678" },    { name: "Temi Otedola", number: "+234-9029-9229" },    { name: "Zlatan Ibile", number: "+234-1243-2345" }  ]);  const [filterDisplay, setFilterDisplay] = useState([]);
const handleChange = e => { setWord(e); let oldList = persons.map(person => { return { name: person.name.toLowerCase(), number: person.number }; });
if (word !== "") { let newList = [];
newList = oldList.filter(person => person.name.includes(word.toLowerCase()) );
setFilterDisplay(newList); } else { setFilterDisplay(persons); } };
return ( <div> <Filter value={word} handleChange={e => handleChange(e.target.value)} /> <Numbers persons={word.length <1 ? persons : filterDisplay} /> </div> );};export default App;
复制代码


return 中,我们的 Numbers 组件将始终检查输入字段是否为空白。如果是的话就渲染原始的 Persons 数组,否则我们根据在输入字段中输入的内容渲染列表。就是这样,搞定!

英文原文

How to Build a Search Bar in React With React Hooks


2020-04-24 16:484361
用户头像
小智 让所有人认同的文字称不上表达

发布了 408 篇内容, 共 381.6 次阅读, 收获喜欢 1976 次。

关注

评论

发布
暂无评论
发现更多内容

鸿蒙4.2小版本大亮点,鸿蒙5.0也不远了

FinFish

鸿蒙应用开发 小程序容器技术 鸿蒙Next 鸿蒙5.0 鸿蒙SDK

DashVector x 通义千问大模型:打造基于专属知识的问答服务

DashVector

数据库 后端 向量检索 大模型

Dubbo 全链路监控技术实践

乘云数字DataBuff

dubbo 全链路监控

AWS Elastic Beanstalk 监控可观测最佳实践

观测云

APM AWS

DashVector + ModelScope 玩转多模态检索

DashVector

数据库 AI 向量检索 大模型

GitHub天花板!清华大佬纯手码的《python背记手册》火了!

我再BUG界嘎嘎乱杀

Python 后端 软件开发 入门 零基础

Win10-VMware安装CentOS7.5

vinci321

centos win10 vmware 虚拟机

蓝易云 - Spring Boot常用注解大全:常用注解汇总一览

百度搜索:蓝易云

云计算 spring Linux 运维 Spring Boot

零成本开发!试试这6个免费的API接口平台

幂简集成

API 免费API接口 免费API 免费API接口平台

用数据,简单点!奇点云2024 StartDT Day数智科技大会,直播见

奇点云

发布会 奇点云 数据云 分析云

IntelliJ IDEA集成Baidu Comate,商城系统支付交易功能开发实战

阿Q说代码

百度 智能推荐 comate 代码助手 智能编码

提升医疗服务质量的基石:全面解析医疗数据治理

郑州埃文科技

数据治理

基于串口通信的电子相册设计

芯动大师

Python COF 智能屏

AAAI 2024 | 基于由粗到细的视觉表征实现的高效匹配且兼顾性能的跨模态检索

快手技术

蓝易云 - 小程序开发选择什么配置服务器

百度搜索:蓝易云

服务器 云主机 云服务器 服务器租用 VPS

音乐弹幕?智能修音?回森K歌社区的创新玩法?(上)

快手技术

商业模式 创新 玩法

加速规模化应用,火山引擎升级金融大模型服务体系

新消费日报

蓝易云 - Postman04-Post方法发送请求

百度搜索:蓝易云

Linux 服务器 HTTP Postman 云服务器

开源啦,Redis跨集群实时数据同步工具

golang 数据库 微服务、 redis 底层原理

全球厂商之最,华为17篇论文入选国际数据库顶会ICDE

华为云开发者联盟

华为云 华为云GaussDB 华为云开发者联盟 华为云GeminiDB 企业号2024年5月PK榜

快手闪耀VALSE2024:揭秘视频生成技术,展示文生图大模型

快手技术

学术会议 学术论文

半年涨粉1000万!揭秘快意大模型在短视频互动场景中的大规模应用实践!

快手技术

短视频 机器人 #大模型

低代码平台对企业数字化建设的启示与应用

快乐非自愿限量之名

低代码 企业转型

快手工程架构治理大揭秘:告别崩溃,提效神器来袭!

快手技术

架构 架构治理

蓝易云 - Linux服务器如何修改密码

百度搜索:蓝易云

云计算 Linux 运维 服务器 云服务器

云原生多云多集群Karmada|2024开源之夏8项课题邀您共创

华为云开发者联盟

Kubernetes 云原生 华为云 华为云开发者联盟 企业号2024年5月PK榜

基于向量检索服务与TextEmbedding实现语义搜索

DashVector

AI 向量检索 大模型 语义搜索

伙伴活动|W3C 标准带头人开讲 WebGPU 前沿趋势

声网

为什么要迈进NGAIOps(下一代AIOps)

乘云数字DataBuff

AIOPS NGAIOps

大厂程序员的一天,沉浸式体验Baidu Comate代码助手如何用于面试、代码评审……

申屠鹏会

大模型 Baidu Comate comate

用React Hooks做一个搜索栏_大前端_adebola_InfoQ精选文章