<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Alova.JS Blog</title>
        <link>https://alova.js.org/zh-CN/blog</link>
        <description>Alova.JS Blog</description>
        <lastBuildDate>Thu, 30 Jul 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <item>
            <title><![CDATA[axios 和 alova 一起用，谁管什么]]></title>
            <link>https://alova.js.org/zh-CN/blog/compare/axios</link>
            <guid>https://alova.js.org/zh-CN/blog/compare/axios</guid>
            <pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[axios 和 alova 不是竞争关系。axios 负责发请求，alova 负责怎么请求——分页、缓存、重试；axios 可以直接作为 alova 的请求适配器继续工作。]]></description>
            <content:encoded><![CDATA[<p><strong>一句话：它们是分层关系，不是二选一。</strong> axios 是 HTTP 客户端，负责把请求发出去；alova 是请求策略层，负责「怎么请求」——分页、缓存、重试、去重、token 刷新。alova 可以把 axios 用作请求适配器（<code>@alova/adapter-axios</code>），所以选 alova 从来不意味着扔掉 axios。</p>
<p>alova 的定位：一套请求 API，跑在 Web、App（uni-app/Taro/小程序）、服务端（BFF）。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="分工表">分工表<a href="https://alova.js.org/zh-CN/blog/compare/axios#%E5%88%86%E5%B7%A5%E8%A1%A8" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>关注点</th><th>axios</th><th>alova</th></tr></thead><tbody><tr><td>发送 HTTP 请求</td><td>✅ 本职</td><td>交给适配器（fetch / XHR / <strong>axios</strong> / uni-app / Taro）</td></tr><tr><td>拦截器</td><td>✅</td><td>✅ <code>beforeRequest</code> / <code>responded</code>（你的 axios 拦截器继续生效）</td></tr><tr><td>loading / error / data 状态</td><td>手写</td><td>✅ <code>useRequest</code> 等自动管理</td></tr><tr><td>分页、表单、上传、SSE 流程</td><td>手写</td><td>✅ 20+ 现成策略 hooks</td></tr><tr><td>响应缓存</td><td>手写</td><td>✅ 多级缓存（L1/L2）＋声明式失效</td></tr><tr><td>相同并发请求去重</td><td>手写</td><td>✅ 内置请求共享</td></tr><tr><td>跨端（uni-app / Taro / 小程序）</td><td>社区封装</td><td>✅ 官方适配器，同一套 API</td></tr><tr><td>服务端重试 / 限流</td><td>手写</td><td>✅ <code>alova/server</code></td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="axios-实打实更强的地方">axios 实打实更强的地方<a href="https://alova.js.org/zh-CN/blog/compare/axios#axios-%E5%AE%9E%E6%89%93%E5%AE%9E%E6%9B%B4%E5%BC%BA%E7%9A%84%E5%9C%B0%E6%96%B9" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>诚实的对比要写两面：</p>
<ul>
<li class=""><strong>生态与熟悉度。</strong> axios 拥有 JavaScript 世界最大的社区之一，几乎每个边角问题都有现成答案，几乎每个开发者都用过它；alova 的社区规模远小于它。</li>
<li class=""><strong>团队零学习成本。</strong> 所有人都会 <code>axios.get()</code>；alova 引入了 <code>Method</code> 抽象和策略 hooks，这是真实存在的（虽然不大的）心智负担。</li>
<li class=""><strong>请求本来就少的项目</strong>，axios 单独用就够了。策略层只有在你反复手写同样的请求逻辑时才值回票价。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="两个一起用长什么样">两个一起用长什么样<a href="https://alova.js.org/zh-CN/blog/compare/axios#%E4%B8%A4%E4%B8%AA%E4%B8%80%E8%B5%B7%E7%94%A8%E9%95%BF%E4%BB%80%E4%B9%88%E6%A0%B7" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>保留你现有的 axios 实例——包括拦截器和 <code>baseURL</code>——让 alova 来驱动它：</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> axios </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">'axios'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> createAlova </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">'alova'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> axiosRequestAdapter </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">'@alova/adapter-axios'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> VueHook </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">'alova/vue'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">// 你现有的 axios 实例，一行不改</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> customAxios </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> axios</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token function" style="color:hsl(221, 87%, 60%)">create</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:hsl(5, 74%, 59%)">baseURL</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">'/api'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:hsl(5, 74%, 59%)">timeout</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">10000</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> alovaInst </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">createAlova</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token literal-property property" style="color:hsl(5, 74%, 59%)">statesHook</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> VueHook</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token literal-property property" style="color:hsl(5, 74%, 59%)">requestAdapter</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">axiosRequestAdapter</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:hsl(5, 74%, 59%)">axios</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> customAxios </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></div></code></pre></div></div>
<p>Vue 3 里一个普通请求的前后对比：</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">// 只用 axios：手写三个状态</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> loading </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">ref</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token boolean" style="color:hsl(35, 99%, 36%)">false</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> data </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">ref</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> error </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">ref</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">null</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">load</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">async</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">try</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    loading</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token plain">value </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">true</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    data</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token plain">value </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">await</span><span class="token plain"> customAxios</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token function" style="color:hsl(221, 87%, 60%)">get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">'/todos'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">e</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    error</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token plain">value </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> e</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  loading</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token plain">value </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">false</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token function" style="color:hsl(221, 87%, 60%)">onMounted</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">load</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">// axios + alova：状态自动管理</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> loading</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> data</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> error </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">useRequest</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">alovaInst</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token function" style="color:hsl(221, 87%, 60%)">Get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">'/todos'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></div></code></pre></div></div>
<p>你为 axios 做的配置全部继续有效：method 配置支持 axios 的全部请求选项；拦截器顺序也是确定的——alova 的 <code>beforeRequest</code> 先于 axios 请求拦截器触发，alova 的 <code>responded</code> 晚于 axios 响应拦截器触发。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="什么情况下你不需要-alova">什么情况下你不需要 alova<a href="https://alova.js.org/zh-CN/blog/compare/axios#%E4%BB%80%E4%B9%88%E6%83%85%E5%86%B5%E4%B8%8B%E4%BD%A0%E4%B8%8D%E9%9C%80%E8%A6%81-alova" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<ul>
<li class="">项目请求本来就少，没有反复出现的分页/缓存/重试样板——直接用 axios 就是正确选择。</li>
<li class="">纯 React、纯 Web、且已深度使用 React Query——除非你需要跨端或服务端策略，否则切换收益不大。</li>
<li class="">你想要零抽象的技术栈——alova 的 <code>Method</code> + hooks 模型是多一层概念，这个成本是真实的。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="下一步">下一步<a href="https://alova.js.org/zh-CN/blog/compare/axios#%E4%B8%8B%E4%B8%80%E6%AD%A5" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://alova.js.org/zh-CN/tutorial/project/migration/from-axios">从 axios 迁移</a>——渐进式，一次迁一个接口；实例和拦截器原样保留。</li>
<li class=""><a class="" href="https://alova.js.org/zh-CN/resource/request-adapter/axios">axios 请求适配器</a>——适配器完整选项。</li>
<li class=""><a class="" href="https://alova.js.org/zh-CN/about/comparison">与其他库对比</a>——react-query / swr / alova 横向对照。</li>
</ul>]]></content:encoded>
            <category>axios</category>
            <category>对比</category>
        </item>
        <item>
            <title><![CDATA[uni-app 分页列表：用一个 hook 解决竞态、重复请求和加载状态]]></title>
            <link>https://alova.js.org/zh-CN/blog/blog/uniapp-pagination</link>
            <guid>https://alova.js.org/zh-CN/blog/blog/uniapp-pagination</guid>
            <pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[手写 uni-app 分页加载常见的竞态、重复请求、边界判断问题，以及如何用 alova 的 usePagination 一次解决。含完整可运行代码与在线示例。]]></description>
            <content:encoded><![CDATA[<p>你大概也在 uni-app 项目里写过这样的分页加载——<code>onReachBottom</code> 里加一页、发请求、拼数组：</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">setup</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">import</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"> ref </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">from</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">'vue'</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">import</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"> onReachBottom</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"> onPullDownRefresh </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">from</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">'@dcloudio/uni-app'</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token script language-javascript"> list </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">ref</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token script language-javascript"> page </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">ref</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript number" style="color:hsl(35, 99%, 36%)">1</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token script language-javascript"> loading </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">ref</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript boolean" style="color:hsl(35, 99%, 36%)">false</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token script language-javascript"> </span><span class="token script language-javascript function-variable function" style="color:hsl(221, 87%, 60%)">loadList</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">async</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  loading</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript">value </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript boolean" style="color:hsl(35, 99%, 36%)">true</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token script language-javascript"> res </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">await</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token script language-javascript"> </span><span class="token script language-javascript class-name" style="color:hsl(35, 99%, 36%)">Promise</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript parameter">resolve</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    uni</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">request</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">      </span><span class="token script language-javascript literal-property property" style="color:hsl(5, 74%, 59%)">url</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript template-string template-punctuation string" style="color:hsl(119, 34%, 47%)">`</span><span class="token script language-javascript template-string string" style="color:hsl(119, 34%, 47%)">https://api.example.com/goods?page=</span><span class="token script language-javascript template-string interpolation interpolation-punctuation punctuation" style="color:hsl(119, 34%, 47%)">${</span><span class="token script language-javascript template-string interpolation">page</span><span class="token script language-javascript template-string interpolation punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript template-string interpolation">value</span><span class="token script language-javascript template-string interpolation interpolation-punctuation punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript template-string string" style="color:hsl(119, 34%, 47%)">&amp;pageSize=10</span><span class="token script language-javascript template-string template-punctuation string" style="color:hsl(119, 34%, 47%)">`</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">      </span><span class="token script language-javascript literal-property property" style="color:hsl(5, 74%, 59%)">success</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> resolve</span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  list</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript">value </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">...</span><span class="token script language-javascript">list</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript">value</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">...</span><span class="token script language-javascript">res</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript">data</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript">list</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  loading</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript">value </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript boolean" style="color:hsl(35, 99%, 36%)">false</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">onReachBottom</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  page</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript">value</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">++</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">loadList</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">onPullDownRefresh</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">async</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  page</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript">value </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript number" style="color:hsl(35, 99%, 36%)">1</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  list</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript">value </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">await</span><span class="token script language-javascript"> </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">loadList</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  uni</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">stopPullDownRefresh</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">loadList</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><br></div></code></pre></div></div>
<p>这段代码能跑，但里面至少埋了 3 个问题，你可能已经在线上遇到过其中一两个：</p>
<ol>
<li class=""><strong>竞态</strong>：用户快速滚动触发两次 <code>onReachBottom</code>，第 2 页和第 3 页的请求同时在飞。谁先回来谁先拼进数组——弱网下第 3 页完全可能先到，列表顺序就乱了。</li>
<li class=""><strong>重复请求</strong>：<code>onReachBottom</code> 在部分平台会连续触发多次，没有防重，同一页数据会被请求并拼接两遍。</li>
<li class=""><strong>边界缺失</strong>：没有"是不是最后一页"的判断，滚到底还在发空请求；下拉刷新和加载更多共用一个 <code>loading</code>，刷新时列表先被清空再慢慢回填，页面会闪。</li>
</ol>
<p>要把这三个坑都补上，还得加：请求去重的标记位、按页码丢弃过期响应、<code>isLastPage</code> 计算、刷新与追加两套状态……手写下来通常是几十行和列表业务无关的样板代码，而且每个列表页都要再来一遍。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="理想的分页方案需要什么">理想的分页方案需要什么<a href="https://alova.js.org/zh-CN/blog/blog/uniapp-pagination#%E7%90%86%E6%83%B3%E7%9A%84%E5%88%86%E9%A1%B5%E6%96%B9%E6%A1%88%E9%9C%80%E8%A6%81%E4%BB%80%E4%B9%88" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>先不谈任何库，一个"不出事"的分页实现至少要内建这些能力：</p>
<ul>
<li class=""><strong>请求级去重</strong>：同参数请求在飞时不重发；</li>
<li class=""><strong>响应按页归位</strong>：晚到的旧页响应不能覆盖新页；</li>
<li class=""><strong>追加/刷新两种模式</strong>：加载更多是追加，下拉刷新是重置；</li>
<li class=""><strong>边界状态</strong>：<code>isLastPage</code>、<code>total</code>、加载中/预加载中要能直接拿到；</li>
<li class=""><strong>跨端可用</strong>：同一套代码要能跑在小程序、H5、App。</li>
</ul>
<p>最后一点是 uni-app 场景的特殊约束——React Query、SWR 这类方案默认面向浏览器 <code>fetch</code>，在小程序环境（<code>uni.request</code>）里没有官方适配。这也是很多 uni-app 项目最终还是回到手写的原因。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="用-usepagination-实现">用 usePagination 实现<a href="https://alova.js.org/zh-CN/blog/blog/uniapp-pagination#%E7%94%A8-usepagination-%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p><a href="https://alova.js.org/" target="_blank" rel="noopener noreferrer" class="">alova</a> 是一个请求策略库：一套请求 API，跑在 Web、App（uni-app/Taro）、服务端（BFF）。它通过 <code>@alova/adapter-uniapp</code> 适配器直接使用 <code>uni.request</code> 发请求，上层的 <code>usePagination</code> 策略 hook 把上面那份需求清单全部内建了。</p>
<p>安装（注意：uni-app 适配器目前仅支持 Vue 3 版本的 uni-app）：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token function" style="color:hsl(221, 87%, 60%)">npm</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">install</span><span class="token plain"> alova @alova/adapter-uniapp @alova/shared </span><span class="token parameter variable" style="color:hsl(221, 87%, 60%)">--save</span><br></div></code></pre></div></div>
<p>创建 alova 实例，适配器一次性提供请求适配、存储适配和 VueHook：</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">// api/index.js</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> createAlova </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">'alova'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> AdapterUniapp </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">'@alova/adapter-uniapp'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">export</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> alovaInst </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">createAlova</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token literal-property property" style="color:hsl(5, 74%, 59%)">baseURL</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">'https://api.example.com'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token operator" style="color:hsl(221, 87%, 60%)">...</span><span class="token function" style="color:hsl(221, 87%, 60%)">AdapterUniapp</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token function" style="color:hsl(221, 87%, 60%)">responded</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">response</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> statusCode</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> data </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> response</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">statusCode </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;=</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">400</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">throw</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Error</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">'request error'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> data </span><span class="token operator" style="color:hsl(221, 87%, 60%)">||</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">null</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></div></code></pre></div></div>
<p>列表页完整实现——之前手写的页码管理、竞态防护、边界判断、双 loading，现在都由 hook 返回：</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">template</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">view</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">v-for</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(119, 34%, 47%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag attr-value" style="color:hsl(119, 34%, 47%)">item in data</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">:key</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(119, 34%, 47%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag attr-value" style="color:hsl(119, 34%, 47%)">item.id</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(119, 34%, 47%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag attr-value" style="color:hsl(119, 34%, 47%)">goods-item</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    {{ item.name }}</span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">view</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">view</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">v-if</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(119, 34%, 47%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag attr-value" style="color:hsl(119, 34%, 47%)">loading</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain">加载中...</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">view</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">view</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">v-if</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(119, 34%, 47%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag attr-value" style="color:hsl(119, 34%, 47%)">isLastPage</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain">没有更多了</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">view</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">template</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">setup</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">import</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"> usePagination </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">from</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">'alova/client'</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">import</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"> onReachBottom</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"> onPullDownRefresh </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">from</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">'@dcloudio/uni-app'</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">import</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"> alovaInst </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">from</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">'@/api'</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token script language-javascript"> </span><span class="token script language-javascript function-variable function" style="color:hsl(221, 87%, 60%)">queryGoods</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript parameter">page</span><span class="token script language-javascript parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript parameter"> pageSize</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  alovaInst</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">Get</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">'/goods'</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token script language-javascript literal-property property" style="color:hsl(5, 74%, 59%)">params</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"> page</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"> pageSize </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"> loading</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"> data</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"> page</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"> isLastPage</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"> total</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"> reload </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">usePagination</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript parameter">page</span><span class="token script language-javascript parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript parameter"> pageSize</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token script language-javascript"> </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">queryGoods</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript">page</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"> pageSize</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token script language-javascript literal-property property" style="color:hsl(5, 74%, 59%)">append</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript boolean" style="color:hsl(35, 99%, 36%)">true</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript">        </span><span class="token script language-javascript comment" style="color:hsl(230, 4%, 64%)">// 追加模式：下一页数据自动拼到列表底部</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token script language-javascript literal-property property" style="color:hsl(5, 74%, 59%)">initialPageSize</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript number" style="color:hsl(35, 99%, 36%)">10</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token script language-javascript function-variable function" style="color:hsl(221, 87%, 60%)">data</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript parameter">response</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token script language-javascript"> response</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript">list</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token script language-javascript function-variable function" style="color:hsl(221, 87%, 60%)">total</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript parameter">response</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token script language-javascript"> response</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript">total</span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript comment" style="color:hsl(230, 4%, 64%)">// 加载更多：只改页码，去重、竞态、末页判断都在 hook 内部处理</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">onReachBottom</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">if</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">!</span><span class="token script language-javascript">isLastPage</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript">value</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    page</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript">value</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">++</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript comment" style="color:hsl(230, 4%, 64%)">// 下拉刷新：reload 重置到第一页</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">onPullDownRefresh</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">async</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">await</span><span class="token script language-javascript"> </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">reload</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">  uni</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">stopPullDownRefresh</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><br></div></code></pre></div></div>
<p>对比一下：业务代码只剩"页码 +1"和"reload"两个动作，之前那 3 个坑对应的防护逻辑（请求共享去重、响应归位、<code>isLastPage</code>）都不需要你自己维护。<code>usePagination</code> 还默认开启相邻页预加载，翻页时下一页往往已经在缓存里。</p>
<p>同一份代码编译到微信小程序、H5、App 均可运行——发请求的始终是 <code>uni.request</code>，alova 只负责"怎么请求"这一层。如果你的项目已经在用 axios（H5 端），它同样可以通过 <code>@alova/adapter-axios</code> 作为 alova 的请求适配器继续工作，拦截器逻辑不用动。</p>
<p>在线示例（含分页、下拉加载等 24+ 个可运行例子）：<a href="https://alova.js.org/examples/" target="_blank" rel="noopener noreferrer" class="">alova.js.org/examples</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="什么情况下你不需要它">什么情况下你不需要它<a href="https://alova.js.org/zh-CN/blog/blog/uniapp-pagination#%E4%BB%80%E4%B9%88%E6%83%85%E5%86%B5%E4%B8%8B%E4%BD%A0%E4%B8%8D%E9%9C%80%E8%A6%81%E5%AE%83" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>诚实地说，以下场景手写就够了，引入任何请求库都是多余：</p>
<ul>
<li class=""><strong>列表只有一页、或数据量固定</strong>：一个 <code>uni.request</code> 加一个 <code>ref</code> 就是最优解。</li>
<li class=""><strong>项目只跑 H5 且已深度使用 React Query/SWR</strong>：它们在纯浏览器环境很成熟，没必要为单端项目换方案。</li>
<li class=""><strong>uni-app Vue 2 项目</strong>：<code>@alova/adapter-uniapp</code> 仅支持 Vue 3，Vue 2 项目请评估后再引入。</li>
<li class=""><strong>团队已有稳定的分页封装且经过线上验证</strong>：能跑的老代码比新依赖更可靠，等重构窗口再说。</li>
</ul>
<p>反过来，如果你的项目里有多个分页/下拉加载列表、踩过竞态或重复请求的线上问题、或者要同时维护小程序 + H5 + App 三端，<code>usePagination</code> 值得试一次：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token function" style="color:hsl(221, 87%, 60%)">npm</span><span class="token plain"> i alova</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>uniapp</category>
            <category>分页</category>
            <category>usePagination</category>
        </item>
    </channel>
</rss>