#javascript #json #reactjs
#javascript #json #reactjs
Вопрос:
У меня есть компоненты, которые показывают 3 первых изображения из массива json. Я хочу добавить кнопку, которая заменит эти первые 3 элемента следующими 3 в том же массиве. Я думаю, я что-то здесь упускаю
import React, {Component} from 'react';
import '../App.css';
import ImageList from "./ImageList";
class App extends Component {
constructor() {
super();
this.state = {
images: [],
index: 0
};
this.toNext = this.toNext.bind(this);
}
componentDidMount() {
fetch("https://picsum.photos/v2/list")
.then(res => res.json())
.then(data => {
this.setState({ images: data });
})
.catch(err => {
console.log('Error happened during fetching!', err);
});
}
toNext = () => {
this.setState({index: (this.state.index 3)});
}
render() {
return (
<div className="container">
<h2 className="title">Images list</h2>
<ImageList data={this.state.images}/>
<button onClick={this.toNext} className="next-btn">Next</button>
</div>
)
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.4.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.4.0/umd/react-dom.production.min.js"></script>
Комментарии:
1. возможно, отсутствует компонент imagelist. Я предлагаю вам использовать slice для создания подсписка
2. Кажется, что вы только обновляете
index
, но никогда не используете его.3. Для быстрого исправления попробуйте изменить
<ImageList data={this.state.images}/>
на<ImageList data={this.state.images.slice(this.state.index, this.state.index 3}/>
, но вам нужно будет обработать, что происходит, когда индекс становится больше длины массива, и вы также можете поместить активные изображения в переменную состояния, чтобы избежать повторного нарезки при каждом рендеринге.4. Кроме того, вам не нужен
.bind
этотtoNext
метод, поскольку это функция со стрелкой, которая уже привязана к этомуthis
.
Ответ №1:
Индекс обновляется правильно, но вы не учитываете это обновленное значение. Это может быть достигнуто путем нарезки коллекции изображений в методе рендеринга:
render() {
const minIndex = this.state.index;
const maxIndex = minIndex 3;
return (
<div className="container">
<h2 className="title">Images list</h2>
<ImageList data={this.state.images.slice(minIndex, maxIndex)}/>
<button onClick={this.toNext} className="next-btn">Next</button>
</div>
)
}