用React Hooks做一个搜索栏
本文最初发布于 Hackernoon 博客,经原作者授权由 InfoQ 中文站翻译并分享。
以下是我们将要构建的搜索框的动图。这是一个简单的搜索框,我们可以用它来搜索联系人列表。我们将使用函数式组件,而不是基于类的组件来实现它。
npx create-react-app contacts-list
code .
在 src 目录中创建一个名为 components 的新文件夹,并在其中创建一个 Numbers.js 文件。转到你的 App.js 文件并导入 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}
<span>{person.number}</span>
</li>
</div>
))}
</div>
);
};
最后,每次更新时,我们都会从 FilterDisplay 返回更新的信息。如果你和我一样想将搜索栏分成一个单独的组件,请继续看下去。下面我们来重构这个东西!将搜索拆分成一个单独的组件后,我们就可以在应用程序的其他组件中使用同样的搜索栏了。
import React from "react";
export const Filter = ({ value, handleChange }) => {
return (
<div>
filter: <input value={value} onChange={handleChange} />
</div>
);
};
import React from "react";
export const Numbers = ({ persons }) => {
return (
<div>
<hl>Numbers</hl>
{person.map((person, i) => (
<div key={i}>
<li>
{person.name}
<span>{person.number}</span>
</li>
</div>
))}
</div>
);
};
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 数组,否则我们根据在输入字段中输入的内容渲染列表。就是这样,搞定!
https://hackernoon.com/how-to-build-a-search-bar-in-react-with-react-hooks-o77l3yl7
作为一名前端工程师,需要具备哪些核心技能?
前手机淘宝前端工程师负责人 winter 认为,最核心的能力包括编程能力、架构能力和工程能力。
编程能力,就是用代码解决问题的能力;
架构能力,就是掌控复杂系统的能力;
工程能力,其实核心就是成事的能力。
这三项能力可以说都是从初级、中级走向高级必须要跨越的鸿沟,怎么系统性提高呢?这里推荐给你 「极客时间前端工程师系列课程」 ,对标阿里 P5-P8 前端工程师技能,从前端工程师到高级前端专家都可以找到适合自己的课程。现在企业都可以免费学习,扫码领课↓