react中hook介绍以及使用教程

前言

最近由于公司的项目开发,就学习了在react关于hook的使用,对其有个基本的认识以及如何在项目中去应用hook。在这篇博客中主要从以下的几个点进行介绍:

  • hook简介
  • hook中常用api的使用
  • hook在使用过程中需要去注意的地方
  • hook中怎样去实现class组件中的声明周期函数

hook

首先介绍关于hook的含义,以及其所要去面对的一些场景

含义:Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。简单来说就是可以使用函数组件去使用react中的一些特性

所要解决的问题:

  • 解决组件之间复用状态逻辑很难得问题,hook能解决的就是在你无需修改之前组件结构的情况下复用状态逻辑,在不使用hook的情况下,需要使用到一些高级的用法如高级组件、provider、customer等,这种方式对于新手来说不太友好,可能在理解上就比较的困难
  • 对于复杂组件可以去拆分其逻辑,例如在你使用生命周期函数时,不同的生命周期需要在不同的时刻进行,因此在此时对于复杂的组件来说,有的生命周期函数中就存在大量的逻辑,在可读性上面就大打折扣。当使用hook时,就可以进行组件逻辑的划分,将相同的逻辑给整合在一起,这样就大大增加可读性也在一方面利于维护
  • 不需要对于class组件的理解,当你在最初去学习时,你不得不去理解this这个关键字,在当前组件所表示的含义,但是在hook中就不需要。能够解决你在不使用class组件的情况下去体现react的特性
  • 需要注意的一点就是hook和class组件是不能够同时使用的,在实际的使用过程中一定要注意,否则就会出现报错

那么接下来所要介绍的部分就是如何去使用hook

state hook

对于使用过class组件的同学,相信对于state肯定有很深的印象,对于一些需要用到的全局变量,在class组件中我们常常采用的方式是this.state = {},但是在hook中我们采用的方式就是使用useState这个hook,然后就可以对这种全局变量进行引用,在引用时只需要用其变量名即可,这里就拿官网的例子来举例:
import React, { useState } from 'react';

import React, { useState } from 'react';

function Example() {
 // 声明一个叫 "count" 的 state 变量
 const [count, setCount] = useState(0);

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

在上面的这个例子中,我们设置变量方式采用的就是const [count, setCount] = useState(0)这种方式,其中的0就是给count赋初值为0,如果想要给count赋值为一个空对象,那么只需要const [count, setCount] = useState({}),这样的方式就行了,那么这样你在用count时,此时获取到的值就为一个空对象。

作用:返回一个state,以及更新state的函数

  1. 函数式更新:新的state需要通过使用先前的state计算得出,将函数传递给setState,该函数将接收先前的state,并返回一个更新后的值
  2. 惰性初始state,initialState参数只会在组件的初始渲染中起作用,如果初始化state需要通过一个复杂计算来获取,则可以传入一个函数,在函数中计算并返回初始的state,此函数只在初始渲染时被掉用,如下所示:
 const [state, setState] = useState(() => {
  const initialState = someExpensiveComputation(props);
  return initialState;
 })

在hook中如何给全局变量设置值

在class组件中我们给放在state中的变量赋值时,通常采用的方式就是this.setState()这种方式,那么在hook中所要采用的就是set+变量名这种方式,如

const [count, setCount] = useState(0)

在这里通过上面我们已经知道的就是count能够获取到值,那么其所对应的setCount(值),这种赋值的方式就是给count变量赋值的,然后通过count就能够获取到值。

  • 为什么要采用这种方式呢?
  • 原因:是因为react中的单向数据源,这样的话,能够保证你的数据源流向会更加的清楚,这也是react所区别于vue中双向数据源绑定的一点

hook中设置多个全局变量的方式

在hook中,如果我们需要去设置多个类似于上面所说的count,那么就需要多次使用useState这个hook,当然你也可以设置一个变量在hook的最外部,即在hook这个函数组件的外部。需要注意的是别在整个hook这个函数的全局设置,因此在hook的运行机制中,在每次加载时,都会从新去加载里面的变量,因此你是不能够去获取到在整个函数内部中使用该变量所改变的值的,能够获取到的就只是这个变量的初始值*

useEffect hook

对于useEffect hook,其用途类似于class组件中的生命周期函数,用来处理在一些特定时刻需要去做的事情,这种事情常被叫做副作用。在使用useEffect这个hook时,需要注意的一点就是其不能够被包含在循环,判断语句中,否则项目会出现报错,这也是hook的一种设置机制

  • 副作用的划分:

    • 不需要清除的: 在React更新DOM之后运行一些额外的代码:如:发送网络请求,手动变更DOM,记录日志等
    • 需要清除的:当使用外部数据源时,需要去清除数据,如:定时器,需要我们在结束的时候去清除
  • 渲染时机:在使用useEffect这个hook时,需要注意的就是其渲染的时机,默认情况下会在第一次渲染和每一次更新时去执行。对于如何去控制这个渲染时机,在下面的一个部分会有详细的介绍
  • 作用:告诉组件在渲染之后执行某些操作
  • useEffect放在组件内部调用的原因:可以在effect中直接访问state中的变量
  • effect返回函数:effect可选的清除机制,每个effect都可以返回一个清除函数
  • 接收内容:一个包含命令式、并且可能有副作用代码的函数
  • 清除effect:实现方式,effect函数需要返回一个清除函数
  • effect执行时机:在浏览器完成布局和绘制之后,传给useEffect的函数会延迟调用,因此不应该在函数中执行足赛浏览器更新屏幕的操作。
  • 默认条件执行:会在每轮组件渲染完成后执行,因而一旦effect的依赖发生变化,他就会被重新创建。要改变其执行时机,需要给useEffect传递第二个参数,只有当第二个参数值发生改变才会重新创建订阅。如果要使用这个优化的方式,需要确保数组包含了所有外部作用域中会发发生变化,且在effect中使用的变量。如果只想运行一次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 (
  <div>
   <p>You clicked {count} times</p>
   <button onClick={() => setCount(count + 1)}>
    Click me
   </button>
  </div>
 );
}

