一、react-hooks概念

  React中一切皆为组件,React中组件分为类组件和函数组件,在React中如果需要记录一个组件的状态的时候,那么这个组件必须是类组件。那么能否让函数组件拥有类组件的功能?这个时候我们就需要使用hooks。

  Hooks让我们的函数组件拥有了类似类组件的特性,Hook是React16.8中新增的功能,它们允许您在不编写类的情况下使用状态和其他React功能

二、为什么React中需要类组件

  1、需要记录当前组件的状态
  2、需要使用组件的一些生命周期函数

三、类组件与Hooks简单对比

  类组件

import React from "react"

export default class App extends React.Component{
constructor(){
super();
this.state = {
count:0
}
this.handleClick = this.handleClick.bind(this);
}
render(){
let {count} = this.state;
return (
<div>
<h2>{count}</h2>
<button onClick={this.handleClick}>修改</button>
</div>
)
}
handleClick(){
this.setState({
count:this.state.count+1
})
}
}

  hooks

import React,{useState} from "react";

export default ()=>{
let [count,setCount] = useState(0);
let handleAdd = ()=>setCount(count+1);
return (
<div>
<h2>{count}</h2>
<button onClick={handleAdd}>点击</button>
</div>
)
}

二者对比之后是不是感觉Hooks简单好多了?那么接下来我们来学习Hooks

四、Hooks基本使用

  1、Hooks常用的方法
    useState 、useEffect 、useContext以上三个是hooks经常会用到的一些方法

  2、useState
    useState是react自带的一个hook函数,它的作用就是用来声明状态变量.useState这个函数接收的参数是我们的状态初始值,它返回了一个数组,这个数组的第 [0]项是当

前当前的状态值,第 [1]项是可以改变状态值的方法函数。

import React,{useState} from "react"

export default ()=>{
let [count,setCount] = useState(0);
let addCount = ()=>setCount(count+1);
return (
<div>
<h2>{count}</h2>
<button onClick={addCount}>点击</button>
</div>
)
}

  useState : 创建一个状态,这个状态为0
  count : 代表当前状态值也就是0
  setCount : 更新状态的函数
  addCount = ()=>setCount(count+1);调用setCount就可以用来修改状态

  2-1、useState返回的是什么?

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

const state = useState(0);
const count = state[0];
const setCount = state[1]

  注意:

    1、useState一定要写在函数初始的位置不能在循环或判断语句等里面调用,这样是为了让我们的 Hooks 在每次渲染的时候都会按照 相同的顺序 调用,因为这里有一个关键的问题,那就是 useState 需要依赖参照第一次渲染的调用顺序来匹配对于的state,否则 useState 会无法正确返回它对于的state

    2、我们可以在一个函数组件中使用多个

export default ()=>{
let [count,setCount] = useState(0);
let [count,setCount] = useState(0);
let [count,setCount] = useState(0); }

五、useEffect基本使用
  我们写的有状态组件,通常会产生很多的副作用(side effect),比如发起ajax请求获取数据,添加一些监听的注册和取消注册,手动修改dom等等。我们之前都把这些副作用的函数写在生命周期函数钩子里,比如componentDidMount,componentDidUpdate和componentWillUnmount。而现在的useEffect就相当与这些声明周期函数钩子的集合体。它以一抵三。

            (useEffect = componentDidMount + componentDidUpdate+componentWillUnmount)

  5-1、useEffect
    useEffect中有两个参数,第一个参数是一个函数,第二个参数是一个依赖的数据。第二个参数用来决定是否执行里面的操作,可以避免一些不必要的性能损失,只要第二个参数中的成员的值没有改变,就会跳过此次执行。如果传入一个空数组 [ ],那么该effect 只会在组件 mount 和 unmount 时期执行。

  5-2、useEffect模拟componentDidMount && componentDidUpdate

import React,{useState,useEffect} from "react"

export default ()=>{
let [title,setTitle] = useState(0);
let updateTitle = ()=>setTitle(title+1);
return (
<div>
<h2>{title}</h2>
<button onClick={updateTitle}>点击</button>
</div>
) //参数是一个函数 每次mount 或者 update都会调用当前函数
useEffect(()=>{
document.title = `页面为${count}`;
}) }

  

  5-3、如何只在componentDidMount中执行

import React,{useState,useEffect} from "react"

export default ()=>{
let [title,setTitle] = useState(0);
let updateTitle = ()=>setTitle(title+1);
return (
<div>
<h2>{title}</h2>
<button onClick={updateTitle}>点击</button>
</div>
) //将第二个参数设置为一个空数组则只会在componentDidMount中执行
useEffect(()=>{
document.title = `页面为${count}`;
},[]) }

  5-2、useEffect模拟componentWillUnMount
  useEffect 中还可以通过让函数返回一个函数来进行一些清理操作,比如取消订阅等

useEffect = (()=>{
return ()=>{
//unmount时调用这里
document.removeEventListener();
}
},[])

