Состояния интерфейса и реквизиты в typescript реагируют

Я работаю над проектом, который использует typescript, а также реагирует и новичок в обоих. Мои вопросы касаются интерфейса в typescript и как это относится к реквизитам и состояниям. Что на самом деле происходит? Мое приложение вообще не запускается, если я не объявляю реквизиты и состояния интерфейса, но я использую состояния через функцию конструктора реакции, и я видел примеры, где вся эта информация попадает в "интерфейс MyProps" или "интерфейс MyStates", берут этот код для пример

"use strict";

import * as React from 'react'
import NavBar from './components/navbar.tsx'
import Jumbotron from './components/jumbotron.tsx';
import ContentPanel from './components/contentPanel.tsx';
import Footer from './components/footer.tsx';

interface MyProps {}
interface MyState {}
class Root extends React.Component <MyProps, MyState>  {
  constructor(props) {
    super(props);
    this.state = {
      ///some stuff in here

    };
  }
  render() {
    return (
      <div>
        <NavBar/>
        <Jumbotron content={this.state.hero}/>
        <ContentPanel content={this.state.whatIs}/>
        <ContentPanel content={this.state.aboutOne}/>
        <ContentPanel content={this.state.aboutTwo}/>
        <ContentPanel content={this.state.testimonial}/>
        <Footer content={this.state.footer}/>
      </div>
    )
  }
}
export default Root;

(Я удалил контент в this.state, чтобы публиковать здесь). Зачем мне нужен интерфейс? Каким будет правильный способ сделать это, так как я думаю, что я думаю об этом в jsx-способе, а не в способе tsx.

Ответ 1

Непонятно, что вы спрашиваете, но:

реквизиты: пары ключ/значение, которые передаются от родителя компонента, а компонент не должен изменять его собственные реквизиты, реагировать только на изменения реквизита от родительского компонента.

state: вроде как реквизит, но они изменяются в самом компоненте с помощью метода setState.

вызывается метод render при изменении реквизита или состояния.

Что касается части typescript, то React.Component принимает два типа в качестве обобщений: один для реквизита и один для состояния, ваш пример должен выглядеть больше:

interface MyProps {}

interface MyState {
    hero: string;
    whatIs: string;
    aboutOne: string;
    aboutTwo: string;
    testimonial: string;
    footer: string;
}

class Root extends React.Component <MyProps, MyState>  {
    constructor(props) {
        super(props);

        this.state = {
            // populate state fields according to props fields
        };
    }

    render() {
        return (
            <div>
                <NavBar/>
                <Jumbotron content={ this.state.hero } />
                <ContentPanel content={ this.state.whatIs } />
                <ContentPanel content={ this.state.aboutOne } />
                <ContentPanel content={ this.state.aboutTwo } />
                <ContentPanel content={ this.state.testimonial } />
                <Footer content={ this.state.footer } />
            </div>
        )
    }
}

Как вы можете видеть, интерфейс MyState определяет поля, которые позже используются в компоненте this.state (я сделал их все строки, но они могут быть любыми, что вы хотите).

Я не уверен, действительно ли эти поля должны находиться в состоянии, а не в реквизитах, но вы вызываете его.

Ответ 2

1 - удалите ваш интерфейс, если вы не хотите.
2 - класс изменения расширяется как показано ниже

Класс Root расширяет React.Component <{}, {}> {

.........