在上面的这段代码中,就使用到了useEffect这个hook,在每次count值改变时,就会在页面中去打印“You clicked ${count} times”这段文字,当然count肯定对应的就是其所对应的值。

useEffect去取代calss中的生命周期函数的方式

react中有状态组件中,其生命周期函数的各个阶段

  1. 在Mounting阶段

    1. constructor()
    2. static getDerivedStateFromProps()
    3. render()
    4. componentDidMount()
  2. Updating
    1. static getDerivedStateFormProps
    2. shouldComponentUpdate()
    3. render()
    4. getSnapshotBeforeUpdate()
    5. componentDidUpdate()
  3. UnMouting
    1. componentWillUnmount()

使用hook去代替生命周期函数的方式

这里就介绍了关于useEffect这个hook的使用,有一些生命周期函数就是通过该hook来实现的,这里推荐一篇文章https://blog.logrocket.com/guide-to-react-useeffect-hook/,可以参考下。这里是在参考了一些文章后写的,具体介绍如下:

constructor: 可以通过useState来初始化state

componentDidMount(),在hook中需要使用下面的这种方式去取代,在useEffect中传递第二个参数,该参数为一个空数组,只会去执行一次,如下面所示

useEffect(() => {

},[])

componentDidUpdate(),有两种方式去解决

在每次渲染的时候都去调用hooks,解决的方式如下面所示

  useEffect(() => {

  })

用一个特殊变量的去触发hook,如下面所示,count指的就是这个特殊的变量,该hook触发,只会是count的值改变时

  useEffect(() => {

  },[count])

componentWillUnmount(),用hook来代替,需要去return一个callback(回调函数),如下面的形式所示

  useEffect(() => {
    return () => {
      //执行的为componentWillUnmount
    }
  },[])

shouldComponentUpdata(),常使用React.memo来代替,在默认情况下,它将对props对象中的复杂对象进行浅层比较,如果想要去控制比较,可以去提供一个自定义的比较函数作为第二个参数。代替hook的方式如下所示

  import React from 'react'
  function areEqual(prevProps, nextProps) {
  /*
  return true if passing nextProps to render would return
  the same result as passing prevProps to render,
  otherwise return false
  */
  }
  const Weather = ({weather}) => {
    return (<div>
        <p>{weather.city}</p>
        <p>{weather.temperature}</p>
        {console.log('Render')}
        </div>
    )
  }

  export default React.memo(Weather, areEqual)

自定义hook

通常在实际的项目开发中少不了使这种自定义的hook,前提是在整个项目中使用了hook的情况下。通常情况下就是去使用useState,useEffect这种系统已经定义好的hook去实现,在调用时你就可以直接调用当你自定义好的hook来实现你所需要的功能。下面就以自定义useReducer这个hook为例

