【问题标题】:Creating a React Context with TypeScript to share state使用 TypeScript 创建 React 上下文以共享状态
【发布时间】:2021-06-05 10:42:06
【问题描述】:

我正在尝试使用 TypeScript 创建一个 React Context 以在组件之间共享状态。创建上下文时,我尝试将null 作为初始值传递。

// contexts.ts file
import { createContext } from 'react';
export const AuthorContext = createContext(null);

但是当尝试将state valuesetter function 传递给Provider 的值时,这会导致问题,因为不能分配给null 类型

const [message, setMessage] = useState<string>("");

<AuthorContext.Provider value={{ message, setMessage }}>
    <Switch>
        <Route path={`${path}/first`} component={FirstContextContainer} />
        <Route path={`${path}/second`} component={SecondContextContainer} />
    </Switch>
</AuthorContext.Provider>

所以我尝试使用错误消息给我的类型定义创建一个interface

interface IStateStringDef {
  stateVal: string;
  setStateVal: React.Dispatch<React.SetStateAction<string>>;
}

并更新我的ContextProvider

// contexts.ts file
export const AuthorContext = createContext<IStateStringDef | null>(null); 

// file where provider is
<AuthorContext.Provider value={{ stateVal: message, setStateVal: setMessage }}> 

这可行,但似乎不是最正确和最优雅的方法,在 TypeScript 中创建和使用上下文的正确方法是什么?

【问题讨论】:

    标签: reactjs typescript use-context


    【解决方案1】:

    你肯定需要上下文的接口或类型(如 IStateStringDef)。

    interface IStateStringDef {
        message: string;
        setMessage: React.Dispatch<React.SetStateAction<string>>;
    }
    

    而且你不需要 null, 您可以将默认值传递给上下文,例如 createContext&lt;IStateStringDef&gt;({ message: '', setMessage: () =&gt; {});

    【讨论】:

    • 那么这样操作正常吗?
    • 是的,但没有null
    • 谢谢,在界面中使用React.Dispatch&lt;React.SetStateAction&lt;string&gt;&gt;作为类型似乎很奇怪,但如果这是正确的方法,我会使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 2017-12-20
    相关资源
    最近更新 更多