#reactjs #typescript
#reactjs #typescript
Вопрос:
Я начинаю с ReactJS, и я решил создать свой проект с использованием typescript. Это приложение, которое извлекает фильмы из API и отображает их.
Вот приложение:
import React from 'react';
import '../../assets/css/App.css';
import { Thumb } from '../../components/Thumb';
interface State {
isLoaded: boolean;
items: any[];
error: string;
}
class App extends React.Component<{}, State> {
state: Readonly<State> = {
isLoaded: false,
items: [],
error: ''
}
renderThumbsContainer() {
const movies = [
{title: 'Terminator', original_title: 'Terminator', original_language: 'EN', overview: 'A killer robot from future blablabla...', poster_path:'/terminator.jpg'}
];
const thumbs = movies.map((movie, index) => {
return (
<Thumb
key={index}
movie={movie}
/>
);
});
return (<div>{thumbs}</div>)
}
render() {
return (
<div className="App">
<header className="App-header">
<h1>Movies</h1>
</header>
<main>
{this.renderThumbsContainer()}
</main>
</div>
);
}
}
export default App;
И компонент, отображающий детали фильма:
import React from 'react';
export function Thumb({ movie: props }: any) {
return (
<div className="thumb">
<div>{props.title}</div>
<div>{props.original_title}</div>
<div>{props.original_language}</div>
<div>{props.overview}</div>
<div>{props.poster_path}</div>
</div>
);
}
Потратив 2 часа на борьбу с проблемой передачи объекта через props, я, наконец, разобрался с этим, используя этот параметр в функции компонента Thumb
Thumb({ movie: props }: any)
Я думал, что параметра props so Thumb(props: any) должно быть достаточно, но данные не отображаются, и я, наконец, придумал это, но я просто не понимаю, как это работает. Сначала я отобразил фильм. в divs все еще не работало, а затем оно работало с использованием props.
Мне не хватает знаний в typescript, для меня я объявил объект типа any, содержащий атрибут movie типа props в качестве параметра, но это не имеет смысла.
Итак, я хотел бы понять это, я привязал атрибут movie, исходящий от родителя, к реквизиту или что-то в этом роде? Пожалуйста, объясните.
Ответ №1:
Вы можете видеть JSX <Thumb key={index} movie={movie}/>
как синтаксический сахар для вызова функции Thumb(props)
where props={key: index, movie: movie}
. Все ваши реквизиты, предоставленные в элементе JSX, представляются в виде ключей и значений для props
объекта, переданного вашему компоненту.
Когда вы это делаете function Thumb({ movie: props })
, вы разрушаете props
аргумент, по сути, беря только movie
ключ из теперь разрушенного props
аргумента и переименовывая его в «props».
Я думаю, вы могли бы попробовать что-то подобное вместо этого
import React from 'react';
interface ThumbProps {
key: number;
movie: {
title: string;
original_title: string;
// etc...
}
}
export function Thumb({ movie }: ThumbProps) {
return (
<div className="thumb">
<div>{movie.title}</div>
<div>{movie.original_title}</div>
<div>{movie.original_language}</div>
<div>{movie.overview}</div>
<div>{movie.poster_path}</div>
</div>
);
}
Примечание: function Thumb({ movie }: ThumbProps)
теперь означает, что Typescript будет ожидать, что свойство destructured movie
будет иметь тип, определенный в интерфейсе ThumbProps`.
Комментарии:
1. Я писал это, но Густав уже сказал, что я рекомендую использовать I перед именами интерфейсов, такими как IThumbProps, но это на усмотрение программиста.
2. Я вижу, наконец, это было похоже на объявление интерфейса в сигнатуре функции. Использование имени props меня смутило. Я намеревался объявить интерфейс позже, просто невозможность передать этот объект сводила меня с ума. Спасибо за ваше объяснение.