1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
import { Fragment, useState, useEffect, Component } from "react";
import Users from "./Users";
const DUMMY_USERS = [
{ id: "u1", name: "Max" },
{ id: "u2", name: "Manuel" },
{ id: "u3", name: "Julie" },
];
class UserFinder extends Component {
constructor() {
super();
this.state = {
filteredUsers: [],
searchTerm: "",
};
}
// 只會執行一次
componentDidMount() {
// Send http request...假想是從資料庫獲取DUMMY_USERS
this.setState({ filteredUsers: DUMMY_USERS });
}
// 更新狀態
componentDidUpdate(prevProps, prevState) {
// 需要加上判斷是否有變類似之前的callback
// 不然一樣因為資料更新,重新渲染,再次觸發資料更新會重複循環
if (prevState.searchTerm !== this.state.searchTerm) {
this.setState({
filteredUsers: DUMMY_USERS.filter((user) =>
user.name.includes(this.state.searchTerm)
),
});
}
}
// 搜尋字詞
searchChangeHandler(event) {
this.setState({ searchTerm: event.target.value });
}
render() {
return (
<Fragment>
<div className={classes.finder}>
// 元件綁定上面方法
<input type='search' onChange={this.searchChangeHandler.bind(this)} />
</div>
<Users users={this.state.filteredUsers} />
</Fragment>
);
}
}
// const UserFinder = () => {
// const [filteredUsers, setFilteredUsers] = useState(DUMMY_USERS);
// const [searchTerm, setSearchTerm] = useState('');
// useEffect(() => {
// setFilteredUsers(
// DUMMY_USERS.filter((user) => user.name.includes(searchTerm))
// );
// }, [searchTerm]);
// const searchChangeHandler = (event) => {
// setSearchTerm(event.target.value);
// };
// return (
// <Fragment>
// <div className={classes.finder}>
// <input type='search' onChange={searchChangeHandler} />
// </div>
// <Users users={filteredUsers} />
// </Fragment>
// );
// };
export default UserFinder;
|