React中Hooks详解(useState、useEffect、useContext、useRef详解)

本文详细介绍了React Hooks的使用,包括useState用于在函数组件中管理状态,useEffect实现生命周期方法的功能,useContext用于在组件树中共享全局数据。文章通过实例展示了如何创建和使用Context,以及如何利用useRef和useImperativeHandle。此外,还讨论了在useEffect中使用setInterval的注意事项和替代生命周期方法的示例。
摘要由CSDN通过智能技术生成

目录

Hooks

函数组件专用

useState()

useEffect(func,val)

useContext

React.createContext

Context.Provider

const myContext = useContext(MyContext);  

Context.Consumer

Class.contextType

实例

useRef、useImperativeHandle


Hooks

可以让React 函数组件具有状态,并提供类似 componentDidMountcomponentDidUpdate等生命周期方法 。

函数组件专用

useState()

用来替代类中的state的状态,例如下面,相当于在state中初始化了一个count变量值为0,每次改变通过setCount(value),把value值赋给count(相当于setState({count:value})

import React, { useState } from 'react';
function Example() {
  const [count, setCount] = useState(0);
  // 声明一个叫 “count” 的 state 变量。  const [count, setCount] = useState(0);
  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

useEffect(func,val)

func为一个函数。有返回函数时会在组件卸载和每次func函数执行前(除第一次,即用于清理上一次调用的效应)时被调用,没有则不调用。

        当val不传时,组件初始化以及每次更新都会调用func函数。

        当为空数组时,组件在初始化时调用func函数。

        当val为数组时,组件在初始化时和每次数组中的任何一个变量发生变化时调用func函数。

注意比较变量发生变化时,如果是对象比较的是对象的引用,例如下面effect只会在初始化是打印一次,之后由于比较的是引用一直没有改变。

   import React, { useState, useEffect } from 'react'; 
   function Example() {
        const [count, setCount] = useState({a: 12});
        useEffect(() => {
            console.log('effect');
            return () => {
                console.log('clean')
            }
        }, [count])
        function handleClick() {
            count.a++;
            setCount(count)
        }
        // 点击按钮时发现屏幕显示的值不发生变化,而且effect里面的函数也没有执行
        //所以进行的是浅比较,这点类似于pureComponent
        return (
            <div>
                <p>You clicked {count.a} times</p>
                <button onClick={handleClick}>
                    Click me
                </button>
            </div>
        );
    }

useEffect中使用setInterval需要注意,例如下面传入count,实际上每次传入的是初始值0,不会把count实时的值传入。

有2种改法,1.第二个参数,数组改为[count],每一轮都会设置计时器,清除计时器。2.setCount改为setCount(preCount => preCount + 1);建议使用第二种。

    function Counter() {
        const [count, setCount] = useState(0);
        useEffect(() => {
            const id = setInterval(() => {
                setCount(count + 1);
            }, 1000);
            // 定时器只加一次的原因在于虽然setInterval函数里面的函数每秒都会执行一次,
            //但是count值始终是初始的0,因为这个函数绑定了第一轮render之后的count值,
            return () => clearInterval(id);
        }, []);
        return <h1>{count}</h1>;
    }

 替代生命周期示例

https://blog.csdn.net/AIWWY/article/details/123338490

useContext

用于共享那些对于一个组件树而言是“全局”的数据(多层父子组件传递数据,不用一层一层传递数据)。 搭配React.createContext、Context.Provider、Context.Consumer等使用。 

React.createContext

const MyContext = React.createContext(defaultValue);

创建一个 Context 对象。当 React 渲染一个订阅了(订阅相当使用useContext或Context.Consumer)这个 Context 对象的组件,这个组件会从组件树中离自身最近的那个匹配的 Provider 中读取到当前的 context 值。

注意:只有当组件所处的树中没有匹配到 Provider 时,其 defaultValue 参数才会生效。此默认值有助于在不使用 Provider 包装组件的情况下对组件进行测试。将 undefined 传递给 Provider 的 value 时,消费组件的 defaultValue 不会生效

Context.Provider

<MyContext.Provider value={/* 某个值 */}>

每个 Context 对象都会返回一个 Provider React 组件,它允许消费组件订阅 context 的变化。 这里的MyContext是React.createContext函数返回的变量名。

Provider 接收一个 value 属性,传递给消费组件(useContext或Context.Consumer)。一个 Provider 可以和多个消费组件有对应关系。多个 Provider 也可以嵌套使用,里层的会覆盖外层的数据。 

当 Provider 的 value 值发生变化时,它内部的所有消费组件都会重新渲染。从 Provider 到其内部 consumer 组件(包括 .contextType 和 useContext)的传播不受制于 shouldComponentUpdate 函数(见生命周期方法,因此当 consumer 组件在其祖先组件跳过更新的情况下也能更新。 新旧值检测来确定变化,使用了与 Object.is 相同的算法

const myContext = useContext(MyContext);  

相当于订阅Context.Provider中value值,此时可以通过 myContext访问value值。

注意myContext的值等于传递给函数的 value 值等价于组件树上方离这个 context 最近的 Provider 提供的 value 值。如果没有对应的 Provider,value 参数等同于传递给 createContext() 的 defaultValue

Context.Consumer

<MyContext.Consumer>
  {value => /* 基于 context 值进行渲染*/}
</MyContext.Consumer>

和useContext相同,也相当于订阅了Context.Provider中的value值。

Class.contextType

MyClass.contextType = MyContext;

MyClass为类组件名,MyContext为由React.createContext()创建的Context 对象。此属性可以让你使用 this.context 来获取最近 Context 上的值(即在该类组件中可以通过this.context访问MyContext.Provider上的value值)。你可以在任何生命周期中访问到它,包括 render 函数中。

实例

const themes = {
  dark: {
    foreground: "#ffffff",
    background: "#222222"
  }
};
const ThemeContext = React.createContext(themes.light);
function App() {
  return (
    <ThemeContext.Provider value={themes.dark}>
      <Toolbar />
    </ThemeContext.Provider>
  );
}
function Toolbar(props) {
  return (
    <div>
      <ThemedButton />
    </div>
  );
}
function ThemedButton() {
  const theme = useContext(ThemeContext);  
 return (
    <>   
     <button style={{ background: theme.background, color: theme.foreground }}>              
          I am styled by theme context!    
     </button>  
     <ThemeContext.Consumer>
        {value =>  <button style={{background:value.background,         
           color:value.foreground}}>I am styled by theme context too!</button>}
      </ThemeContext.Consumer>
    </>
 );
}

useRef、useImperativeHandle

https://blog.csdn.net/AIWWY/article/details/123404928

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:在React,memo是一个高阶组件,用于优化函数组件的性能。它类似于React.PureComponent,通过对内部对象进行浅比较来判断是否重新渲染组件。\[2\]useEffectReact提供的一个Hook函数,用于在函数组件执行副作用操作。它可以在组件渲染完成后执行一些异步操作,比如发送网络请求、订阅事件等。\[3\]useMemo是React提供的另一个Hook函数,用于在函数组件进行性能优化。它可以缓存计算结果,避免重复计算,类似于Vue的computed属性。\[1\]useRefReact提供的一个Hook函数,用于在函数组件创建一个可变的引用。它可以用来保存组件的状态,或者获取DOM元素的引用。\[1\]useStateReact提供的一个Hook函数,用于在函数组件创建一个可变的状态。它返回一个数组,第一个元素是当前的状态值,第二个元素是更新状态的函数。 所以,react memo用于优化函数组件的性能,useEffect用于执行副作用操作,useMemo用于缓存计算结果,useRef用于创建可变的引用,useState用于创建可变的状态。 #### 引用[.reference_title] - *1* *2* [useMemo,memo,useRef等相关hooks详解](https://blog.csdn.net/weixin_44441196/article/details/117328033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [一文轻松掌握react-hook(useStateuseReducer、useEffectuseCallback、useMemo、useRefuseContext...)](https://blog.csdn.net/u010074572/article/details/105176653)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值