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

SvelteKit中调用+page.server.js实现无URL参数的Load More方案问询

解决方案:SvelteKit无URL参数实现加载更多

方案1:使用Form Actions(贴合SvelteKit生态,推荐)

你可以在+page.server.js里定义action处理加载更多请求,把skip放在请求体中传递,完全不会暴露在URL里。

步骤1:在+page.server.js中添加action

// +page.server.js
// 页面初始加载逻辑
export async function load() {
  const initialSkip = 0;
  const limit = 10;
  // 你的MongoDB查询逻辑
  const initialItems = await fetchMongoData(initialSkip, limit);
  return {
    items: initialItems,
    nextSkip: initialSkip + limit
  };
}

// 定义加载更多的action
export const actions = {
  loadMore: async ({ request }) => {
    const formData = await request.formData();
    const skip = parseInt(formData.get('skip'));
    const limit = 10;
    
    const moreItems = await fetchMongoData(skip, limit);
    return {
      moreItems,
      nextSkip: skip + limit
    };
  }
};

步骤2:在+page.svelte中调用action并更新数据

用use:enhance处理表单提交,避免页面刷新,同时更新本地数据:

<script>
  export let data; // 接收load函数返回的初始数据
  let items = data.items;
  let nextSkip = data.nextSkip;
  let isLoading = false;

  async function handleLoadMore(event) {
    isLoading = true;
    // 获取action返回的结果
    const result = await event.detail.apply();
    if (result.type === 'success') {
      items = [...items, ...result.data.moreItems];
      nextSkip = result.data.nextSkip;
    }
    isLoading = false;
  }
</script>

<div>
  {#each items as item}
    <div>{item.content}</div>
  {/each}
</div>

<form method="POST" action="?/loadMore" use:enhance={handleLoadMore}>
  <input type="hidden" name="skip" value={nextSkip} />
  <button type="submit" disabled={isLoading}>
    {isLoading ? '加载中...' : '加载更多'}
  </button>
</form>

方案2:直接Fetch调用Server Endpoint

如果不想用表单,也可以单独写一个+server.js作为API端点,前端用fetch发送POST请求传递skip:

步骤1:创建+server.js

// src/routes/your-path/+server.js
export async function POST({ request }) {
  const { skip, limit } = await request.json();
  const moreItems = await fetchMongoData(skip, limit);
  return new Response(JSON.stringify({
    moreItems,
    nextSkip: skip + limit
  }), {
    headers: { 'Content-Type': 'application/json' }
  });
}

步骤2:在+page.svelte中用fetch调用

<script>
  export let data;
  let items = data.items;
  let nextSkip = data.nextSkip;
  let isLoading = false;

  async function loadMore() {
    isLoading = true;
    const res = await fetch('/your-path', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        skip: nextSkip,
        limit: 10
      })
    });
    const result = await res.json();
    items = [...items, ...result.moreItems];
    nextSkip = result.nextSkip;
    isLoading = false;
  }
</script>

<div>
  {#each items as item}
    <div>{item.content}</div>
  {/each}
</div>

<button on:click={loadMore} disabled={isLoading}>
  {isLoading ? '加载中...' : '加载更多'}
</button>

关于+page.js的角色说明

+page.js是客户端/通用端的load函数,核心作用是:

  • 处理客户端侧的数据逻辑(比如本地缓存、数据过滤转换)
  • 可以调用+page.server.js的load函数(通过fetch或parent方法),但加载更多属于动态操作,不需要通过它触发server端load
  • 如果需要在客户端和服务端共享数据处理逻辑(比如统一分页规则),可以把逻辑写在+page.js里再传递给server端

举个简单的共享逻辑例子:

// +page.js
export async function load({ fetch }) {
  // 调用server端load获取初始数据
  const serverData = await fetch('/your-path').then(res => res.json());
  // 客户端侧额外处理数据
  const processedItems = serverData.items.filter(item => item.isActive);
  return {
    items: processedItems,
    nextSkip: serverData.nextSkip
  };
}

但加载更多的动态操作,直接在+page.svelte里调用action或fetch更直接,+page.js不需要参与这个流程。

内容的提问来源于stack exchange,提问作者Thomas Traum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:05:24