我正在使用map创建一堆CarBlock项目。我希望使用state将这些项目填充到数组中。这就是我的工作方式
import React, { useEffect, useState } from "react";
import CarBlock from "../carBlock/carBlock";
export interface CarDataProps {
carData: Car[];
};
// Export this type of reused interface to somewhere else maybe to import it wherever needed
export interface Car {
id: string,
modelName: string,
bodyType: string,
modelType: string,
imageUrl: string
}
export default function CarList(props: CarDataProps) {
const [carBlockList, setCarBlockList] = useState<Car[]>([]);
const carsJSONData = props.carData;
function createCarBlocks(){
const carBlockItems = carsJSONData.map((car) => {
// useEffect(() => setCarBlockList(carsJSONData),[])
// console.log(carBlockList)
return <CarBlock carBlockItem={car} key={car.id}/>
})
return carBlockItems;
};
return (
<div className="car-list">
{createCarBlocks()}
</div>
);
};
我收到一条错误消息:类型的参数(carBlockList:never[])=〉Car[]'不能赋值给类型为'SetStateAction〈never[]〉'的参数。
我想我需要输入is,但是我很难理解我如何才能完成这个。是否可以输入一个数组来拥有React Components的类型?
2条答案
按热度按时间nc1teljy1#
要键入修复
useState
,您可以遵循以下步骤。这应该可以解决它;
除此之外,你为什么要在渲染部分调用这个函数呢?从你的用例来看,我看不出有什么必要。
建议您了解更多有关
因为这些可以被称为React和学习的基本先决条件,这将从长远来看对你有所帮助。
mutmk8jj2#
如果我理解你只是想传递使用carData中的数据来渲染一些元素,那么基本上你Map了数据并渲染了CarBlock,我认为你已经做得很好了,所以在最基本的形式中你会有。
这样做很好。据我所知,我想你在聊天中说过,你想把一些呈现的元素存储为状态,这在技术上是可能的,但这样做真的没有意义,你应该处理状态中的数据,并使用组件来呈现数据。任何优化最终都可以在组件本身上完成,比如useMemo '等。但这些都是额外的,当你需要的时候。
无论哪种方式,为了完整,你可以做你所说的,但你不应该哈哈。
像useEffect这样的钩子需要以特定的方式调用,可以参见https://legacy.reactjs.org/docs/hooks-rules.html
总而言之,在react中,你有很多数据和组件。元素是由组件生成的,当它们被赋予一些属性,数据。一般来说,除非你有非常特殊的情况,否则你应该只处理数据和组件,让react生成元素。