reactjs - 在 TypeScript 中使用上下文 API
问题描述
我是第一次使用 Typescript 创建上下文,但我很难让它工作。每次我尝试创建接口并将它们放在我的价值道具中时,我都会遇到错误,我真的需要一些帮助。这是我的上下文(我会在评论中指出错误)
在 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<ITransactions[]>' 类型的参数。类型“(ITransaction | ITransactions)[]”不可分配给类型“ITransactions[]”。输入'ITransaction | ITransactions 不可分配给类型“ITransactions”。“ITransaction”类型中缺少属性“transactionList”,但在“ITransactions”类型中是必需的。
解决方案
你不需要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>
)
}
推荐阅读
- php - 如何将 MySQL 中的所有数据存储到 PHP 中的变量中?
- java - Kotlin java.lang.NoClassDefFoundError
- spring-security-oauth2 - OAuth2 资源服务器
- laravel - 为什么 laravel 路由指向 myapp/public?
- spring - 将一个 spring 项目添加到另一个
- python - 按计数分组并在python中首次一起使用
- php - 如何使用 PHP 读取提要内联标签
- forms - 可以将一个 html 表单拆分为两个或多个部分吗?
- android - 相当于去抖算子 Rx
- java - 如何在控制器、服务和存储库模式中使用 DTO