【问题标题】:useState and useContext in TypeScriptTypeScript 中的 useState 和 useContext
【发布时间】:2021-06-12 13:59:00
【问题描述】:

使用 useState,我想创建一个对象,我将在未来(可能很远 ^^)继续获取。

代码是作为一个表单,将在几个子页面上,每个子页面为对象提供不同的数据,最终将被提取到数据库中。

理论上,我可以结合 useState 和 useContext,不幸的是我得到了错误

类型 '{}' 必须有一个返回 iterator.ts (2488) 的 '[Symbol.iterator] ()' 方法

formContext.ts

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

export const FormContext = createContext({});

export const FormProvider: React.FC = props => {
  const [formData, setFormData] = useState({ title: '' });
  return <FormContext.Provider value={[formData, setFormData]}>{props.children}</FormContext.Provider>;
};

ServiceBoxGenerator.ts

import React, { useContext } from 'react';

//Component Import
import { ServiceBox } from './ServiceBox/ServiceBox';
import { ProcedureBox } from './ProcedureBox/ProcedureBox';
//Context Import
import { ServiceContext } from '../../App';
import { FormContext } from '../../utils/formContext';

export const ServiceBoxesGenerator: React.FC = () => {
  const { data } = useContext(ServiceContext);
  const dataArray = data;
  const [formData, setFormData] = useContext(FormContext);
  if (formData.title) {
    const searchedObject = dataArray.find(x => x.title === formData.title);
    const procedureObject = searchedObject?.services;
    return (
      <>
        {procedureObject?.map(data => {
          return <ProcedureBox key={data.id} icon={data.icon} title={data.title} description={data.description} price={data.price} />;
        })}
      </>
    );
  }
  return (
    <>
      {dataArray.map(data => {
        return (
          <div
            key={data.id}
            onClick={() => {
              setFormData({ title: data.title });
            }}
          >
            <ServiceBox key={data.id} icon={data.icon} title={data.title} serviceAmount={data.amount} />
          </div>
        );
      })}
    </>
  );
};

我正在寻求帮助并提示我做错了什么,因为我不知道我可以改变什么来让它工作。

或者也许有人有另一种方法来创建这样的对象,我不坚持使用 useState 和 useContext。

非常感谢您的所有帮助,祝您有美好的一天;)

【问题讨论】:

    标签: typescript forms use-state tslint use-context


    【解决方案1】:

    这是因为createContext({}){}的类型与[formData, setFormData]的类型不匹配。

    消除此错误的简单方法是指定上下文的类型,如下所示:

    export const FormContext = createContext<[{ title: string },React.Dispatch<React.SetStateAction<{
      title: string;
    }>>]>({} as any);
    

    【讨论】:

    • 首先我需要在 formContext.tsx 中使用 /* eslint-disable @typescript-eslint/no-explicit-any */。我的第二个新问题是 ServiceBoxesGenerator i.imgur.com/PWiCSfd.png 中的新错误。你知道在 TS 中进行状态管理的其他方法吗?
    • @Błażej Bałtruszewicz:你能不能给我看一个简单的代码沙箱或其他东西的例子,因为它可以在我的代码中使用
    • codesandbox.io/s/frosty-jones-8m0zi?file=/src/utils/… 当你点击 Book Appointment 按钮时,你会得到那个可怕的错误:(
    • @Błażej Bałtruszewicz:那是因为标签&lt;ServiceBoxesGenerator&gt; 没有被&lt;FormProvider&gt; 包裹,您可以将其包裹在父级或父级的父级中......以及formDatasetFormData会起作用的。
    • formData, setFormData 将工作,但似乎dataArray 部分存在一些问题
    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多