DingMing

丁大铭的个人空间,用来分享一些前端小技巧,默默成长吧,哈哈

React Hooks 使用

  |  
 阅读次数

2019年React Hooks是React生态圈里边最火的新特性了。它改变了原始的React类的开发方式,改用了函数形式;它改变了复杂的状态操作形式,让程序员用起来更轻松;它改变了一个状态组件的复用性,让组件的复用性大大增加。如果你是React的粉丝者或者正在使用React开发项目,你可以用1个小时时间看一下这篇文章(视频),你一定会有所收获,并在工作种能熟练的使用React Hooks。目前的大部分Hooks知识点,文章都涉及到。我想想你学完并使用Hooks后,会颠覆你现在的React开发方式,并爱上它。

useState的使用

useState是react自带的一个hook函数,它的作用是用来声明状态变量。

那我们从三个方面来看useState的用法,分别是声明、读取、使用(修改)。这三个方面掌握了,你基本也就会使用useState了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import React, { useState } from 'react';

let showSex = true
function Example2(){
const [ age , setAge ] = useState(18)
if(showSex){
const [ sex , setSex ] = useState('男')
showSex=false
}

const [ work , setWork ] = useState('前端程序员')
return (
<div>
<p>JSPang 今年:{age}岁</p>
<p>性别:{sex}</p>
<p>工作是:{work}</p>

</div>
)
}
export default Example2;

React useState和setState到底是同步还是异步呢?

  1. 在正常的react的事件流里(如onClick等)
  • setState和useState是异步执行的(不会立即更新state的结果)
  • 多次执行setState和useState,只会调用一次重新渲染render
  • 不同的是,setState会进行state的合并,而useState则不会
  1. 在setTimeout,Promise.then等异步事件中
  • setState和useState是同步执行的(立即更新state的结果)
  • 多次执行setState和useState,每一次的执行setState和useState,都会调用一次render

useEffect代替常用生命周期函数

useEffect函数来代替生命周期函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import React, { useState , useEffect } from 'react';
function Example(){
const [ count , setCount ] = useState(0);
//---关键代码---------start-------
useEffect(()=>{
console.log(`useEffect=>You clicked ${count} times`)
})
//---关键代码---------end-------

return (
<div>
<p>You clicked {count} times</p>
<button onClick={()=>{setCount(count+1)}}>click me</button>
</div>
)
}
export default Example;

useEffect两个注意点

  1. React首次渲染和之后的每次渲染都会调用一遍useEffect函数,而之前我们要用两个生命周期函数分别表示首次渲染(componentDidMonut)和更新导致的重新渲染(componentDidUpdate)。

  2. useEffect中定义的函数的执行不会阻碍浏览器更新视图,也就是说这些函数时异步执行的,而componentDidMonut和componentDidUpdate中的代码都是同步执行的。个人认为这个有好处也有坏处吧,比如我们要根据页面的大小,然后绘制当前弹出窗口的大小,如果时异步的就不好操作了。

useContext让父子组件传值更简单

有了useState和useEffect已经可以实现大部分的业务逻辑了,但是React Hooks中还是有很多好用的Hooks函数的,比如useContext和useReducer。

Context的作用就是对它所包含的组件树提供全局共享数据的一种技术。

createContext 函数创建context

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import React, { useState , createContext } from 'react';
//===关键代码
const CountContext = createContext()

function Example4(){
const [ count , setCount ] = useState(0);

return (
<div>
<p>You clicked {count} times</p>
<button onClick={()=>{setCount(count+1)}}>click me</button>
{/*======关键代码 */}
<CountContext.Provider value={count}>
</CountContext.Provider>

</div>
)
}
export default Example4;

useContext 接收上下文变量

已经有了上下文变量,剩下的就时如何接收了,接收这个直接使用useContext就可以,但是在使用前需要新进行引入useContext(不引入是没办法使用的)。

其实useContext的用法比以前时简单很多,既然简单,就没必要讲解的那么难,希望小伙伴这节课都能get到知识点,完善自己的知识体系。

1
2
3
4
5
6
7
8
9
10
11
import React, { useState , createContext , useContext } from 'react';

function Counter(){
const count = useContext(CountContext) //一句话就可以得到count
return (<h2>{count}</h2>)
}

<CountContext.Provider value={count}>
<Counter />
</CountContext.Provider>