Hook
https://reactjs.bootcss.com/docs/hooks-intro.html
1. react的函数式组件和class类组件的区别,class类组件具有私有数据和生命周期函数,而函数式组件没有,但是react为函数式组件提供了Hook函数,让原本不具备私有数据和生命周期的函数式组件具备类组件的私有数据和生命周期,还是觉得类组件好点
2. Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。
3. Hook 是一些可以让你在函数组件里“钩入” React state 及生命周期等特性的函数。Hook 不能在 class 组件中使用 —— 这使得你不使用 class 也能使用 React。
State Hook
useState本身是(react提供的方法)一个从React对象上解构出来的函数,当我们给它传入一个参数是,它会返回一个数组 [‘传入的参数’, ‘函数’], 数组的第一项是传入的参数,第二项是一个函数,这个函数类似于class组件中修改setstate( )方法,调用这个函数可以修改初始定义的值
当你想要有多个初始值的时候,那就多定义几个吧,react官方也是这样说的,其实在参数的可以写成对象的形式,但是调用方法的时候就不好了
import React, { useState } from "react"; function List() { console.log(useState(0), "useState"); // 声明一个新的叫做 “count” 的 state 变量 const [count, setCount] = useState("hook参数"); // console.log(count) return ( <div> <div}>函数式组件使用hook,具备类组件的功能 -- {count}</div> // 读取的话值直接这样写变量名就行 <button onClick={() => {setCount(count + "6666666")}}>hook改变数据</button> </div> ); } export default List;
Effect Hook(副作用)
- https://reactjs.bootcss.com/docs/hooks-effect.html
- useEffect相当于:componentDidMount,componentDidUpdate,componentWillUnmount的结合体
- 将
useEffect
放在组件内部让我们可以在 effect 中直接访问count
state 变量(或其他 props),当这个变量改变时相当于组件本身改变 - 在函数式组件中,因为没有生命周期的缘故,Hook提供了 effect 用来监听组件的状态,当页面挂载和更新时,触发
useEffect
(cb, []),的第一个参数是一个回调函数,第二个参数可有可无是一个数组,当组件挂载,更新,卸载的时候会执行,当组件卸载的时候,第一个回调函数需要
return一个函数,在函数内部执行
1 import React, { useState, useEffect } from "react"; 3 import Delete from "./Delete.jsx" 6 export default function List() { 7 // 声明一个新的叫做 “count” 的 state 变量 8 const [count, setCount] = useState(0); 9 const [name, setName] = useState("范顺"); 10 const [flag, changeFlag] = useState(true); 11 12 useEffect(() => { // 组件挂载和更新 13 console.log("组件挂载和更新"); 14 }); 15 16 useEffect(() => { 17 console.log("count组件更新"); 18 }, [count]); 19 20 useEffect(() => { 21 console.log("name组件更新"); 22 }, [name]); 23 24 // 只希望在组件挂载后做某些事情 componentDidMount 25 useEffect(() => { 26 // 组件挂载后执行 27 console.log("组件挂载后执行"); 28 }, []); // 第二个参数为空数组 29 30 return ( 31 <div> 32 <div>姓名:{name} </div> 33 <div>函数式组件 加 {count}</div> 34 <button 35 onClick={() => { 36 setCount(count + 1); 37 }} 38 > 39 useState 40 </button> 41 <br /> 42 <br /> 43 <br /> 44 { flag ? <Delete></Delete> : ''} 45 <button onClick={() => {changeFlag(!flag)}}>{flag ? "卸载" : "加载"}</button> 46 </div> 47 ); 48 }
1 export default function Delete() { 2 useEffect(() => { 3 // 组件挂载和更新 4 console.log("useEffect组件挂载"); 5 return () => { // 当前组件卸载的时候,第一个回调函数内部接收retu闰年一个函数 6 console.log("useEffect组件卸载"); 7 }; 8 }); 9 return <div>useEffect的第二个参数</div>; 10 }
useRef Hook (获取dom元素,侦听useState的值)
- 获取dom元素
- 获取改变的之前useState的数据,然后做一些事情
1 import React, { useState, useEffect, useRef } from "react"; 2 3 export default function Delete() { 4 const [name, setName] = useState("范顺"); 5 const ref = useRef(null); // 函数式组件使用Hook提供的useRef,获取dom节点 6 const flag = useRef(false); 7 const changeref = useRef({ name }); 8 useEffect(() => { 9 // 组件挂载和更新 10 console.log(ref.current, "useRef"); // 获取dom元素 11 console.log(changeref.current, name, "改变了name"); 12 13 changeref.current = { 14 name 15 } 16 }); 17 return ( 18 <div> 19 <input 20 type="text" 21 value={name} 22 onChange={(e) => { 23 setName(e.target.value); 24 }} 25 /> 26 {name} 27 <div ref={ref}>useEffect的第二个参数</div> 28 </div> 29 ); 30 }