import React, { useEffect } from 'react'

function useReducer(reducer, initialState) {
 const [state, setState] = useState(initialState);

 function dispatch(action) {
  const nextState = reducer(state, action);
  setState(nextState);
 }

 return [state, dispatch];
}
export default useReducer

在上面的这个实际例子中,我们封装了一个自定义的useReducerhook,我们可以调用这个hook去完成与reducer一样的功能了,在调用是就需要我们去传入两个参数,一个就是reducer,另外一个就是initialState,然后就能够取得state,以及dispatch方法。注意这里的返回值使用的是一个数组,这样的好处就是我们在获取其返回值时,可以采用数组结构这种方式来获取。具体关于数组的结构可以去看看es6中的部分,就能够明白了。那么接下来就是使用这个自定义好的useReducer。使用方式如下

import useReducer form '你封装useRecuer的组件中'
function Todos() {
const todosReducer = ( state, dispatch) => {
	if(dispatch.type == "") { //type值为什么时去执行
		const newState == "" //执行一些操作,去更新state
		return newState //返回新的neState
	}
}
 const [todos, dispatch] = useReducer(todosReducer, []);
 function handleAddClick(text) {
  dispatch({ type: 'add', text });
 }

 return (
	<div></div>
)
}

这里并没有把实际的使用情况给写完,剩余的可以自己去补充,其使用方式就和redux的使用方式相同。这就是整个自定义hook以及去使用的过程,在实际的开发中可以去体验体验。

额外的hook

useReducer,能给那些会出发深更新的组件做性能优化,因为可以向子组件去传递dispatch而不是回调

useReducer这个hook的封装,整个封装的方法如下:

//reducer hook封装
  import { useState } from 'react';
  export default useReducer function(reducer, initialState) {
    const [state, setState] = useState(initialState);
    function dispatch(action){
      const nextState = reducer(state, action);
      return setState(nextState);
    }
    return [state, dispatch]
  }
//实际例子使用
  import useReducer from '';
  const initialState = {count: 0};
  function reducer(state, action) {
  switch (action.type) {
    case 'increment':
    return {count: state.count + 1};
    case 'decrement':
    return {count: state.count - 1};
    default:
    throw new Error();
  }
  }
  return (
    <div>
      Count: {state.count}
      <button onClick={() => dispatch({type: 'devrement'})}>-</button>
      <button onClick={() => dispatch({type: 'increment'})}>+</button>
    </div>
  )

useReducer的惰性初始化,可以选择惰性地创建初始化state。因此需要设置一个初始化函数作为useReducer的第三个参数传入,这样初始化state将设置为init(initialArg),如下所示,就是一个实际的案例在useReducer中去传递第三个参数

function init(initialCount) {
 return {count: initialCount};
}

function reducer(state, action) {
 switch (action.type) {
  case 'increment':
   return {count: state.count + 1};
  case 'decrement':
   return {count: state.count - 1};
  case 'reset':
   return init(action.payload);
  default:
   throw new Error();
 }
}

function Counter({initialCount}) {
 const [state, dispatch] = useReducer(reducer, initialCount, init);
 return (
  <>
   Count: {state.count}
   <button
    onClick={() => dispatch({type: 'reset', payload: initialCount})}>
    Reset
   </button>
   <button onClick={() => dispatch({type: 'decrement'})}>-</button>
   <button onClick={() => dispatch({type: 'increment'})}>+</button>
  </>
 );
}

注意:如果reducer hook的返回值与当前state相同,react将跳过子组件的渲染及副作用的执行

useCallback

返回值:返回一个memoized回调函数,该回调函数仅在某给依赖项改变时才会更新。

含义:把内联回调函数及其依赖项数组作为参数传入useCallback,它将返回该回调函数传递给经过优化的并使用引用相等性去避免非必要渲染

useCallBack(fn, deps)相当与useMemo(() => fn,deps)

useMemo

使用方式:const memoziedValue = useMemo(() => computeExpensiveValue(a,b), [a, b])

返回值:返回一个memoized值,把创建函数和依赖项数组作为参数传入useMemo,仅在某个依赖项改变时才重新计算memoized值。

好处:这种优化有助于避免在每次渲染时都进行高开销的计算

渲染方式:传入useMemo的函数会在渲染期间执行,不要在这个函数内部执行与渲染无关的操作,如属于useEffect中的副作用。如果没有,那么新的值将会在每次渲染时被重新渲染

