#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
в этот компонент, поскольку это свойство не принадлежит компоненту. Возможно, вам придется проверить еще раз.