【问题标题】:createContext doesn't accept defaultValuecreateContext 不接受 defaultValue
【发布时间】:2020-07-31 14:35:34
【问题描述】:

我正在尝试使用来自 react API 的createContext 来构建上下文:

import React, { useState, createContext } from 'react';

export const MovieContext =  createContext();

export const MovieProvider = (props) => {
  const [movies, setMovies] = useState(
    [
      {
        original_title: 'name of movie',
        poster_path: 'path_to_poster',
        id: 1
      }
    ]
  );
  return (
    <MovieContext.Provider value={[movies, setMovies]}>
      {props.children}
    </MovieContext.Provider>
  );
}

export default MovieProvider;

createContext() 函数显示此错误:

预期 1 个参数,但得到 0.ts(2554) index.d.ts(385, 9):未提供“defaultValue”的参数。

如果我将其设为字符串,并将字符串作为应用程序构建的值传递:

export const MovieContext =  createContext('');

<MovieContext.Provider value={''}>
  {props.children}
</MovieContext.Provider>

我应该添加什么样的值作为 createContext() 参数以使其与 useState 挂钩工作?我关注this guys tutorial,他在 JS 中执行此操作,但我在 TS 中构建我的应用程序,所以它更严格一些。

【问题讨论】:

    标签: reactjs typescript


    【解决方案1】:

    这些是 Typescript 类型,它们被描述为here。尽管documentation 并没有说它是必需的,但代码中有一条注释说明为什么需要这个参数。

    function createContext<T>(
        // If you thought this should be optional, see
        // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/24509#issuecomment-382213106
        defaultValue: T,
    ): Context<T>;
    

    在您的情况下将正确设置默认参数,如

    type IMovie = {
        original_title: string;
        poster_path: string;
        id: number;
    };
    
    type IMovieContext = [IMovie[], React.Dispatch<React.SetStateAction<IMovie[]>>];
    
    export const MovieContext = createContext<IMovieContext>([[], () => null]);
    
    export const MovieProvider = props => {
        const [movies, setMovies] = useState<IMovie[]>([
            {
                original_title: 'name of movie',
                poster_path: 'path_to_poster',
                id: 1,
            },
        ]);
        return <MovieContext.Provider value={[movies, setMovies]}>{props.children}</MovieContext.Provider>;
    };
    

    【讨论】:

    • 感谢您的解释。但我认为你误解了一点。如果我是正确的,createContext 签名现在是一个空数组。但是&lt;MovieContext.Provider value={[movies, setMovies]}&gt; 是一个反应钩子,如果我是正确的。所以现在我在那部分遇到了错误。 Type '{ original_title: string; poster_path: string; id: number; }[]' is not assignable to type 'never[] | (() =&gt; never[])'.
    • @PeterBoomsma 用类型更新了答案。 &lt;MovieContext.Provider value={[movies, setMovies]}&gt; - 不是钩子,它只是具有价值道具的组件。示例useState - 钩子
    • 谢谢,对我来说仍然有一些魔力,但我现在可以在另一个组件中呈现来自上下文提供程序的数据,这是目标。我想我会尝试找到一些有关上下文提供程序和打字稿的内容,以更好地了解正在发生的事情。干杯。
    猜你喜欢
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多