gpt4 book ai didi

javascript - react useContext() 性能,自定义钩子(Hook)内的 useContext

转载 作者:行者123 更新时间:2023-12-03 19:24:11 25 4
gpt4 key购买 nike

我使用了一个结构 React Hooks .它基于全局 Context包含 reducer 的组合(如在 Redux 中)。
另外,我广泛使用custom hooks分离逻辑。
我有一个包含异步 API 请求的钩子(Hook),它变得非常麻烦,我有机会将这个钩子(Hook)的几乎每个函数拆分为其他钩子(Hook),但是这些函数中的每一个都使用全局上下文(更准确地说 - 从 useReducer() 分派(dispatch))。

所以,问题:

  • 可以在每个需要它的钩子(Hook)中使用 useContext() 吗?
  • 例如,如果我创建了 10 个在内部使用 useContext() 并在组件中使用它们的自定义钩子(Hook),它将如何影响性能。

  • 例子:

    提供者/Store.js
    import React, { createContext, useReducer } from 'react';

    export const StoreContext = createContext();

    export const StoreProvider = ({ children }) => {
    /**
    * Store that contains combined reducers.
    */
    const store = useReducer(rootReducer, initialState);

    return (
    <StoreContext.Provider value={store}>{children}</StoreContext.Provider>
    );
    };

    钩子(Hook)/useStore.js
    import { useContext } from 'react';
    import { StoreContext } from '../providers';

    export const useStore = () => useContext(StoreContext);

    钩子(Hook)/useFoo.js
    import { useCallback } from 'react';
    import { useStore } from './useStore';

    export const useFoo = () => {
    const [, dispatch] = useStore();

    const doFoo = useCallback(
    async params => {
    dispatch(actions.request());

    try {
    const res = await SomeService.getSomething(params);
    dispatch(actions.add(res));
    dispatch(actions.success());
    } catch (error) {
    dispatch(actions.failure());
    }
    },
    [dispatch]
    );

    return { doFoo };
    };

    钩子(Hook)/useBar.js
    import { useCallback } from 'react';
    import { useStore } from './useStore';

    export const useBar = () => {
    const [, dispatch] = useStore();

    const doBar = useCallback(
    async params => {
    dispatch(actions.request());

    try {
    const res = await SomeService.getSomething(params);
    dispatch(actions.success());
    dispatch(actions.add(res));
    } catch (error) {
    dispatch(actions.failure());
    }
    },
    [dispatch]
    );

    return { doBar };
    };

    钩子(Hook)/useNext.js
    ...
    import { useStore } from './useStore';

    export const useNext = () => {
    const [, dispatch] = useStore();

    ...
    };

    组件/SomeComponent.js
    const SomeComponent = () => {
    // use context
    const [store, dispatch] = useStore();

    // and here is the context
    const { doFoo } = useFoo();

    // and here
    const { doBar } = useBar();

    // and here
    useNext();

    return (
    <>
    <Button onClick={doFoo}>Foo</Button>
    <Button onClick={doBar}>Bar</Button>
    // the flag is also available in another component
    {store.isLoading && <Spin />}
    </>
    )
    }

    最佳答案

    在内部,钩子(Hook)可以引用组件拥有的状态队列。 (Under the hood of React’s hooks system - Eytan Manor)
    useContext只是从相关的上下文提供者中引用一个全局状态。 useContext 几乎没有开销正如你所关心的。

    关于javascript - react useContext() 性能,自定义钩子(Hook)内的 useContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58068169/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com