React的新特性之Hook
Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。
Hook的含义:
Hook 这个单词的意思是"钩子"。
React Hooks 的意思是,组件尽量写成纯函数,如果需要外部功能和副作用,就用钩子把外部代码"钩"进来。 React Hooks 就是那些钩子。
【React的新特性之Hook】你需要什么功能,就使用什么钩子。React 默认提供了一些常用钩子,你也可以封装自己的钩子。
所有的钩子都是为函数引入外部功能,所以 React 约定,钩子一律使用use前缀命名,便于识别。你要使用 xxx 功能,钩子就命名为 usexxx。
Hook的优点
- 可以在不改变组件层级关系的前提下,方便的重用带状态的逻辑。
- 可以封装相关联的业务逻辑,让代码结构更加清晰。
- 可以在不引入 Class 的前提下,使用 React 的各种特性。
- 只在最顶层使用 Hook
- 只在 React 函数中调用 Hook
useState()用于为函数组件引入状态(state)。纯函数不能有状态,所以把状态放在钩子里面。
import React, { useState } from 'react';
function Count() {
// 声明一个叫 “count” 的 state 变量。
const [count, setCount] = useState(0);
return (
You clicked {count} times
);
}
上面代码中,Count组件是一个函数,内部使用useState()钩子引入状态。
useState()这个函数接受状态的初始值,作为参数,上例的初始值为0。该函数返回一个数组,数组的第一个成员是一个变量(示例代码中是count),指向状态的当前值。第二个成员是一个函数,用来更新状态,约定是set前缀加上状态的变量名(示例代码中是setCount)。
Effect Hook
useEffect()用来引入具有副作用的操作,最常见的就是向服务器请求数据。以前,放在componentDidMount里面的代码,现在可以放在useEffect()。
useEffect()的用法如下。
useEffect(()=>{
//一些操作
},[dependencies])
useEffect()接受两个参数。第一个参数是一个函数,异步操作的代码放在里面。第二个参数是一个数组,用于给出 Effect 的依赖项,只要这个数组发生变化,useEffect()就会执行。第二个参数可以省略,这时每次组件渲染时,就会执行useEffect()。
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// Similar to componentDidMount and componentDidUpdate:
useEffect(() => {
// Update the document title using the browser API
document.title = `You clicked ${count} times`;
});
return (
You clicked {count} times
);
}
Context Hook
如果需要在组件之间共享状态,可以使用useContext()。
现在有两个组件 One和 Two,我们希望它们之间共享状态。首先使用 React Context API,在组件外部建立一个 Context。
const AppContext = React.createContext({});
上面代码中,AppContext.Provider提供了一个 Context 对象,这个对象可以被子组件共享。
One 组件的代码如下:
const One =()=>{
const { username }=useContext(AppContext);
return(
我是第一个页面
{username}
);
}
上面代码中,useContext()钩子函数用来引入 Context 对象,从中获取username属性。
Two 组件的代码也类似:
const Two=()=>{
const { username }=useContext(AppContext)
return(
Two
我是第二个页面
{username}
);
}
自定义Hook
通过自定义 Hook,可以将组件逻辑提取到可重用的函数中。自定义 Hook 是一个函数,其名称以 “use” 开头,函数内部可以调用其他的 Hook。
示例:
import { useState, useEffect } from 'react';
function useFriendStatus(friendID) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);
};
});
return isOnline;
}
useFriendStatus 的 Hook 目的是订阅某个好友的在线状态。这就是我们需要将 friendID 作为参数,并返回这位好友的在线状态的原因。
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量