求封装一个列表加载更多的组件

#1

要封装一个加载更多的组件,功能都已经实现了。很多页面都需要这样的功能,又不想重复代码,求好的方案。
打开后发起一个请求,返回结果,如果点下面的加载更多,则发起新的请求,只是地址参数中page加1

export default class ListLoadingComponent extends React.Component {
  constructor(props, context) {
    super(props, context);
    this.state = {
      data: [],
      hasMore: false,
      isLoadingMore: false,
      page: 1,
    }
  }

  componentDidMount() {
    this.loadFirstPageData()
  }

  fetch(url) {
    return fetch(url, {
      credentials: 'include',
      headers: {
        'Accept': 'application/json, text/plain, */*'
      }
    }).then(res => res.json())
  }

  loadFirstPageData() {
    const result = this.fetch(this.props.url)
    this.resultHandle(result)
  }

  loadMoreData() {
    this.setState({
      isLoadingMore: true
    })

    const result = this.fetch(this.props.url)

    setTimeout(() => {
      this.resultHandle(result)
      this.setState({
        isLoadingMore: false
      })
    }, 1000)
  }

  resultHandle(result) {
    result.then(res => {
      this.setState({
        page: ++this.state.page,
        // TODO 返回结果里必须带有这个字段
        hasMore: res.hasMore,
        data: this.state.data.concat(res.data)
      })
    })
  }

  clickHandle() {
    this.props.loadMoreFn();
  }

  render() {
    return (
      <div className="List-loading-container">
        {this.props.children}
        <LoadMoreComponent
          isLoadingMore={this.state.isLoadingMore}
          loadMoreFn={this.loadMoreData.bind(this)}>
        </LoadMoreComponent>
      </div>
    )
  }
}

更多按钮组件

import React from 'react'

import './style.styl'

export default class LoadMoreComponent extends React.Component {
  constructor(props, context) {
    super(props, context);
  }


  clickHandle() {
    this.props.loadMoreFn();
  }

  render() {
    return (
      <div className="load-more">
        {
          this.props.isLoadingMore ?
          <span>加载中...</span> :
          <span onClick={this.clickHandle.bind(this)}>加载更多</span>
        }
      </div>
    )
  }
}

#2

自己搞出来了,详见: https://segmentfault.com/q/1010000011815570/a-1020000011818591