You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS对接Pexels API如何实现加载更多分页功能

NextJS对接Pexels API实现点击加载更多分页教程

Pexels API分页规则说明

Pexels的图片查询接口(包括精选图、搜索图接口)统一使用两个参数控制分页:

  • page:要请求的页码,默认值为1,每次加载更多时递增该参数即可获取下一页数据
  • per_page:单页返回的图片数量,取值范围1-80,默认返回15条
    接口返回结果会携带total_results字段,代表符合条件的总图片数,可用来判断是否还有更多数据可加载。

具体实现步骤

1. 标记组件为客户端组件

因为需要监听点击事件、维护本地状态,组件顶部需要添加'use client'声明。

2. 定义所需状态

import { useState, useEffect } from 'react'

// 单页加载数量可自行调整,最大不超过80
const PER_PAGE = 20

export default function Gallery() {
  // 存储所有已加载的图片数据
  const [photos, setPhotos] = useState([])
  // 当前请求的页码
  const [currentPage, setCurrentPage] = useState(1)
  // 加载状态,防止重复点击触发多次请求
  const [isLoading, setIsLoading] = useState(false)
  // 是否还有更多数据可加载
  const [hasMore, setHasMore] = useState(true)

3. 封装Pexels数据请求函数

const fetchPhotos = async (page) => {
    setIsLoading(true)
    try {
      // 如果是搜索类画廊,替换为搜索接口:https://api.pexels.com/v1/search?query=你的搜索关键词&page=${page}&per_page=${PER_PAGE}
      const res = await fetch(`https://api.pexels.com/v1/curated?page=${page}&per_page=${PER_PAGE}`, {
        headers: {
          Authorization: '替换为你自己的Pexels API Key'
        }
      })
      const data = await res.json()
      // 把新请求到的图片数据拼到原有数组末尾
      setPhotos(prev => [...prev, ...data.photos])
      // 校验是否还有下一页数据
      if (page * PER_PAGE >= data.total_results) {
        setHasMore(false)
      }
    } catch (err) {
      console.error('请求Pexels API失败:', err)
    } finally {
      setIsLoading(false)
    }
  }

4. 编写初始加载和点击加载逻辑

// 组件挂载时加载第一页数据
  useEffect(() => {
    fetchPhotos(1)
  }, [])

  // 点击show more按钮触发的逻辑
  const handleLoadMore = () => {
    const nextPage = currentPage + 1
    setCurrentPage(nextPage)
    fetchPhotos(nextPage)
  }

5. 渲染画廊和加载按钮

return (
    <div>
      {/* 替换为你自己的画廊布局代码 */}
      <div className="grid grid-cols-3 gap-4">
        {photos.map(photo => (
          <img key={photo.id} src={photo.src.medium} alt={photo.alt} />
        ))}
      </div>
      {/* 没有更多数据时自动隐藏按钮 */}
      {hasMore && (
        <button 
          onClick={handleLoadMore}
          disabled={isLoading}
          className="mt-8 px-4 py-2 bg-blue-500 text-white rounded"
        >
          {isLoading ? '加载中...' : 'show more'}
        </button>
      )}
    </div>
  )
}

注意事项

  • 生产环境建议将Pexels API请求通过后端转发,避免直接在前端暴露API Key导致泄露
  • Pexels API有请求频率限制,每小时最多请求200次,建议做好请求缓存避免触发限流

内容的提问来源于stack exchange,提问作者Vitor Lacerda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:15:08