上拉加载 + 下拉刷新 + 后端数据

103 阅读1分钟

1.第一种方式:

import React, { useEffect, useState } from 'react'

import { ProductCard, PullRefresh, Toast, List } from 'react-vant';

import axios from 'axios'

// 模拟异步请求

async function getData(throwError) {

  return new Promise((resolve, reject) => {

    setTimeout(async() => {

      if (throwError) {

        reject(new Error('error'))

      }

      resolve((await axios.get('http://127.0.0.1:3010/getGoods')).data.data)

    }, 2000)

  })

}

export default function Hot() {

  const [list, setList] = useState([])

  const [finished, setFinished] = useState(false)

  const [count,setCount] = useState(-1)

  let pagesize = 5

  const onLoadRefresh = async() => {

    setCount(count+1)

    const data = await getData()

    if(count>=data.length/pagesize){

      setCount(-1)

      setList([])

    }else{

      setCount(count+1)

    }

    let oldData = [...list]

    let newData = data.slice((count-1)pagesize,countpagesize)

    const newList = [...newData,...oldData]

    // if (newList.length >= 12) {

    //  setFinished(true)

    // }

    setList(newList)

  }

  const onRefresh = (showToast) => {

    return new Promise( async resolve => {

      setTimeout(() => {

        if (showToast) {

          Toast.info('刷新成功')

        }else{

          Toast.info('没有数据了')

        }

        resolve(true)

      }, 1000)

    })

  }

  return (

    <div style={{ height: '100%' }} >

      <PullRefresh

        onRefresh={() => onRefresh(true)}

        onRefreshEnd={() => console.log('onRefreshEnd')}

      >

        <div style={{ height: '900px' }}>

         

            {list.map((item, i) => (

              <ProductCard

                tag="标签"

                num="2"

                price="2.00"

                originPrice="10.00"

                desc="描述信息"

                title={item.name}

                thumb="img.yzcdn.cn/vant/ipad.j…"

              />

            ))}

         

       

     

   

  )

}

2.第二种方式:

import React, { useEffect, useState } from 'react'

import { ProductCard, PullRefresh, Toast, List } from 'react-vant';

import axios from 'axios'

import './index.scss'

// redux

import { changeCount } from '../../../../store/slice/hot'

import { connect } from 'react-redux';

function Hot(props) {

  const [zong,setZong] = useState([])

  const [list, setList] = useState([])

  const [finished, setFinished] = useState(false)

  const [count,setCount] = useState(1)

  const [pageSize,setPageSize] = useState(6)

  // 模拟异步请求

  async function getData(throwError) {

    return new Promise((resolve, reject) => {

      setTimeout(async () => {

        if (throwError) {

          reject(new Error('error'))

        }

        let zong = (await axios.get('http://127.0.0.1:3010/getGoods')).data.data

        setZong([...zong])

        resolve(zong.slice((count - 1) * pageSize, count * pageSize))

      }, 2000)

    })

  }

  const onLoadRefresh = async (isRefresh) => {

    // props.changeCount(count)

    // 新数据

    const data = await getData()

    if (count <= 3) {

      setCount(count+1)

    } else {

      Toast.info('没有数据了')

    }

    setList(v => {

      const newList = isRefresh ? data : [...data,...list]

      // setFinished(true)

      return newList

    })

  }

  const onRefresh = async () => {

    setFinished(false)

    await onLoadRefresh(1)

  }

  console.log(finished,'finished');

  return (

    <PullRefresh

      onRefresh={() => onRefresh(true)}

    >

      {/* 通过finished来控制是否需要再触发load事件,去加载 */}

     

        {list.map((item, i) => (

          <ProductCard

            tag="标签"

            num="2"

            price="2.00"

            originPrice="10.00"

            desc="描述信息"

            title={item.name}

            thumb="img.yzcdn.cn/vant/ipad.j…"

          />

        ))}

     

   

  )

}

const mapStateFromProps = state => {

  return {

    // count:state.hot.count

  }

}

const mapDispatchFromProps = dispatch => {

  return {

    changeCount(count) {

      dispatch(changeCount(count))

    }

  }

}

export default connect(mapStateFromProps, mapDispatchFromProps)(Hot)