四、useEffect 什么时候执行? 

  它会在组件 mount 和 unmount 以及每次重新渲染的时候都会执行,也就是会在 componentDidMount、componentDidUpdate、componentWillUnmount 这三个时期执行

五、hooks的好处
  面向生命周期编程变成了面向业务逻辑编程

【react】---Hooks的基本使用---【巷子】的更多相关文章

  1. 通过 React Hooks 声明式地使用 setInterval

    本文由云+社区发表 作者:Dan Abramov 接触 React Hooks 一定时间的你,也许会碰到一个神奇的问题: setInterval 用起来没你想的简单. Ryan Florence 在他 ...

  2. 初探React Hooks & SSR改造

    Hooks React v16.8 发布了 Hooks,其主要是解决跨组件.组件复用的状态管理问题. 在 class 中组件的状态封装在对象中,然后通过单向数据流来组织组件间的状态交互.这种模式下,跨 ...

  3. React hooks实践

    前言 最近要对旧的项目进行重构,统一使用全新的react技术栈.同时,我们也决定尝试使用React hooks来进行开发,但是,由于React hooks崇尚的是使用(也只能使用)function c ...

  4. 理解 React Hooks

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由志航发表于云+社区专栏 TL;DR 一句话总结 React Hooks 就是在 react 函数组件中,也可以使用类组件(classe ...

  5. React Hooks新特性学习随笔

    React Hooks 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性. 前言 本篇主要以讲几个常用的api为主. 1.u ...

  6. 关于React Hooks,你不得不知的事

    React Hooks是React 16.8发布以来最吸引人的特性之一.在开始介绍React Hooks之前,让咱们先来理解一下什么是hooks.wikipedia是这样给hook下定义的: In c ...

  7. react hooks 全面转换攻略(三) 全局存储解决方案

    针对 react hooks 的新版本解决方案 一.redux维持原方案 若想要无缝使用原来的 redux,和其配套的中间件 promise,thunk,saga 等等的话 可以使用 redux-re ...

  8. react新特性 react hooks

    本文介绍的是react新特性react hooks,本文面向的是有一定react开发经验的小伙伴,如果你对react还不是很熟悉的话我建议你先学习react并多多联系. 首先我们都知道react有3种 ...

  9. 30分钟精通React今年最劲爆的新特性——React Hooks

    你还在为该使用无状态组件(Function)还是有状态组件(Class)而烦恼吗? --拥有了hooks,你再也不需要写Class了,你的所有组件都将是Function. 你还在为搞不清使用哪个生命周 ...

  10. React Hooks 深入系列 —— 设计模式

    本文是 React Hooks 深入系列的后续.此篇详细介绍了 Hooks 相对 class 的优势所在, 并介绍了相关 api 的设计思想, 同时对 Hooks 如何对齐 class 的生命周期钩子 ...

随机推荐

  1. vi 编辑器使用指南

    一.Unix编辑器概述编辑器是使用计算机的重要工具之一,在各种操作系统中,编辑器都是必不可少的部件.Unix及其相似的ix操作系统系列中,为方便各种用户在各个不同的环境中使用,提供了一系列的ex编辑器 ...

  2. gradle打成jar包报错 "错误: 找不到或无法加载主类 App"(已经配置过主类)

    文章目录 将gradle打成jar包(包括依赖) 运行jar包 报错 原因(src自己手动创建的) 解决(添加src目录) 将gradle打成jar包(包括依赖) jar { manifest { a ...

  3. js实现图片预览、压缩、上传

    先看几个对象:Blob.ArrayBuffer.File.fileReader.formData 详细解释请参考:https://www.cnblogs.com/youhong/p/10875190. ...

  4. PHP 原生上传图片

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> < ...

  5. QT5.2 Assistant-设置应用程序图标

       在Qt助手(assistant.exe)搜索关键字"Setting the Application Icon"就可以看到在各种平台设置Qt程序图标的方法,包括QT支持的Win ...

  6. 新浪sina邮箱客户端配置

    接收协议:IMAP 接收邮箱服务器地址:imap.sina.com 端口:993 加密方法:TLS 发送协议:SMTP 发送服务器:smtp.sina.com 端口:465 加密方法:TLS

  7. 修改maven包本地默认位置

    前言 这段时间上岸了,就有时间整理电脑的资料(强迫症重度患者),就向maven以及gradle的仓库位置动手了. 目的 改变maven的默认位置 步骤 修改maven的配置文件setting.xml( ...

  8. Activiti获取当前活动(任务)的出口(动态生成提交按钮)

    1.设置出口变量 当一个任务有一个或多个出口时,可以在出口连线出设置判断条件如图: 2.根据任务Id获取出口集合 public List<String> getOutGoingTransN ...

  9. 记录ajax前后交互

    前台请求 $.ajax({ url : '/turn', type : "post", data : { "userName":userName, " ...

  10. 【JDK1.8】Java 栈实现方式

    看到一道面试题,问Java中栈的实现方式,记录下一些实现细节. API中有5个方法,分别是: boolean empty() E peek() E pop() E push() int search( ...