useContext和Consumer之间的区别是什么?

哈利

当我使用React Context时,这两种方式之间是有区别的。

这是提供者

import { type } from "node:os";
import React, { useState } from "react";

export type ENV_TYPE = "dev" | "citest" | "gld" | "pre" | "prd" | string;
interface IUser {
  name: string;
  password: string;
  role: string;
}

export interface IDataContextState {
  env: ENV_TYPE;
  user: IUser[];
  onEnvChange: (env: ENV_TYPE) => void;
  onUserChange: (val: IUser[]) => void;
}
export const DataContext = React.createContext<IDataContextState>(
  {} as IDataContextState
);
const DataProvider = (props: any) => {
  const [user, setUser] = useState<IUser[]>({} as IUser[]);
  const [env, setEnv] = useState<ENV_TYPE>("dev");
  const onEnvChange = (env: ENV_TYPE) => {
    setEnv(env);
    // TODO (设置当前ENV的User)
  };
  const onUserChange = (val: IUser[]) => {
    setUser(val);
  };

  return (
    <DataContext.Provider
      value={{ env: env, user: user, onEnvChange, onUserChange }}
    >
      {props.children}
    </DataContext.Provider>
  );
};
export { DataProvider };

  1. 消费者
    <DataProvider>
      <DataContext.Consumer>
        {({ env, onEnvChange }) => (
          <>
            <p>当前环境:{env}</p>
            <div className="app">
              <Tabs type="card" onChange={onEnvChange}>
                {tabData.map(({ key }) => (
                  <TabPane tab={key} key={key}>
                    <Main />
                  </TabPane>
                ))}
              </Tabs>
            </div>
          </>
        )}
      </DataContext.Consumer>
    </DataProvider>

这种方式onChange行之有效。但是当使用useContext时

  1. useContext
import React, { useContext } from "react";
import { Tabs } from "antd";
import Main from "./components/main";
import { DataProvider, DataContext } from "./context";
import "./App.css";

const { TabPane } = Tabs;

const App: React.FC = () => {
  const {env,onEnvChange} = useContext(DataContext);
  const tabData = [
    {
      key: "dev",
    },
    {
      key: "citest",
    },
    {
      key: "gld",
    },
    {
      key: "pre",
    },
    {
      key: "prd",
    },
  ];
  const handleTabChange = (activeKey: string) => {
    onEnvChange(activeKey);
    console.log(activeKey);
  };
  return (
    <DataProvider>
      {/* <DataContext.Consumer>
        {({ env, onEnvChange }) => ( */}
          <>
            <p>当前环境:{env}</p>
            <div className="app">
              <Tabs type="card" onChange={handleTabChange}>
                {tabData.map(({ key }) => (
                  <TabPane tab={key} key={key}>
                    <Main />
                  </TabPane>
                ))}
              </Tabs>
            </div>
          </>
        {/* // )} */}
      {/* </DataContext.Consumer> */}
    </DataProvider>
  );
};

export default App;

Uncaught TypeError: onEnvChange is not a function

这是我的错?

武国棠

您正在DataProvider外部使用useContext

<App>
   useContext
   <DataProvider> </DataProvider>
</App>

您需要在DataProivder中使用useContext来获取上下文

<DataProvider>
   <App>
        useContext
  </App>
</DataProvider>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

之间的区别是什么。和^和^(。*)$?

来自分类Dev

之间的区别是什么。和^和^(。*)$?

来自分类Dev

什么是JobIntentService和IntentService之间的区别是什么?

来自分类Dev

什么是@Mocked,@Injectable和@Capturing之间的区别是什么?

来自分类Dev

.jsx和.js文件之间的技术区别是什么

来自分类Dev

actor,actor实例和actorref之间的区别是什么

来自分类Dev

Variant数组和动态数组之间的区别是什么?

来自分类Dev

express和http之间的技术区别是什么?

来自分类Dev

Babel和TypeScript之间的主要区别是什么

来自分类Dev

Firebase和Express之间的核心区别是什么?

来自分类Dev

Fluxbox和Blackbox之间的主要区别是什么?

来自分类Dev

\ xFF和0xFF之间的区别是什么

来自分类Dev

Flink和Storm之间的主要区别是什么?

来自分类Dev

http handler和ashx之间的区别是什么

来自分类Dev

HTTP和COAP之间的主要区别是什么?

来自分类Dev

“实体”和“游戏对象”之间的区别是什么?

来自分类Dev

RegDeleteKeyValue和RegDeleteValue之间的区别是什么?

来自分类Dev

[[NSUUID新] UUIDString]和CFUUIDRef之间的区别是什么?

来自分类Dev

Docker和Snap之间的主要区别是什么?

来自分类Dev

MDM和ESB之间的主要区别是什么?

来自分类Dev

“ head”和“ header”标签之间的真正区别是什么?

来自分类Dev

root用户和jenkins之间的区别是什么?

来自分类Dev

ORM和对象映射之间的区别是什么?

来自分类Dev

“ constinit”和“ constexpr”之间的真正区别是什么?

来自分类Dev

AsyncIterable和Observable之间的实际区别是什么?

来自分类Dev

|| =和| =与布尔值之间的区别是什么

来自分类Dev

OpenTracing和Zipkin之间的主要区别是什么?

来自分类Dev

创建object和object()之间的区别是什么

来自分类Dev

之间的区别是什么。和(。)在Haskell中?

Related 相关文章

  1. 1

    之间的区别是什么。和^和^(。*)$?

  2. 2

    之间的区别是什么。和^和^(。*)$?

  3. 3

    什么是JobIntentService和IntentService之间的区别是什么?

  4. 4

    什么是@Mocked,@Injectable和@Capturing之间的区别是什么?

  5. 5

    .jsx和.js文件之间的技术区别是什么

  6. 6

    actor,actor实例和actorref之间的区别是什么

  7. 7

    Variant数组和动态数组之间的区别是什么?

  8. 8

    express和http之间的技术区别是什么?

  9. 9

    Babel和TypeScript之间的主要区别是什么

  10. 10

    Firebase和Express之间的核心区别是什么?

  11. 11

    Fluxbox和Blackbox之间的主要区别是什么?

  12. 12

    \ xFF和0xFF之间的区别是什么

  13. 13

    Flink和Storm之间的主要区别是什么?

  14. 14

    http handler和ashx之间的区别是什么

  15. 15

    HTTP和COAP之间的主要区别是什么?

  16. 16

    “实体”和“游戏对象”之间的区别是什么?

  17. 17

    RegDeleteKeyValue和RegDeleteValue之间的区别是什么?

  18. 18

    [[NSUUID新] UUIDString]和CFUUIDRef之间的区别是什么?

  19. 19

    Docker和Snap之间的主要区别是什么?

  20. 20

    MDM和ESB之间的主要区别是什么?

  21. 21

    “ head”和“ header”标签之间的真正区别是什么?

  22. 22

    root用户和jenkins之间的区别是什么?

  23. 23

    ORM和对象映射之间的区别是什么?

  24. 24

    “ constinit”和“ constexpr”之间的真正区别是什么?

  25. 25

    AsyncIterable和Observable之间的实际区别是什么?

  26. 26

    || =和| =与布尔值之间的区别是什么

  27. 27

    OpenTracing和Zipkin之间的主要区别是什么?

  28. 28

    创建object和object()之间的区别是什么

  29. 29

    之间的区别是什么。和(。)在Haskell中?

热门标签

归档