注意:依赖项数组不会作为参数传递给函数,概述来说,就是每一个出现在函数中的参数也应该出现在依赖项的数组中

useRef

使用方式: const refContainer = useref(initialValue);

返回值:返回一个可ref对象,其.current属性被初始化为传入的参数(initialValue)。这返回的的对象将在组件的整个生命周期中持续

含义: useRef就像是一个盒子可以将.current中得可变属性给保存起来

ref与useRef的区别在于,后者是创建的了一个普通的js对象,useRef和自建一个{current: …。}对象的唯一区别是,useRef会在每次渲染时,返回同一个ref对象

useImperativeHandle

作用:可以在使用ref时自定义暴露给赋组件的实例值,使用的形式如下:

useImperativeHandle(ref, createHandle, [deps])

useLayoutEffect

更新时机:在浏览器执行下一次绘制前去执行

与useEffect相同,会在所有的DOM变更之后同步调用effect

useDebugValue

作用:在react devTools中常被用于去当作展示标签,作为客户端的钩子

hooks中的性能优化

在hook中,其性能优化的点很多,这个可以在一些https://react.docschina.org/docs/hooks-faq.html#performance-optimizations去学习,下面是我看的一部分。

如何在更新时去跳过effect,可以采用条件式方式,即在useEffect中去传递第二个参数

由于某些原因,无法将一个函数移动到effect内部时,可采用下面方式

  1. 尝试将函数移动到当前组件的外部
  2. 如果所调用对策方法是一个纯计算等,此时可以在effect外面去写这个函数
  3. 如果要增加一个函数去依赖项,那么要明确使用useCallback外部的hook,如下面的例子所示
function ProductPage({ productId }) {
// Wrap with useCallback to avoid change on every render
const fetchProduct = useCallback(() => {
  // ... Does something with productId ...
}, [productId]); // All useCallback dependencies are specified

return <ProductDetails fetchProduct={fetchProduct} />;
}

function ProductDetails({ fetchProduct }) {
useEffect(() => {
  fetchProduct();
}, [fetchProduct]); // All useEffect dependencies are specified
// ...
}

实现shouldComponentUpdate的方式

  const Button = React.memo((props) => {
  // your component
  });

如上面所示,这种实现方式并不是使用了hooks,它相当于纯组件,但是仅仅能够比较的是props。可以去增加第二个参数,采用一种函数的方式去拿到新老的props,如果结果返回true,就跳过更新阶段

记住计算结果的方式

使用useMemo这个hook去记住之前的计算结果,从而在多个渲染之中缓存计算

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

上面的代码会调用computeExpensiveValue(a,b)这个函数,但是它们依赖的a,b没有改变,那么useMemo在直接去返回上一次结果的值

结语

对于hook的学习大概就如上面所说,对于hook其中的内容还很多所以对于hook的学习最好是去官网看看,链接如下https://react.docschina.org/docs/hooks-intro.html在官网中介绍的更加详细,这里的中文文档和英文文档内容都一样,不过对于英文好的同学建议看看英文版本。

