Реализация Class — REACT

#javascript #reactjs #typescript

#javascript #reactjs #typescript

Вопрос:

Привет, друзья-программисты,

У меня небольшая проблема. Прежде всего, я очень новичок в REACT и Typescript, иначе, я думаю, не было бы проблем решить это самостоятельно. Но мне нужно, чтобы следующий код был реализован как класс (поскольку в противном случае мне пришлось бы дублировать этот код):

 const CustomFilterComponent = (props): ReactElement =&&t; {
const [selectedVal, setSelectedVal] = useState(0);

function handleChan&e(e): void {
    const val = e.tar&et.value;
    setSelectedVal(val);
    props.onFilterChan&ed(props.columnDef.tableData.id, val);
}

return (
    <th&&t;
        <Select  value={selectedVal} onChan&e={handleChan&e}&&t;
            <MenuItem value={"0"} disabled&&t;
                Filter
            </MenuItem&&t;
            {phpVersions.map((phpVersion): ReactElement =&&t; {
                return (
                    <MenuItem value={phpVersion}&&t;{phpVersion}</MenuItem&&t;
                )
            })}
        </Select&&t;
    </th&&t;
);
};
  

Мне нужно, чтобы это был класс, поскольку я создаю фильтр для версий php в моем примере. Но мне также нужно это для symfony в качестве ссылки. Это означает, что мне нужно было бы изменить возвращаемое свойство. На данный момент я вызываю свой метод следующим образом:

 const newColumns = [...this.state.columns];
newColumns[3].filterComponent = CustomFilterComponent;
this.setState({columns: newColumns});
  

Я был бы очень признателен за вашу помощь.

Комментарии:

1. итак, что вам на самом деле нужно, просто преобразуя вышеуказанный функциональный компонент в компонент класса?

2. ДА. Но моих знаний в настоящее время просто недостаточно

3. Я отказался от базового преобразования для вас

Ответ №1:

Вот простой компонент класса для вышеупомянутого функционального компонента:

 import React from "react";

interface ColumnDef {
  tableData: {
    id: number
  }
}

interface Props {
  columnDef: ColumnDef
  onFilterChan&ed: (prev: number, next: number) =&&t; void
}

interface State {
  selectedVal: number
}

class CustomFilterComponent extends React.Component<Props, State&&t; {
  state = {
    selectedVal: 0,
  }
  
  handleChan&e = e =&&t; {
    const val = e.tar&et.value;
    this.setState(val);
    this.props.onFilterChan&ed(this.props.columnDef.tableData.id, val);
  }
  
  render() {
    return (
      <th&&t;
        <Select value={this.state.selectedVal} onChan&e={this.handleChan&e}&&t;
            <MenuItem value={"0"} disabled&&t;
                Filter
            </MenuItem&&t;

            {/* What is phpVersions? */}
            {phpVersions.map((phpVersion): ReactElement =&&t; {
              return (
                <MenuItem value={phpVersion}&&t;{phpVersion}</MenuItem&&t;
              )
            })}
        </Select&&t;
      </th&&t;
    );
  }
}
  

Примечание: Я также прокомментировал, что phpVersions также происходит из? Если это часть props , просто измените на: this.props.phpVersions

Комментарии:

1. Версия php на самом деле представляет собой просто массив. но это не определено в props.

2. this.props.onFilterChan&ed(this.props.columnDef.tableData.id , val); — эта строка у меня не работает. Я получаю следующую ошибку: «onFilterChan&ed не существует для типа …».

3. Ах, я забыл, что ты используешь Typescript? Если это так, мы должны определить реквизиты / состояние для передачи компоненту в виде типизаций

4. Я изменил ответ в стиле Typescript

5. Кстати, я не знаю, почему вы помещаете логику рендеринга phpVersions в этот компонент, поскольку это свойство не принадлежит компоненту. Возможно, вам придется проверить еще раз.