React的新特性 ---- Hooks ---- 的基本使用
一、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:
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 ---- 的基本使用的更多相关文章
- React劲爆新特性Hooks 重构去哪儿网火车票PWA
React劲爆新特性Hooks 重构去哪儿网火车票PWA 获取课程资料链接:点击这里获取 本课程先带你细数最近一年来React的新特性,如Hooks.Redux API,让你从头理解Hooks对传统R ...
- QQ音乐:React v16 新特性实践
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由QQ音乐技术团队发表于云+社区专栏 自从去年9月份 React 团队发布了 v16.0 版本开始,到18年3月刚发布的 v16.3 版 ...
- 使用React Hooks新特性useReducer、useContext替代传统Redux高阶组件案例
当我们使用redux进行数据管理的时候,一般都是在根组件通过Provider的方式引入store,然后在每个子组件中,通过connect的方式使用高阶组件进行连接,这样造成的一个问题是,大量的高阶组件 ...
- react新特性 react hooks
本文介绍的是react新特性react hooks,本文面向的是有一定react开发经验的小伙伴,如果你对react还不是很熟悉的话我建议你先学习react并多多联系. 首先我们都知道react有3种 ...
- 30分钟精通React今年最劲爆的新特性——React Hooks
你还在为该使用无状态组件(Function)还是有状态组件(Class)而烦恼吗? --拥有了hooks,你再也不需要写Class了,你的所有组件都将是Function. 你还在为搞不清使用哪个生命周 ...
- 关于为什么使用React新特性Hook的一些实践与浅见
前言 关于Hook的定义官方文档是这么说的: Hook 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性. 简单来说,就是在 ...
- react 16.8版本新特性以及对react开发的影响
Facebook团队对社区上的MVC框架都不太满意的情况下,开发了一套开源的前端框架react,于2013年发布第一个版本. react最开始倡导函数式编程,使用function以及内部方法React ...
- [译文]React v16(新特性)
[译文]React v16(新特性) 查看原文内容 我们很高兴的宣布React v16.0发布了! 这个版本有很多长期被使用者期待的功能,包括: fragments (返回片段类型) error bo ...
- React 16.x 新特性思维导图
React 16版本相对于以前的版本做了很大的改动,下面是我整理的React 16.x 新特性的思维导图文件,欢迎围观和指导:
随机推荐
- 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会
平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...
- 2. python Mac 安装 dlib
在macOS上: 从Mac App Store安装 XCode(或安装XCode命令行工具)(最低版本是:xcode8 以上) 有 homebrew 安装 有 CMAKE 安装 基础包 :numpy ...
- SpringBoot项目构建成jar运行后,如何正确读取resource下的文件
SpringBoot项目构建成jar运行后,如何正确读取resource下的文件 不管你使用的是SpringBoot 1.x还是SpringBoot2.x,在开Dev环境中使用eclipse.IEAD ...
- SSRS报表-级联筛选参数刷新后不能默认全选 -问题解决方案
好久没有写博客了,最近更新完善修复了SSRS报表的一些问题,和大家分享. 问题描述: 报表中,区域->专区->省份->地级市 此四个筛选参数是联动的,在DataSet中前一父级参数作 ...
- [原创]lvs+ospf+nginx实现高可用大流量web架构
lvs+ospf+nginx实现高可用大流量web架构配置总概述 架构图: 配置如下: .quagga之zebra配置: # cat /etc/quagga/zebra.conf ! ! Zebra ...
- Eclipse安装STS插件
由于Spring的配置文件较多,基于Eclipse配置也比较复杂.为了提高开发的效率,建议使用STS开发工具开发,或者在Eclipse安装一个STS插件. 在开发者配置bean的class时候能够根据 ...
- NOIP2018提高/普及成绩
明天就要出了,不忍看到自己爆零,现在很慌. 大家都考的如何呢?欢迎留言自己的分数或预估分数.
- Orleans 知多少 | 2. 核心概念一览
Orleans 术语解读 上面这张图中包含了Orleans中的几个核心概念: Grain Silo Orleans Cluster Orleans Client 从这张图,我们应该能理清他们之间的关系 ...
- MTSC2019第五届移动互联网测试开发大会PPT下载
关注公众号「软件测试大本营」后台回复「MTSC」或「测试开发大会」即可获取云盘下载地址及提取码. 注:PPT文件版权归相关撰写人所有,仅供学习交流,请勿用于任何商业用途,谢谢 前不久在北京举办了第五届 ...
- [分享] 一款极简单的 BaseEntity CRUD 方法
前言 尝试过 ado.net.dapper.ef,以及Repository仓储,甚至自己还写过生成器工具,以便做常规CRUD操作. 它们日常操作不方便之处: 每次使用前需要声明,再操作: 很多人一个实 ...