Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как правильно сделать бесконечный скролл с автоматической загрузкой контента (React.j (https://javascript.ru/forum/dom-window/78575-kak-pravilno-sdelat-beskonechnyjj-skroll-s-avtomaticheskojj-zagruzkojj-kontenta-react-j.html)

darktowerk56c 06.10.2019 09:57

Как правильно сделать бесконечный скролл с автоматической загрузкой контента (React.j
 
Всем привет, подскажите, пожалуйста, как реализовать следующее:
При инициализации компонента у меня происходит ajax запрос в ответе приходит массив с десятью объектами, например их 10.
И следующим образом в компоненте я рендерю данные на страницу:
return (
  <div className="book">

    <table className="highlight">
      <thead>
      <tr>
        <th>Имя</th>
        <th>Город</th>
        <th>Номер телефона</th>
        <th/>
      </tr>
      </thead>

      <tbody>
      {
        books &&
        books.map((book) => {
          return (
            <tr key={book.pbnum}>
              <td>{book.pbfirstName} {book.pblastName}</td>
              <td>{book.pbcity}</td>
              <td>{book.pbphoneNumber}</td>
              <td/>
              <td>
                <Link
                  className="waves-effect waves-light btn"
                  to={`/book/${book._id}/edit?allow=true`}
                >Редактировать</Link>
              </td>
            </tr>
          )
        })
      }
      </tbody>
    </table>
  </div>
)

Затем у меня есть функция, которая срабатывает в случае если я доскроллил до низа страница, и в этой функции я делаю снова ajax запрос, в ответе приходит следующие десять записей и так далее.
Без react.js я использовал бы:
ParentNode.append()
https://developer.mozilla.org/ru/doc...entNode/append
В общаем добавлял бы html с новыми данными в конец документа уже загруженным данным.
Как правильно реализовать ту же идею в случае с react. Т.е. оставлять уже отредеренные данные и map новые данные, которые приходят в ответе ajax, когда я доскроллил до конца документа. Как я выше описал логика скролла описана, ajax запрос и ответ, всё есть, нужно понимание как добавлять данные к существующим.

SuperZen 07.10.2019 15:56

import React from 'react'

class App extends React.Component {

  constructor(props) {
    super(props)
    this.state = {
      data: []
    }

    this.genData = this.genData.bind(this)
  }

  genData() {
    this.setState(currentData => ({
      ...currentData,
      data: [
        ...currentData.data,
        ...Array
          .from({ length: 10 }, (_, id) =>
            ({
              id: id + this.state.data.length,
              value: Math.random() * 100
            })
          )
      ]
    }))
  }

  componentDidMount() {
    this.genData()
  }

  render() {
    return <React.Fragment>
      {this.state.data.map(({ id, value }) => <div key={id}>{value}</div>)}
      <button onClick={this.genData}>load more</button>
    </React.Fragment>
  }
}
export default App


Часовой пояс GMT +3, время: 07:05.