取法其上,得乎其中

React Hooks:useState / useEffect / useContext

概述

此篇博文仅以使用角度出发记录,并没有对其深究,因此并不保证概念性正确。

React Hooks 是在redux应用之后出现的一个特性,简单来看似乎两者用途是一样的,但它仅可以用于无状态函数组件之中。其主要目的在于在无状态的情况下使用react的一些特性,如生命周期。

useState

主要通过一个初始值获得对应的状态值,及可修改状态的方法。

import react, { Fragment, useState } from 'react'

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

return (
    <Fragment>
        {/* 此处可以直接使用,而不用使用this指向。 */}
        <button onClick={() => setCount(count + 1)}>完成 </button>
        - <span>已完成 {count} 次 </span>
    </Fragment>
)

useEffect

总的来说,useEffect相当于监听某个状态,亦或在某个生命周期中运行。

/*
    如果第二个参数为 [状态值],则为监听此值。如果为 [] 空数组,则等价于 componentDidMount。
    但如果第二个参数不填,则每次挂载完成后便会执行,等价于 componentDidUpdate。
*/

useEffect(() => {
    console.log(`count值变为${count}`);
}, [count]);

useContext

主要用于向组件内的所有组件进行共享状态,那么多个组件均可统一的从其父级组件的context之中去获取状态值,亦可修改。

那么,首先我们就需要去创建一个共享状态对象。一般是需要两个对象,其一为对应的共享状态,其二为共享状态的修改方法(犹如useState钩子获取到的setState)。

// 共享状态的默认数据
const defaultValue = fromJS({
    todoOverCount: 0,
});

// app组件的共享状态对象
export const appContext = React.createContext(defaultValue);

// app组件的共享状态对象的状态修改对象
export const appSetStateContext = React.createContext(undefined);

其后首先配合useState巧妙地获取默认数据的当前状态与修改方法,并使用此两者下的Provider组件包裹想要共享数据的组件。其后该组件以及该组件以下的所有组件都可以获取共享的数据,以及可对其修改。

const Content = () => {
    const [state, setState] = useState(defaultValue);
    return (
        // 共享状态数据
        <appContext.Provider value={state}>
            // 共享数据修改方法
            <appSetStateContext.Provider value={setState}>
                <App />
            </appSetStateContext.Provider>
        </appContext.Provider>

    )
};

其后在子组件之中仅需使用useContent就可以拿到对应的上下文即可直接获得以及修改了。

import react, { useContext } from 'react'
import { appContext, appSetStateContext } from './index'

// 获得上下文对象
const state = useContext(appContext);
const setState = useContext(appSetStateContext);

return (
    <Fragment>
        <span>{`全局值:${state.get('todoOverCount')}`}</span>
        <button onClick={() => setState(state.set('todoOverCount', state.get('todoOverCount') + 1))}>完成 </button>
    </Fragment>
)
React Hooks:useState / useEffect / useContext

https://ku-m.cn/index.php/archives/616/

作者

KuM

发布时间

2022-08-05

许可协议

CC BY 4.0

本页的评论功能已关闭