Я пытаюсь использовать this example разработчиками React, чтобы создать фильтр поиска для таблицы.React fixed-data-table: Uncaught TypeError: this._dataList.getSize не является функцией
У меня есть таблица, работающая нормально с данными из моего бэкэнда статически. Я взял массив для «выборочных» данных, чтобы получить работу поиска. Но мне сложно скрыть время, когда они используют «поддельные данные», чтобы заполнить их таблицу как seen here, в отличие от «всего лишь» заполнения его тестовым массивом, как я хочу.
Вот мой исходный код. Я хочу фильтровать через столбец «firstName», как и в примере Facebook (для простоты). Ошибка возникает, когда вызывается getSize() ... Но я подозреваю, что проблема - это что-то еще.
class DataListWrapper {
constructor(indexMap, data) {
this._indexMap = indexMap;
this._data = data;
}
getSize() {
return this._indexMap.length;
}
getObjectAt(index) {
return this._data.getObjectAt(
this._indexMap[index],
);
}
}
class NameTable extends React.Component {
constructor(props) {
super(props);
this.testDataArr = []; // An array.
this._dataList = this.testDataArr;
console.log(JSON.stringify(this._dataList)); // It prints the array correctly.
this.state = {
filteredDataList: new DataListWrapper([], this._dataList)
};
this._onFilterChange = this._onFilterChange.bind(this);
}
_onFilterChange(e) {
if (!e.target.value) {
this.setState({
filteredDataList: this._dataList,
});
}
var filterBy = e.target.value;
var size = this._dataList.getSize();
var filteredIndexes = [];
for (var index = 0; index < size; index++) {
var {firstName} = this._dataList.getObjectAt(index);
if (firstName.indexOf(filterBy) !== -1) {
filteredIndexes.push(index);
}
}
this.setState({
filteredDataList: new DataListWrapper(filteredIndexes, this._dataList),
});
}
render() {
var filteredDataList = this.state.filteredDataList;
if (!filteredDataList) {
return <div>Loading table.. </div>;
}
var rowsCount = filteredDataList.getSize();
return (
<div>
<input onChange={this._onFilterChange} type="text" placeholder='Search for first name.. ' />
{/*A table goes here, which renders fine normally without the search filter. */}
</div>
);
}
}
export default NameTable
Извините, что сказал, что, но вы делаете это неправильно. Прежде всего, очень сложно хранить объект в состоянии, когда вы можете сохранить его в своем классе. Вы должны хранить в своих состояниях: dataListLoaded. Когда ваш datalist загружен, вы должны сделать setState (dataListLoaded: true), чтобы перезагрузить ваш компонент. – Kornflexx
Достаточно честно, я относительно новичок в области React и front-end. Если бы вы могли представить пример кода, о котором вы упоминаете, я бы хотел его протестировать. – cbll
Чтобы найти хорошие способы кода в es6 и в реагировании, я смотрю на это: https://github.com/ryanmcdermott/clean-code-javascript и некоторый исходный код хорошей библиотеки, например material-ui – Kornflexx