React Hooks 04

React Hooks 04

useRef()

绑在 html 上保存 dom 节点

绑在组件上保存组件对象

代码:

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import React, {
useCallback,
useEffect,
useMemo,
useRef,
useState,
} from "react";

const ToDoList = () => {
// 初始化text与lists
// const [text, setText] = useState("");
const [lists, setLists] = useState([]);

const myText = useRef();

// const handleChange = useCallback((evt) => {
// setText(evt.target.value);
// }, []);

const handleClickAdd = useCallback(() => {
// dom节点
console.log(myText);
console.log(myText.current.value);
setLists([...lists, myText.current.value]);
// 不能使用push修改原数组,因为修改数组不会重新渲染页面
// setLists([...lists, text]);

// 清空input
// setText("");
myText.current.value = "";
}, [lists]);

const handleClickDelete = useCallback(
(index) => {
// 创建新数组接收lists
let newLists = [...lists];
// 根据id删除
newLists.splice(index, 1);
setLists(newLists);
},
[lists]
);

useEffect(() => {
// 当lists发生改变的时候打印 fuck 996
console.log("fuck 996");
}, [lists]);

// useeffect return
// useEffect(() => {
// window.onresize = () => {
// console.log("resize");
// };

// let timer = setInterval(() => {
// console.log("fuck");
// }, 1000);

// // 闭包
// return () => {
// console.log("组件销毁时执行");
// window.onresize = null;
// timer = clearInterval;
// };
// }, []);

// 给list增加996
// 没用memo的情况下,当别的状态改变的时候都重新触发该函数
// let list996 = lists.map((v) => {
// console.log("fuck");
// return v + "996";
// });

// 使用memo的情况下
// 只有当依赖中的lists发生改变的时候,才会重新计算
const list996 = useMemo(
() =>
lists.map((v) => {
return v + "996";
}),
[lists]
);

return (
<div>
<input ref={myText} />
<button onClick={handleClickAdd}>add to do list</button>

<div>
{list996.map((value, index) => {
return (
<div key={index}>
<div>{value}</div>
<button
onClick={() => {
handleClickDelete(index);
}}
>
delete
</button>
</div>
);
})}
</div>
</div>
);
};

export default ToDoList;