【问题标题】:Using Context API in TypeScript在 TypeScript 中使用上下文 API
【发布时间】:2020-07-11 13:57:48
【问题描述】:

我是第一次使用 Typescript 创建上下文,但我很难让它工作。每次我尝试创建接口并将它们放在我的价值道具中时,我都会遇到错误,我真的需要一些帮助。这是我的上下文(我会指出 cmets 中的错误)

在 IContext 中,我不知道如何放置事务的类型(它是一个对象数组)

我想传递 value prop、两个函数、交易数组和输入中的所有内容。

无论如何,这是我第一次在更大的项目中使用 typescript,所以如果你们对如何更好地练习它有任何建议,请告诉我。

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

interface IContext {
  handleInputChange(): void;  
  handleSubmit(): void;
  inputElements: {
    name: string;
    amount: string;
  };
  transactions: <-- I don't know what to put here
}

export const TransactionsContext = createContext<IContext | null>(null)


interface ITransaction {
  name: string;
  amount: string;
}

interface ITransactions {
  transactionList: ITransaction
}


export const TransactionsContextProvider: React.FC = ({ children }) => {
  
  const [transactions, setTransactions] = useState<ITransactions[]>([])
  const [inputs, setInputs] = useState<ITransaction>({
    name: '',
    amount: ''
  })

  const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {
    const { name, value } = e.target

    setInputs({...inputs, [name]: value })
  }


  const handleSubmit = (e: ChangeEvent<HTMLInputElement>) => {
    e.preventDefault()

    setTransactions([...transactions, inputs])  <-- Error here
  }

  return (
    <TransactionsContext.Provider 
      value={{ transactions, handleInputChange, handleSubmit, inputs }}> <-- Error here
        {children}
    </TransactionsContext.Provider>
  )
}

错误

在setTransactions中:

“(ITransaction | ITransactions)[]”类型的参数不能分配给“SetStateAction”类型的参数。 类型“(ITransaction | ITransactions)[]”不可分配给类型“ITransactions[]”。 输入'ITransaction | ITransactions' 不可分配给类型 'ITransactions'。 “ITransaction”类型中缺少属性“transactionList”,但在“ITransactions”类型中是必需的。

【问题讨论】:

    标签: reactjs typescript react-context


    【解决方案1】:

    你不需要interface ITransactions

    使用ITransaction[] 作为transactions 的类型

    const [transactions, setTransactions] = useState<ITransaction[]>([])
    

    import React, { createContext, useState, ChangeEvent } from 'react';
    
    interface ITransaction {
      name: string;
      amount: string;
    }
    
    interface IContext {
      handleInputChange(e: ChangeEvent<HTMLInputElement>): void;  
      handleSubmit(e: ChangeEvent<HTMLInputElement>): void;
      inputElements: {
        name: string;
        amount: string;
      };
      transactions: ITransaction[];
    }
    
    export const TransactionsContext = createContext<IContext | null>(null)
    
    export const TransactionsContextProvider: React.FC = ({ children }) => {
      
      const [transactions, setTransactions] = useState<ITransaction[]>([])
      const [inputs, setInputs] = useState<ITransaction>({
        name: '',
        amount: ''
      })
    
      const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {
        const { name, value } = e.target
    
        setInputs({...inputs, [name]: value })
      }
    
    
      const handleSubmit = (e: ChangeEvent<HTMLInputElement>) => {
        e.preventDefault()
    
        setTransactions([...transactions, inputs]);
      }
    
      return (
        <TransactionsContext.Provider 
          value={{ transactions, handleInputChange, handleSubmit, inputs }}>
            {children}
        </TransactionsContext.Provider>
      )
    }
    

    【讨论】:

    • 我可以在 IContext 中的事务中放入什么?顺便说一句,它有效,但我仍然收到与功能相关的错误。
    • 它说 Type '(e: ChangeEvent) => void' 不能分配给 type '() => void'。
    • transactions: ITransaction[];
    • interface IContext { handleInputChange(e: ChangeEvent&lt;HTMLInputElement&gt;): void; handleSubmit(e: ChangeEvent&lt;HTMLInputElement&gt;): void;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 2021-08-24
    • 2015-09-08
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多