#javascript #reactjs #react-native
Вопрос:
Я столкнулся с этой ошибкой при попытке запустить свой код реакции и увидел, что это обычная ошибка, но после рассмотрения вопросов других людей у меня все еще возникают проблемы с тем, как это исправить. Я все еще новичок в реагировании, поэтому я как бы потерялся. Предполагается, что код должен взять файл JSON и отобразить его в виде таблицы, а затем кнопка должна отсортировать его по фамилии и повторно отобразить таблицу.
import data from './data.json' //Imports the JSON from local file, can be changed later to pull from api
import {Button, View} from 'react-native';
export default function App() {
return (
<PaientTable/>
);
}
class PaientTable extends React.Component {
constructor(props) {
super(props);
this.state = { counter: 0 };
// this.sort = this.sort.bind(this);
}
render(){
function sort (){
return this.setState(
data.sort((a, b) => {//sorts by name
if (a.lName < b.lName) {
return -1;
}
if (a.lName > b.lName) {
return 1;
}
return 0;
})
);
}
return (
<table>
<caption>Paients</caption>
<thead>
<tr>
<th>ID</th>
<th>First Name</th>
<th>
<button type="button" onClick={() => this.sort.bind(this)}>
Last Name
</button>
</th>
</tr>
</thead>
<tbody>
{data.map(paient => (
<tr>
<td>{paient.id}</td>
<td>{paient.fName}</td>
<td>{paient.lName}</td>
</tr>
))}
</tbody>
</table>
);
}
}
Комментарии:
1. Зачем нужно использовать привязку? Разве вы не можете вызвать метод напрямую?
2. Там происходит несколько вещей. Прямо сейчас ваша
sort
функция находится внутриrender
функции. Вынеси это наружу. Далее вам нужно только «привязатьthis
» свой конструктор. Раскомментируйте строку, которая у вас есть в конструкторе. Наконец, поскольку вам не нужно привязываться внутриrender
функции, измените значение кнопкиonClick
наonClick={this.sort}
. Здесь есть дополнительная информация о привязкеthis
к событиям, таким как события изменений, и о том, почему это необходимо: reactjs.org/docs/handling-events.html3. Да, здесь куча проблем, самая большая, вероятно, связана с возвратом вызова setState внутри вашей функции сортировки. В любом случае, я исправил ваш код: codesandbox.io/s/brave-hertz-8lefg?file=/src/App.js
Ответ №1:
Вы определили sort
, что это локальная переменная внутри render
, но во всех местах, где вы пытаетесь получить к ней доступ, вы обращаетесь с ней так, как будто она является членом класса. Поэтому вместо того, чтобы структурировать это так:
class PaientTable extends React.Component {
// ...
render() {
function sort () {
// ...
}
// ...
}
}
Сделай это:
class PaientTable extends React.Component {
// ...
sort() {
// ...
}
render() {
// ...
}
}