输入搜索词(名称,电子邮件,用户名)时,我希望页面根据搜索值从所有卡中过滤出一张卡。我认为,当用户按下Enter键时,我们将需要重定向到新页面以显示卡片。
我有searchbar和用户组件的代码,这些代码将负责显示单个用户卡。我们是否需要使用react-router的Redirect功能来实现这一点?我一直在努力如何实现它,因为还需要将props(searchItem)传递给User组件。
Searchbar.jsx
import React, { useState } from "react";
import UserList from "./UserList";
import User from "./Components/User";
import { Link, Redirect } from "react-router-dom";
const SearchBar = () => {
const [searchItem, setSearchItem] = useState("");
const handleChange = (e) => {
console.log(e.target.value);
setSearchItem(e.target.value);
};
const handleSubmit = (e) => {
e.preventDefault();
setSearchItem("");
};
return (
<>
<div className="searchbar">
<form onSubmit={handleSubmit}>
<input
name="name"
placeholder="Enter Name, Email or Username to Search"
type="text"
className="search"
value={searchItem}
onChange={handleChange}
/>
</form>
</div>
<UserList />
</>
);
};
export default SearchBar;
User.jsx
import React from "react";
import Card from "./Card";
const User = (props) => {
return (
<Card
key={props.id}
name={props.name}
email={props.email}
website={props.website}
phone={props.phone}
/>
);
};
export default User;
UserList.jsx
import React, { useState, useEffect } from "react";
import Card from "./Components/Card";
const UserList = ({ searchItem }) => {
const [data, setData] = useState([]);
useEffect(() => {
fetch("https://jsonplaceholder.typicode.com/users")
.then((response) => response.json())
.then((json) => {
console.log(json);
const newData = json.map((object) => ({
id: object.id,
email: object.email,
website: object.website,
phone: object.phone,
name: object.name,
}));
// previousData is an empty array and the newData consists of all the users
// using the spread operator, we copy the newData into the previousData
setData((previousData) => [...previousData, ...newData]);
});
}, []);
return (
<>
<div className="container">
{data.map((info) => {
return (
<Card
key={info.id}
name={info.name}
email={info.email}
website={info.website}
phone={info.phone}
/>
);
})}
</div>
</>
);
};
export default UserList;
我认为您无需在此处使用react-router即可实现此目的。
您想要的搜索类型决定了您可以采用的方法。您是要在每次按键时还是仅在表单提交时对卡片进行过滤?
当前,您将这两种方法混合使用,因为您的form
元素带有onSubmit
,但您的input
元素也带有onChange
(不受控制和受控)。
这是实时搜索,受控组件方法的简化示例:
const User = (props) => {
return <p>{props.name}</p>;
};
const UserList = ({ searchItem }) => {
const [data, setData] = useState([]);
useEffect(() => {
fetch("https://jsonplaceholder.typicode.com/users")
.then((response) => response.json())
.then((json) => {
console.log(json);
const newData = json.map((object) => ({
id: object.id,
email: object.email,
website: object.website,
phone: object.phone,
name: object.name,
}));
setData(newData);
});
}, []);
const filteredUsers = data.filter((user) => {
return user.name.includes(searchItem);
});
return filteredUsers.map((user) => {
return <User key={user.id} name={user.name} />;
});
};
const SearchBar = () => {
const [searchItem, setSearchItem] = useState("");
const handleChange = (e) => {
console.log(e.target.value);
setSearchItem(e.target.value);
};
return (
<>
<div className="searchbar">
<form onSubmit={(e) => e.preventDefault()}>
<input
name="name"
placeholder="Enter Name, Email or Username to Search"
type="text"
className="search"
value={searchItem}
onChange={handleChange}
/>
</form>
</div>
<UserList searchItem={searchItem} />
</>
);
};
对于不受控制的方法,过滤器提示可以保持不变,但是您可以删除上的value
和onChange
道具,input
并使用handleSubmit
函数来设置searchItem
。要获得输入的值,您需要使用此方法使用ref。见这以获取更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句