<?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/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>en</language>
        <item>
            <title><![CDATA[axios and alova, who handles what]]></title>
            <link>https://alova.js.org/blog/compare/axios</link>
            <guid>https://alova.js.org/blog/compare/axios</guid>
            <pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[axios and alova are not competitors. axios sends requests; alova decides how requests run — pagination, caching, retry — and can use axios as its adapter.]]></description>
            <content:encoded><![CDATA[<p><strong>Short answer: they are layers, not rivals.</strong> axios is an HTTP client — it sends requests. alova is a request strategy layer — it decides <em>how</em> requests run: pagination, caching, retry, deduplication, token refresh. alova can use axios as its request adapter (<code>@alova/adapter-axios</code>), so choosing alova never means throwing axios away.</p>
<p>alova in one line: one set of request APIs that runs on the web, in apps (uni-app / Taro / mini-programs), and on the server (BFF).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="division-of-work">Division of work<a href="https://alova.js.org/blog/compare/axios#division-of-work" class="hash-link" aria-label="Direct link to Division of work" title="Direct link to Division of work" translate="no">​</a></h2>
<table><thead><tr><th>Concern</th><th>axios</th><th>alova</th></tr></thead><tbody><tr><td>Sending HTTP requests</td><td>✅ its job</td><td>Delegates to an adapter (fetch / XHR / <strong>axios</strong> / uni-app / Taro)</td></tr><tr><td>Interceptors</td><td>✅</td><td>✅ <code>beforeRequest</code> / <code>responded</code> (your axios interceptors keep working)</td></tr><tr><td>Loading / error / data states</td><td>Hand-written</td><td>✅ auto-managed by <code>useRequest</code> and friends</td></tr><tr><td>Pagination, form, upload, SSE flows</td><td>Hand-written</td><td>✅ 20+ ready-made strategy hooks</td></tr><tr><td>Response caching</td><td>Hand-written</td><td>✅ multi-level cache (L1/L2) with declarative invalidation</td></tr><tr><td>Deduplicating identical concurrent requests</td><td>Hand-written</td><td>✅ built-in request sharing</td></tr><tr><td>Cross-platform (uni-app / Taro / mini-programs)</td><td>Community wrappers</td><td>✅ official adapters, same API everywhere</td></tr><tr><td>Server-side retry / rate limiting</td><td>Hand-written</td><td>✅ <code>alova/server</code> hooks</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-axios-is-genuinely-stronger">Where axios is genuinely stronger<a href="https://alova.js.org/blog/compare/axios#where-axios-is-genuinely-stronger" class="hash-link" aria-label="Direct link to Where axios is genuinely stronger" title="Direct link to Where axios is genuinely stronger" translate="no">​</a></h2>
<p>An honest comparison cuts both ways:</p>
<ul>
<li class=""><strong>Ecosystem and familiarity.</strong> axios has one of the largest communities in the JavaScript world. Nearly every edge case has a Stack Overflow answer; nearly every developer has used it. alova's community is far smaller.</li>
<li class=""><strong>Zero learning curve for your team.</strong> Everyone already knows <code>axios.get()</code>. alova introduces a <code>Method</code> abstraction and strategy hooks — a real (if small) mental shift.</li>
<li class=""><strong>If you only send a handful of requests</strong>, axios alone is simply enough. A strategy layer earns its keep only when you keep rewriting the same request logic.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-using-both-looks-like">What using both looks like<a href="https://alova.js.org/blog/compare/axios#what-using-both-looks-like" class="hash-link" aria-label="Direct link to What using both looks like" title="Direct link to What using both looks like" translate="no">​</a></h2>
<p>Keep your axios instance — including its interceptors and <code>baseURL</code> — and let alova drive it:</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%)">// your existing axios instance, untouched</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>Before / after for a plain request in 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 only: hand-written states</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: states managed for you</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>Everything you configured for axios still applies: method config accepts all axios request options, and interceptor order is predictable — alova's <code>beforeRequest</code> fires before axios request interceptors, and alova's <code>responded</code> fires after axios response interceptors.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-you-dont-need-alova">When you don't need alova<a href="https://alova.js.org/blog/compare/axios#when-you-dont-need-alova" class="hash-link" aria-label="Direct link to When you don't need alova" title="Direct link to When you don't need alova" translate="no">​</a></h2>
<ul>
<li class="">Your project fires only a few requests with no repeated pagination/caching/retry patterns — plain axios is the right call.</li>
<li class="">You are React-only, web-only, and already invested in React Query — switching buys you little unless you need cross-platform or server-side strategies.</li>
<li class="">You want a zero-abstraction stack — alova's <code>Method</code> + hooks model is one more concept, and that cost is real.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">Next steps<a href="https://alova.js.org/blog/compare/axios#next-steps" class="hash-link" aria-label="Direct link to Next steps" title="Direct link to Next steps" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://alova.js.org/tutorial/project/migration/from-axios">Migrate from axios</a> — gradual, one endpoint at a time; your instance and interceptors stay.</li>
<li class=""><a class="" href="https://alova.js.org/resource/request-adapter/axios">axios request adapter</a> — full adapter options.</li>
<li class=""><a class="" href="https://alova.js.org/about/comparison">Compare with other libraries</a> — react-query / swr / alova side by side.</li>
</ul>]]></content:encoded>
            <category>axios</category>
            <category>comparison</category>
        </item>
        <item>
            <title><![CDATA[uni-app pagination with one hook: race conditions, duplicate requests, loading state]]></title>
            <link>https://alova.js.org/blog/blog/uniapp-pagination</link>
            <guid>https://alova.js.org/blog/blog/uniapp-pagination</guid>
            <pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The race conditions, duplicate requests, and missing edge cases of hand-written uni-app pagination — and how alova's usePagination solves them all. With runnable code and a live demo.]]></description>
            <content:encoded><![CDATA[<p>You've probably written pagination like this in a uni-app project — bump the page inside <code>onReachBottom</code>, fire a request, concatenate the array:</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>It runs, but it hides at least three problems you've probably hit in production:</p>
<ol>
<li class=""><strong>Race conditions</strong>: a user scrolls fast and triggers <code>onReachBottom</code> twice — pages 2 and 3 are both in flight. Whichever returns first gets concatenated first; on a weak network page 3 can easily arrive first, scrambling the list order.</li>
<li class=""><strong>Duplicate requests</strong>: on some platforms <code>onReachBottom</code> fires several times in a row with no dedupe, so the same page is requested and appended twice.</li>
<li class=""><strong>Missing edge cases</strong>: there's no "is this the last page" check, so it keeps firing empty requests at the bottom; pull-to-refresh and load-more share one <code>loading</code> flag, so the list flashes empty then slowly refills on refresh.</li>
</ol>
<p>Fixing all three means adding: a dedupe flag, dropping stale responses by page number, an <code>isLastPage</code> calculation, and two separate states for refresh vs. append... Hand-written, that's usually dozens of lines of boilerplate unrelated to your list, and you repeat it on every list page.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-an-ideal-pagination-solution-needs">What an ideal pagination solution needs<a href="https://alova.js.org/blog/blog/uniapp-pagination#what-an-ideal-pagination-solution-needs" class="hash-link" aria-label="Direct link to What an ideal pagination solution needs" title="Direct link to What an ideal pagination solution needs" translate="no">​</a></h2>
<p>Forget any library for a moment. A "safe" pagination implementation needs at least:</p>
<ul>
<li class=""><strong>Request-level dedupe</strong>: don't resend an in-flight request with the same params;</li>
<li class=""><strong>Responses land by page</strong>: a late response for an older page must not overwrite a newer one;</li>
<li class=""><strong>Append / refresh modes</strong>: load-more appends, pull-to-refresh resets;</li>
<li class=""><strong>Edge state</strong>: <code>isLastPage</code>, <code>total</code>, loading / preloading should be directly available;</li>
<li class=""><strong>Cross-platform</strong>: the same code must run in mini-programs, H5, and App.</li>
</ul>
<p>The last point is the special constraint of uni-app — React Query and SWR target the browser's <code>fetch</code> by default and have no official adapter for the mini-program environment (<code>uni.request</code>). That's also why many uni-app projects end up back at hand-written pagination.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-usepagination">Using usePagination<a href="https://alova.js.org/blog/blog/uniapp-pagination#using-usepagination" class="hash-link" aria-label="Direct link to Using usePagination" title="Direct link to Using usePagination" translate="no">​</a></h2>
<p><a href="https://alova.js.org/" target="_blank" rel="noopener noreferrer" class="">alova</a> is a request strategy library: one set of request APIs that runs on the web, in apps (uni-app / Taro / mini-programs), and on the server (BFF). Through the <code>@alova/adapter-uniapp</code> adapter it uses <code>uni.request</code> directly, and the <code>usePagination</code> strategy hook builds in the whole checklist above.</p>
<p>Install (note: the uni-app adapter currently supports Vue 3 uni-app only):</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>Create the alova instance; the adapter provides request adapting, storage adapting, and VueHook in one call:</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>The full list page — the page management, race protection, edge checks, and dual loading you wrote by hand are now all returned by the 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">Loading...</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">No more</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%)">// append mode: next page auto-concatenated to the bottom</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%)">// load more: just bump the page; dedupe, race handling, last-page check are inside the 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%)">// pull to refresh: reload resets to page one</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>Compare: your business code is down to two actions — "page + 1" and "reload". The protection logic behind those three pitfalls (shared-request dedupe, response placement, <code>isLastPage</code>) needs no maintenance from you. <code>usePagination</code> also preloads the next page by default, so the next page is often already cached when you scroll.</p>
<p>The same code compiles and runs on WeChat mini-program, H5, and App — <code>uni.request</code> is always the one sending requests, and alova only handles the "how". If your project already uses axios (H5 side), it can keep working as alova's request adapter through <code>@alova/adapter-axios</code>; your interceptors stay untouched.</p>
<p>Live examples (pagination, load-more, and 24+ runnable demos): <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="when-you-dont-need-it">When you don't need it<a href="https://alova.js.org/blog/blog/uniapp-pagination#when-you-dont-need-it" class="hash-link" aria-label="Direct link to When you don't need it" title="Direct link to When you don't need it" translate="no">​</a></h2>
<p>Honestly, in these cases hand-writing is enough and adding any request library is overhead:</p>
<ul>
<li class=""><strong>A single-page list, or fixed-size data</strong>: one <code>uni.request</code> plus one <code>ref</code> is the optimal solution.</li>
<li class=""><strong>H5-only project already deep into React Query / SWR</strong>: they're mature in pure browser environments; no reason to switch for a single-platform project.</li>
<li class=""><strong>uni-app Vue 2 project</strong>: <code>@alova/adapter-uniapp</code> supports Vue 3 only; evaluate before adopting on Vue 2.</li>
<li class=""><strong>A stable, battle-tested pagination wrapper already in place</strong>: working old code beats a new dependency; wait for a refactor window.</li>
</ul>
<p>On the flip side, if your project has multiple paginated / load-more lists, has hit race-condition or duplicate-request issues in production, or maintains mini-program + H5 + App at once, <code>usePagination</code> is worth one try:</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>pagination</category>
            <category>usePagination</category>
        </item>
    </channel>
</rss>