首页 > 其他分享 >几种常见的React Hooks

几种常见的React Hooks

时间:2022-11-17 17:24:15浏览次数:47  
标签:... const Hooks 几种 React useState 组件 useEffect

useState

useState,让函数组件拥有了维持状态的功能。维持状态是指在函数的多次渲染之间,这个state是可以在函数中间共享的

使用方式

import React, { useState } from 'react';

const Counter = () => {
  const [count, setCount] = useState(0);
  
  return (
    <div>
      <p>{ count }</p>
      <button onClick={() => setCount(count + 1)}>点击</button>
    </div>
  )
}

export default Counter

参数解析

useState(initialState)的参数initialState是state的初始值,可以是任意类型,如字符串、数值、布尔值、对象、数组

import React, { useState } from 'react';

const Counter = () => {
  const [count, setCount] = useState(0);
  const [visible, setVisible] = useState(false);
  const [store, setStore] = useState({});
  const [list, setList] = useState([]);
  const [name, setName] = useState('xcc');
  
  return ...
}

export default Counter

useState()返回值是一个包含两个元素的数组,第一个值为state的值,为只读的,第二个是用来设置state值的

对比类组件

类组件只有一个state,通过通过对象中的不同属性来表示不同的状态,通过setState来进行更新。函数组件可以创建多个state,用来描述不同状态的值,更加语义化

类组件:

import React from 'react'

class Counter extends Component {
  constructor(props) {
    super(props)
    this.state = {
      count: 0,
      visible: false
    }
  }
 
  componentDidMount() { 
    setState({ count: 1 })
  }

  render() {
    ...
  }
}

export default Counter

函数组件:

import React, { useState } from 'react';

const Counter = () => {
  const [count, setCount] = useState(0);
  const [visible, setVisible] = useState(false);
  
  return ...
}

export default Counter

使用时需要注意的点

不要在state中存储可以通过计算得到的值

常见情况:

  1. props中传递过来的值
  2. 存储在cookie、localStorage中的值
  3. 挂载在URL参数上的值

useEffect

useEffect,用来执行一段副作用,副作用是指一段和当前执行结果无关的代码。其中代码的执行是不会影响UI的渲染

使用方式

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

const WindowSize = () => {
  const [size, setSize] = useState(null)

  useEffect(() => {
    const handleResize = () => {
      ...
    }
    window.addEventListener("resize", handleResize)
    return () => {
      window.removeEventListener("resize", handleResize)
    }
  }, [])

  return (
    ...
  )
}

export default WindowSize

参数解析

useEffect(callback, dependencies)

callback为要执行的函数,dependencies为可选的依赖项数组

几种常见的使用方式:

没有依赖项时,会在每次render后执行

useEffect(() => {})

依赖项为空数组时,会在首次render后执行

useEffect(() => {}, [])

依赖项不为空时,会在首次render后,每次依赖项数组发生改变时执行

useEffect(() => {}, [a,b,c])

组件在卸载时执行

useEffect(() => { return () => {} }, [])

对比类组件

useEffect想比类组件的生命周期,基本可以等价于ComponentDidMount、componentDidUpdate 和 componentWillUnmount这三个方法,但有不是完全相同

类组件

import React from 'react'

class WindowSize extends Component {
  constructor(props) {
    super(props)
    this.state = {
      size: null
    }
  }
 
  componentDidMount() { 
    window.addEventListener("resize", this.handleResize)
  }

  componentWillUnmount() { 
    window.removeEventListener("resize", this.handleResize)
  }

  handleResize = () => {
    ...
  }

  render() {
    ...
  }
}

export default WindowSize

函数组件:

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

const WindowSize = () => {
  const [size, setSize] = useState(null)

  useEffect(() => {
    const handleResize = () => {
      ...
    }
    // 等价于类组件中的componentDidMount
    window.addEventListener("resize", handleResize)
    // 等价于类组件中的componentWillUnmount
    return () => {
      window.removeEventListener("resize", handleResize)
    }
  }, [])

  return (
    ...
  )
}

export default WindowSize

使用时注意的点

依赖项一定要为回调函数中在使用的变量

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

const Books = ({ id }) => {
  const [list, setList] = useState([])

  useEffect(() => {
    const getList = async () => {
      const res = await getBookList({ id })
      setList(res.data)
    }
    getList()
  }, [id])

  return ...
}

export defaule Books;

依赖项要为一个常量数组,而不是一个动态数据

useEffect(() => {}, [id])

React会使用浅比较来对比依赖项是否发生改变,因此不要使用对象、数组等作为依赖项

function Todos() {
  // 这里在每次组件执行时创建了一个新数组
  const todos = [{ text: 'Learn hooks.'}];
  useEffect(() => {
    console.log('Todos changed.');
  }, [todos]);
}

标签:...,const,Hooks,几种,React,useState,组件,useEffect
From: https://www.cnblogs.com/sk-3/p/16900119.html

相关文章

  • laravel redirect几种用法
    1.使用Facdes的方式//重定向路由returnRedirect::to('/home');//重定向命名路由returnRedirect::route('website.home');//重定向到控制器动作returnRedirect::action('......
  • ReactNote-函数组件和类组件
    组件:可以编写react元素虚拟DOM:react元素真实的DOM:可以展示React里很重要的:组件组件目的:复用组件作用:代码分隔组件在React里有两种定义的方式:第一种:......
  • 1、Spring事务失效的几种原因
    Spring事务失效的几种原因1、Bean没有被Spring管理,即类上没有加入@Service、@Component等注解。2、方法没有使用public修饰加@Transactional注解的方法必须用public关键......
  • 视频直播app源码,react 编程式导航实现页面跳转
    视频直播app源码,react编程式导航实现页面跳转一介绍编程式导航:通过js代码来实现页面跳转 案例:点击登录按钮,登录成功后,通过代码跳转到后台首页,如何实现? 答......
  • 几种元素定位错误的记录
    使用testNG+pageObject有时候会遇到的几种元素定位的错误1、elementisnotattachedtothepagedocument使用pageObject模式元素都是提前定位好的,有时页面多次操作会......
  • ReactNote-JSX
    第一个加载的组件就是APP:<APP/>当前咱们指定的DOM就是root:ReactDOM.createRoot(document.getElementById('root'));root在那个地方:react-app/public/index.html......
  • React-App环境搭建和项目启动
    node环境>=14.0.0npm环境>=5.6安装create-react-app:npmi-gcreate-react-app(cnpm/yarn)创建项目:create-react-appreact-project(项目名称)进入项目根目录:cdreact-p......
  • 手动实现 vue3 [ reactive, computed, watch ]
    一、vue.js1importreactivefrom"./reactive";2importWatcherfrom"./Watcher";3importcomputedfrom"./computed";4importwatchfrom"./watch";56ex......
  • php的几种输出函数
    php输出函数函数名功能描述echo()输出字符串print()输出一个或多个字符串print_r()打印关于变量的易于理解的信息printf()输出格式化字符串sprintf()......
  • 开发访问k8s集群的几种方法(路由和kt)
    现状k8s集群内是有一套完整网络环境,我们不能直接通过IP访问到k8s集群内的pod或者service,只能通过nodeport或者ingress才能访问到服务.痛点开发人员进行微服务开发的......