Не удается отправить действие машинописного текста для компонента на основе класса

Я пытаюсь использовать этот шаблон для моего проекта реактивного машинописного текста. Я не могу настроить правильный тип действий. Это было легко с JavaScript. Но я новичок в TypeScript. Я хочу знать, почему мой код не работает. Также, пожалуйста, предложите лучший способ решить эту проблему.

Панель инструментов.tsx

interface IAction{
  type: string,
  payload: any,
}

interface IProps {
  // dashboard: DashboardState;
  dashboard: any;
  // Actions
  changeUserName: IAction;
}
interface IState {}

class Dashboard extends React.Component<IProps, IState> {
  componentDidMount(){
    console.info("____FOCUS____");
    console.info(this.props);
    this.props.changeUserName("NewName");
    console.info("____FOCUS____");
    // this.props.changeUserName('New Name');
  }
  render() {
    return (
      <>
        <Helmet>
          <title>Dashboard</title>
          <meta name = "description" content = "Description of Dashboard" />
        </Helmet>
        <DashboardComponent username = {'somevalue'} />
        {/* <Div>{t('')}</Div> */}
      </>
    );
  }
}


const mapStateToProps = (state: any, ownProps: any) => ({
  dashbaord: selectDashboard(state),
});

const mapDispatchToProps = (dispatch: any, ownProps: any) => ({
  ...bindActionCreators({
    ...actions,
  }, dispatch),
});

const withConnect = connect(mapStateToProps, mapDispatchToProps);
const withReducer = injectReducer({key: sliceKey, reducer: dashboardReducer});
const withSaga = injectSaga({key: sliceKey, saga: dashboardSaga});

export default compose(
  withReducer,
  withConnect,
  withSaga,
)(Dashboard);

Типы

Типы, которые я создаю, такие же, как и в документах.

/* --- STATE --- */
export interface DashboardState {
  username: string;
}

export type ContainerState = DashboardState;

Кусочек

Это фрагмент, который я создаю. Это так, как описано в документах.

export const initialState: ContainerState = {
  username: 'Initial Username',
};

const dashboardSlice = createSlice({
  name: 'dashboard',
  initialState,
  reducers: {
    changeUserName(state, action: PayloadAction<string>) {
      state.username = action.payload;
    },
  },
});

export const { actions, reducer, name: sliceKey } = dashboardSlice;

Не могли бы вы поделиться, что именно не работает? Какое сообщение об ошибке вы получаете? Кроме того, у вас есть опечатка в вашем методе mapStateToProps() ("dashbaord").

Henrik Erstad 15.12.2020 12:43

На самом деле, мой код тоже недействителен. Он работает, но у меня нет действительных интерфейсов. Если вы можете, пожалуйста, скажите мне об этом.

Farman Ali 15.12.2020 12:57

Это выражение не вызывается. Тип 'IAction' не имеет позывных. TS2349 this.props.changeUserName("НовоеИмя");

Farman Ali 15.12.2020 13:00

У меня нет надлежащей реализации интерфейса для действий среза редуктора. Не могли бы вы привести пример этого?

Farman Ali 15.12.2020 13:01

Я предлагаю взглянуть на это руководство для редукторов.

Henrik Erstad 15.12.2020 13:10

Все делается так же, как в доке. Но у меня нет опыта работы с машинописным текстом. Я думаю, что не добавил правильные интерфейсы для действий.

Farman Ali 15.12.2020 13:15

Я добавляю фрагмент в вопросе.

Farman Ali 15.12.2020 13:16

Пожалуйста, просмотрите описание моего вопроса. Я добавил дополнительную информацию.

Farman Ali 15.12.2020 13:22
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
8
953
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема

Я неправильно создавал интерфейсы. Метод отправки компонентов на основе классов был таким же, как и раньше. Единственной проблемой были интерфейсы, которые теперь правильные.

Код решения

Панель инструментов.tsx

interface IProps {
  initChangeUserName: Function;
  changeUserName: Function;
}

interface IState {}

class Dashboard extends React.Component<IProps, IState> {
  render() {
    return (
      <>
        <Helmet>
          <title>Dashboard</title>
          <meta name = "description" content = "Description of Dashboard" />
        </Helmet>
        <DashboardComponent 
        username = {'somevalue'}
        initChangeUserName = {this.props.initChangeUserName}
        />
      </>
    );
  }
}

const mapStateToProps = (state: any, ownProps: any) => ({
  dashboard: selectDashboard(state),
});

const mapDispatchToProps = (dispatch: any, ownProps: any) => ({
  ...bindActionCreators({ ...actions }, dispatch),
});

const withConnect = connect(mapStateToProps, mapDispatchToProps);
const withReducer = injectReducer({ key: sliceKey, reducer: dashboardReducer });
const withSaga = injectSaga({ key: sliceKey, saga: dashboardSaga });

export default compose(
  withReducer,
  withConnect,
  withSaga,
)(Dashboard);

DashboardComponent.tsx


// ....
// This was a functional component
<UserNameForm initChangeUserName = {props.initChangeUserName} />
// ....

UserNameForm.tsx

// ....
this.props.initChangeUserName(this.state.username);
// ....

Другие вопросы по теме