QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

用 React Hooks 做一个搜索栏

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

    阅读完需:约 8 分钟

用React Hooks做一个搜索栏

本文最初发布于 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:484461
用户头像
小智 让所有人认同的文字称不上表达

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

关注

评论

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

研发管理与项目管理:痛点分析与建议

爱吃小舅的鱼

项目管理 研发管理 管理项目

开源项目管理工具如何选?9款值得一试的选择

爱吃小舅的鱼

开源项目管理工具

如何正确保护Python代码,不是Pyinstaller

LLLibra146

Python 代码保护

我们的 WebAssembly 实验:扩展 NGINX Agent

NGINX开源社区

nginx Wasm nginx 开源版

纽约时报诉OpenAI:生成式AI时代的数据陷阱与法律边界

本原智数

人工智能 数据采集 数据合规 本原智数

一书了解AI的下一个浪潮!

博文视点Broadview

小游戏3.0时代,应回归到游戏价值本身

FinFish

小程序容器 小游戏 小游戏技术 实时互动技术

共建行业生态,智谱大模型生态合作伙伴联盟成立

技术研究院

摩尔线程开源vLLM-MUSA 加速国产GPU AI

吴脑的键客

人工智能

认识鸿蒙Context

龙儿筝

鸿蒙

UBBF 2024,建起超宽带与AI间的博斯普鲁斯大桥

脑极体

淘宝商品详情API接口Java GET调用指南

代码忍者

API 接口 pinduoduo API

AOT使用经验总结

沙漠尽头的狼

cleanmymac有必要买吗?Mac清理软件哪个好用?

阿拉灯神丁

软件包 清理工具 mac系统维护 CleanMyMac X中文版

ppt目录页怎么做好看?一键切换ppt模板布局的神器来了!

职场工具箱

效率工具 职场 PPT 高效办公 AI生成PPT

项目管理流程图解:简化复杂任务

爱吃小舅的鱼

项目管理 项目流程 项目规划

管理团队的最佳实践

爱吃小舅的鱼

管理团队

华为应用市场:赋能开发者全生命周期服务体验

热爱编程的小白白

京东零售推荐系统可解释能力详解

京东零售技术

人工智能 推荐模型 可解释

三分之一的生成式AI项目将被放弃?从零开始看RAG如何变现

本原智数

人工智能 大模型 生成式AI rag 本原智数

NocoBase 实战教程 —— 任务管理系统

NocoBase

开源 低代码 教程 无代码

10人小公司管理指南:从沟通到绩效评估

爱吃小舅的鱼

公司管理

SpringBoot启动原理详解(图文全面总结)

江南一点雨

极狐GitLab 足下科技,加速国产智驾操作系统的发展与普及

极狐GitLab

gitlab 智能驾驶 客户案例

大模型准确率从17%到90%!为什么提示词工程是今天最珍贵的技能?

本原智数

人工智能 大模型 生成式AI 提示词工程 本原智数

如何在IT项目管理中实现团队协作

爱吃小舅的鱼

项目管理 IT IT项目管理

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