到此这篇关于react中hook的介绍以及使用的文章就介绍到这了,更多相关react中hook介绍及使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • React Hooks 实现和由来以及解决的问题详解

    与React类组件相比,React函数式组件究竟有何不同? 一般的回答都是: 类组件比函数式组件多了更多的特性,比如 state,那如果有 Hooks 之后呢? 函数组件性能比类组件好,但是在现代浏览器中,闭包和类的原始性能只有在极端场景下才会有明显的差别. 性能主要取决于代码的作用,而不是选择函数式还是类组件.尽管优化策略有差别,但性能差异可以忽略不计. 参考官网:(https://zh-hans.reactjs.org/docs/hooks-faq.html#are-hooks-slow-b

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

    你还在为该使用无状态组件(Function)还是有状态组件(Class)而烦恼吗? --拥有了hooks,你再也不需要写Class了,你的所有组件都将是Function. 你还在为搞不清使用哪个生命周期钩子函数而日夜难眠吗? --拥有了Hooks,生命周期钩子函数可以先丢一边了. 你在还在为组件中的this指向而晕头转向吗? --既然Class都丢掉了,哪里还有this?你的人生第一次不再需要面对this. 这样看来,说React Hooks是今年最劲爆的新特性真的毫不夸张.如果你也对react

  • React Hooks的深入理解与使用

    你还在为该使用无状态组件(Function)还是有状态组件(Class)而烦恼吗? --拥有了hooks,你再也不需要写Class了,你的所有组件都将是Function. 你还在为搞不清使用哪个生命周期钩子函数而日夜难眠吗? --拥有了Hooks,生命周期钩子函数可以先丢一边了. 你在还在为组件中的this指向而晕头转向吗? --既然Class都丢掉了,哪里还有this?你的人生第一次不再需要面对this. 这样看来,说React Hooks是今年最劲爆的新特性真的毫不夸张.如果你也对react

  • react的hooks的用法详解

    hooks的作用 它改变了原始的React类的开发方式,改用了函数形式;它改变了复杂的状态操作形式,让程序员用起来更轻松;它改变了一个状态组件的复用性,让组件的复用性大大增加. useState // 声明状态 const [ count , setCount ] = useState(0); // 使用状态 <p>You clicked {count} times</p> <button onClick={()=>{setCount(count+1)}}>cli

  • React 使用Hooks简化受控组件的状态绑定

    开始之前 阅读本文需要对以下几项有一定了解 ECMAScript 6 文章中大量用到了 ES6 语法,比如解构赋值和函数参数默认值.剩余参数.展开语法.箭头函数等. Hooks React 在 16.8 版本中推出了 Hooks,它允许你在"函数组件"中使用"类组件"的一些特性. React 本身提供了一些 Hooks,比如 useState.useReducer 等.通过在一个以"use"作为命名起始的函数中调用这些 Hooks,就得到了一个

  • 如何对react hooks进行单元测试的方法

    写在前面 使用 react hook 来做公司的新项目有一段时间了,大大小小的坑踩了不少.由于是公司项目,因此必须要编写单元测试来确保业务逻辑的正确性以及重构时代码的可维护性与稳定性,之前的项目使用的是 react@15.x 的版本,使用 enzyme 配合 jest 来做单元测试毫无压力,但新项目使用的是 react@16.8 ,编写单元测试的时候,遇到不少阻碍,因此总结此篇文章算作心得分享出来. 配合 enzyme 来进行测试 首先,enzyme 对于 hook 的支持程度,可以参考这个 i

  • 详解如何使用React Hooks请求数据并渲染

    前言 在日常的开发中,从服务器端异步获取数据并渲染是相当高频的操作.在以往使用React Class组件的时候,这种操作我们已经很熟悉了,即在Class组件的componentDidMount中通过ajax来获取数据并setState,触发组件更新. 随着Hook的到来,我们可以在一些场景中使用Hook的写法来替代Class的写法.但是Hook中没有setState.componentDidMount等函数,又如何做到从服务器端异步获取数据并渲染呢?本文将会介绍如何使用React的新特性Hook

  • 基于Webpack4和React hooks搭建项目的方法

    面对日新月异的前端,我表示快学不动了:joy:. Webpack 老早就已经更新到了 V4.x,前段时间 React 又推出了 hooks API.刚好春节在家里休假,时间比较空闲,还是赶紧把 React 技术栈这块补上. 网上有很多介绍 hooks 知识点的文章,但都比较零碎,基本只能写一些小 Demo .还没有比较系统的,全新的基于 hooks 进行搭建实际项目的讲解.所以这里就从开发实际项目的角度,搭建起单页面 Web App 项目的基本脚手架,并基于 hooks API 实现一个 rea

  • 记录一次完整的react hooks实践

    写在前面 React在16.8版本正式发布了Hooks.关注了很久,最近正好有一个小需求,赶紧来试一下. 需求描述 需求很简单,部门内部的一个数据查询小工具.大致长成下面这样: 用户首次访问页面,会拉取数据展示.输入筛选条件,点击查询后,会再次拉取数据在前端展示. 需求实现 使用React Class Component的写法 如果使用以前的class写法,简单写一下,代码可能大概长成下面这样: import React from 'react'; import { Tabs, Input, R

  • react中hook介绍以及使用教程

    前言 最近由于公司的项目开发,就学习了在react关于hook的使用,对其有个基本的认识以及如何在项目中去应用hook.在这篇博客中主要从以下的几个点进行介绍: hook简介 hook中常用api的使用 hook在使用过程中需要去注意的地方 hook中怎样去实现class组件中的声明周期函数 hook 首先介绍关于hook的含义,以及其所要去面对的一些场景 含义:Hook 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性

  • React中hook函数与useState及useEffect的使用

    目录 1. 简介 2. useState使用 3. useEffect使用 useEffect发起网络请求 1. 简介 在 React 的世界中,有容器组件和 UI 组件之分,在 React Hooks 出现之前,UI 组件我们可以使用函数组件,无状态组件来展示 UI,而对于容器组件,函数组件就显得无能为力,我们依赖于类组件来获取数据,处理数据,并向下传递参数给 UI 组件进行渲染.React在v16.8 的版本中推出了 React Hooks 新特性,Hook是一套工具函数的集合,它增强了函数

  • React中的Hooks进阶理解教程

    目录 Hooks进阶 useState - 回调函数的参数 useEffect - 清理副作用 useEffect - 发送网络请求 useRef useContext Hooks进阶 useState - 回调函数的参数 使用场景 参数只会在组件的初始渲染中起作用,后续渲染时会被忽略.如果初始 state 需要通过计算才能获得,则可以传入一个函数,在函数中计算并返回初始的 state,此函数只在初始渲染时被调用 语法 const [name, setName] = useState(()=>{

  • React中的refs的使用教程

    ref是React中的一种属性,当render函数返回某个组件的实例时,可以给render中的某个虚拟DOM节点添加一个ref属性,如下面的代码所示: <body> <script type="text/jsx"> var App = React.createClass({ render: function() { return ( <div> <input type="text" placeholder="inp

  • React中10种Hook的使用介绍

    目录 React Hook是什么? React目前提供的Hook 1.useState 2.useEffect & useLayoutEffect 3.useMemo & useCallback 4.useRef 5.useContext 6.useReducer React Hook是什么? React官网是这么介绍的: Hook 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性. 完全可选的 你无需重写任何已有

  • React项目中hook实现展示对话框功能

    目录 思路:使用全局状态管理所有对话框 尝试设计一个API去做对话框的全局管理 实现:创建NiceModal组件和相关API 处理对话框的返回值 总结 React中使用对话框并不容易,主要因为: 对话框需要在父组件中声明,才能在子组件中控制其是否显示 给对话框传递参数只能由props传入,这意味着所有状态管理都必须在更高阶的组件中.而实际上这个对话框的参数只在子组件中才会维护.这时就需要我们使用自定义事件将参数传回 这些问题的本质就是:如何用一个统一的方式去管理对话框,从而让对话框相关的业务逻辑

  • react中的watch监视属性-useEffect介绍

    目录 react的watch监视属性-useEffect useEffect使用指南 最基本的使用 响应更新 如何处理Loading和Error 处理表单 自定义hooks 使用useReducer整合逻辑 取消数据请求 react的watch监视属性-useEffect 在vue中可以使用watch属性,去监视一个值,当这个值进行变化的时候就去执行一些操作.在react是没有这个属性的,但是它也一样可以达到相同的效果,那么接下来看看它是怎么实现的呢? 在react中实现监听效果有一个比较简单的

  • React中props使用教程

    目录 1. children 属性 1.1 React.cloneElement方法 1.2 React.Children.map方法 2. 类型限制(prop-types) 3. 默认值(defaultProps) 1. children 属性 概述: children 属性,表示组件标签的子节点,当组件标签有子节点时,props 就会有该属性,与普通的 props 一样,其值可以是任意类型.单标签和双标签中没有数据就没有此属性. 语法: # 父组件 class App extends Rea

  • React中常用的Hook有哪些

    目录 一.简介 二.使用 1.State Hook 2.Effect Hook 3.Ref Hook 一.简介 Hook是React 16.8.0版本增加的新特性/新语法 可以在函数组件中使用 state 以及其他的 React 特性 二.使用 1.State Hook (1)State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作 (2)语法: const [xxx, setXxx] = React.useState(initValue) (3)useState()说明

  • react中常见hook的使用方式

    1.什么是hook? react hook是react 16.8推出的方法,能够让函数式组件像类式组件一样拥有state.ref.生命周期等属性. 2.为什么要出现hook? 函数式组件是全局当中一个普通函数,在非严格模式下this指向window,但是react内部开启了严格模式,此时this指向undefined,无法像类式组件一样使用state.ref,函数式组件定义的变量都是局部的,当组件进行更新时会重新定义,也无法存储,所以在hook出现之前,函数式组件有很大的局限性,通常情况下都会使

随机推荐