发布于 2026-01-06 0 阅读
0

React Context API 与 TypeScript 示例

React Context API 与 TypeScript 示例

这是一个使用 TypeScript 实现 React Context API 的简单示例,可以根据不同的使用场景进行调整。本示例基于存储待办事项数组(待办事项以字符串形式存储),并提供一个添加新待办事项的函数。但您可以将其替换为任何其他内容(并重命名为任何名称)。

类型

我喜欢先定义类型。在这个例子中,我们有待办事项(以字符串数组的形式存储),以及一个用于添加新待办事项的函数:

types.ts

export type TodosContextState = {
  todos: string[];
  addTodo: (name: string) => void;
};
Enter fullscreen mode Exit fullscreen mode

上下文提供者

接下来,我们使用此类型创建一个提供程序组件,该组件存储我们希望通过上下文提供给其他组件的状态。

TodosProvider.tsx

import React, { createContext, useState, FC } from "react";
import { TodosContextState } from "./types";

const contextDefaultValues: TodosContextState = {
  todos: [],
  addTodo: () => {}
};

export const TodosContext = createContext<TodosContextState>(
  contextDefaultValues
);

const TodosProvider: FC = ({ children }) => {
  const [todos, setTodos] = useState<string[]>(contextDefaultValues.todos);

  const addTodo = (newTodo: string) => setTodos((todos) => [...todos, newTodo]);

  return (
    <TodosContext.Provider
      value={{
        todos,
        addTodo
      }}
    >
      {children}
    </TodosContext.Provider>
  );
};

export default TodosProvider;
Enter fullscreen mode Exit fullscreen mode

我们使用 `.` 为上下文设置默认值contextDefaultValues。对于函数,我们可以先将其设置为 `.`,() => {}以便在创建提供程序时设置它们之前,让 TypeScript 能够正常工作。

待办事项提供程序模块

我喜欢将我的 React 组件做成模块,所以这里是该TodosProvider模块的 index.ts 文件。

index.ts

export { TodosContext, default } from "./TodosContext";
Enter fullscreen mode Exit fullscreen mode

消费语境

以下是使用待办事项上下文的示例。非常简单:

const { todos } = useContext(TodosContext);
Enter fullscreen mode Exit fullscreen mode

在组件中使用它看起来会像这样:

Todos.tsx

import React, { useContext } from "react";
import TodosProvider, { TodosContext } from "./TodosContext";

const Todos = () => {
  const { todos, addTodo } = useContext(TodosContext);

  return (
    <div>
      <div>
        {todos.map((todo, i) => (
          <div key={i}>{todo}</div>
        ))}
      </div>
      <button onClick={() => addTodo("new todo")}>add todo</button>
    </div>
  );
};

export default () => (
  <TodosProvider>
    <Todos />
  </TodosProvider>
);
Enter fullscreen mode Exit fullscreen mode

注意:通过将Todos组件包裹在TodosProvider组件中

export default () => (
  <TodosProvider>
    <Todos />
  </TodosProvider>
);
Enter fullscreen mode Exit fullscreen mode

此上下文对其他组件(子组件除外)不可用。如果您希望多个组件共享此上下文,请将其向上移动组件树,使其覆盖所有需要使用它的组件。它甚至可以包裹整个应用程序。

完整示例

以下是 codesandbox 上的完整示例:

文章来源:https://dev.to/alexander7161/react-context-api-with-typescript-example-j7a