uni-app x封装request,统一API接口请求
<h1>一、概述</h1><p>uni-app x 提供了 uni.request() 方法。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">uni.request({
url: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">https://api.example.com</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
method: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">GET</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
})</span></pre>
</div>
<p>在实际项目开发中,直接使用 uni.request 会带来诸多问题,例如:</p>
<ul>
<li>重复代码多(如每次都要写 baseURL)</li>
<li>错误处理分散,难以统一管理</li>
<li>缺乏请求/响应拦截能力</li>
<li>Token 注入繁琐</li>
<li>Loading 状态管理混乱</li>
</ul>
<p><br>为了解决这些问题,封装一个统一的 HTTP 请求库是企业级开发的最佳实践。</p>
<h1>二、封装request</h1>
<p>uview-plus 自带一个 http 模块,但是在实际项目中,还是要自己封装一个,统一管理。</p>
<p> </p>
<p>在项目根目录创建utils目录,在里面创建request.ts。 <span style="color: rgba(255, 0, 0, 1)"><strong>注意:文件后缀必须是ts,而不是js</strong></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> utils/request.ts</span>
import { http } from <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">uview-plus</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 1. 全局配置 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
http.setConfig((config) </span>=><span style="color: rgba(0, 0, 0, 1)"> {
config.baseURL </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">https://api.example.com</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> api地址</span>
config.timeout = <span style="color: rgba(128, 0, 128, 1)">8000</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 单位毫秒,对应8秒</span>
config.loadingText = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">加载中...</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
config.loading </span>= <span style="color: rgba(0, 0, 255, 1)">true</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 开启 loading 动画</span>
<span style="color: rgba(0, 0, 0, 1)"> return config
})
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 2. 请求拦截 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
http.interceptors.request.use((config) </span>=><span style="color: rgba(0, 0, 0, 1)"> {
const token </span>= uni.getStorageSync(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">token</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (token) config.header.Authorization =<span style="color: rgba(0, 0, 0, 1)"> `Bearer ${token}`
return config
})
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 3. 响应拦截 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
http.interceptors.response.use(
(response) </span>=><span style="color: rgba(0, 0, 0, 1)"> response.data,
(err) </span>=><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 🔥 强制断言,让 UTS 闭嘴</span>
(uni as any).$u.toast(err.message || <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">网络错误</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
return Promise.reject(err)
}
)
export default http</span></pre>
</div>
<p> </p>
<p>修改 main.uts,引入 request,并挂载为全局属性$http</p>
<div class="cnblogs_code">
<pre>import App from <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./App.uvue</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
import { createSSRApp } from </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">vue</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
import uviewPlus from </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">uview-plus</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 1. 引入 request(里面已经初始化好 http) </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
import http from </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">@/utils/request</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
export </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> createApp() {
const app </span>=<span style="color: rgba(0, 0, 0, 1)"> createSSRApp(App)
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 2. 挂到全局属性 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
app.config.globalProperties.$http </span>=<span style="color: rgba(0, 0, 0, 1)"> http
app.use(uviewPlus)
return {
app
}
}</span></pre>
</div>
<h1>三、使用request</h1>
<p>由于在main.uts挂载了全局属性,因此在pages里面的uvue文件,就可以直接调用了。比如:</p>
<h2>get请求</h2>
<div class="cnblogs_code">
<pre>const res = await this.$http.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/test</span><span style="color: rgba(128, 0, 0, 1)">'</span>, {})</pre>
</div>
<h2>post请求</h2>
<div class="cnblogs_code">
<pre>const res = await this.$http.post(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/login</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, {
username: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
password: </span><span style="color: rgba(128, 0, 128, 1)">123456</span><span style="color: rgba(0, 0, 0, 1)">
})</span></pre>
</div>
<h3>post请求,增加成功和失败处理</h3>
<div class="cnblogs_code">
<pre>async <span style="color: rgba(0, 0, 255, 1)">login</span><span style="color: rgba(0, 0, 0, 1)">() {
try {
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> === 成功分支 === </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
const res </span>= await this.$http.post(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/login</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, {
username: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
password: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
})
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 这里只写“成功后的业务”</span>
uni.setStorageSync(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">token</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, res.token)
this.$u.toast(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">登录成功</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
uni.switchTab({ url: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/pages/index/index</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> })
} catch (err: any) {
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> === 失败分支 === </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 拦截器已弹通用提示,这里可做“额外”处理</span>
console.error(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">登录失败</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, err)
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (err.statusCode === <span style="color: rgba(128, 0, 128, 1)">401</span><span style="color: rgba(0, 0, 0, 1)">) {
this.$u.toast(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">账号或密码错误</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
}
}
}</span></pre>
</div>
<h3>post请求,局部请求不想显示 loading</h3>
<div class="cnblogs_code">
<pre>await this.$http.post(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/log</span><span style="color: rgba(128, 0, 0, 1)">'</span>, data, { loading: <span style="color: rgba(0, 0, 255, 1)">false</span> })</pre>
</div>
<p>uview-plus 的 http 模块已经内置了 “请求开始自动显示 loading,响应结束自动隐藏” 的机制,<br>你只需要 把 loading 开关打开 即可,成功/失败/超时都会 统一自动关闭,无需手动处理。</p>
<p>效果:<br>调用 this.$http.get/post 瞬间 → 出现 uview-plus 的 loading 遮罩<br>请求 成功/失败/超时 → 遮罩 自动消失(由 uview 内部 finally 关闭)<br>无需自己 uni.showLoading() / uni.hideLoading()</p>
<p> </p>
<h3>post请求,增加header</h3>
<div class="cnblogs_code">
<pre>await this.$http.post(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/upload</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, body, {
header: {
</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Content-Type</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">application/x-wwwz-form-urlencoded</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">X-Custom</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">abc123</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
}
})</span></pre>
</div>
<h2>put请求</h2>
<div class="cnblogs_code">
<pre>const res = await this.$http.put(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/test</span><span style="color: rgba(128, 0, 0, 1)">'</span>, {<span style="color: rgba(0, 0, 255, 1)">id</span>:<span style="color: rgba(128, 0, 128, 1)">1</span>})</pre>
</div>
<h2>delete请求</h2>
<div class="cnblogs_code">
<pre>const res = await this.$http.delete(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/test</span><span style="color: rgba(128, 0, 0, 1)">'</span>, {<span style="color: rgba(0, 0, 255, 1)">id</span>:<span style="color: rgba(128, 0, 128, 1)">1</span>})</pre>
</div>
<h1>四、登录页面</h1>
<p>login.uvue</p>
<div class="cnblogs_code">
<pre><template>
<view class=<span style="color: rgba(128, 0, 0, 1)">""</span>>
<!-- 导航栏 -->
<u-navbar title=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">用户登录</span><span style="color: rgba(128, 0, 0, 1)">"</span> />
<!-- 内容区 -->
<view class=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">content</span><span style="color: rgba(128, 0, 0, 1)">"</span>>
<!-- 头像 -->
<u-avatar :src=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">logo</span><span style="color: rgba(128, 0, 0, 1)">"</span> size=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">80</span><span style="color: rgba(128, 0, 0, 1)">"</span>></u-avatar>
<!-- 表单 -->
<u--form :model=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">form</span><span style="color: rgba(128, 0, 0, 1)">"</span> labelPosition=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">left</span><span style="color: rgba(128, 0, 0, 1)">"</span>>
<u--input v-model=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">form.username</span><span style="color: rgba(128, 0, 0, 1)">"</span> placeholder=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">请输入用户名</span><span style="color: rgba(128, 0, 0, 1)">"</span> prefixIcon=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">account</span><span style="color: rgba(128, 0, 0, 1)">"</span> />
<u--input v-model=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">form.password</span><span style="color: rgba(128, 0, 0, 1)">"</span> placeholder=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">请输入密码</span><span style="color: rgba(128, 0, 0, 1)">"</span> type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">password</span><span style="color: rgba(128, 0, 0, 1)">"</span> prefixIcon=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">lock</span><span style="color: rgba(128, 0, 0, 1)">"</span> />
</u--form>
<!-- 按钮 -->
<u-button text=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">登录</span><span style="color: rgba(128, 0, 0, 1)">"</span> type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">primary</span><span style="color: rgba(128, 0, 0, 1)">"</span> @click=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">login</span><span style="color: rgba(128, 0, 0, 1)">"</span> />
<!-- 链接 -->
<view class=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">links</span><span style="color: rgba(128, 0, 0, 1)">"</span>>
<u-cell title=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">忘记密码?</span><span style="color: rgba(128, 0, 0, 1)">"</span> isLink @click=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">gotoForget</span><span style="color: rgba(128, 0, 0, 1)">"</span> />
<u-cell title=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">注册账号</span><span style="color: rgba(128, 0, 0, 1)">"</span> isLink @click=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">gotoRegister</span><span style="color: rgba(128, 0, 0, 1)">"</span> />
</view>
</view>
</view>
</template>
<script><span style="color: rgba(0, 0, 0, 1)">
export default {
data() {
return {
title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Hello</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
logo: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/static/logo.png</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
form: {
username: </span><span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">,
password: </span><span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">,
}
}
},
onLoad() {
},
methods: {
async </span><span style="color: rgba(0, 0, 255, 1)">login</span><span style="color: rgba(0, 0, 0, 1)">() {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">this.form.username) {
uni.showToast({ title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">请输入用户名</span><span style="color: rgba(128, 0, 0, 1)">'</span>, icon: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">none</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> })
return
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 请求登录接口</span>
<span style="color: rgba(0, 0, 0, 1)"> try {
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> === 成功分支 === </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
const res </span>= await this.$http.post(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/login</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, {
username: this.form.username,
password: this.form.password
})
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 这里只写“成功后的业务”</span>
uni.setStorageSync(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">token</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, res.token)
this.$u.toast(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">登录成功</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
uni.switchTab({ url: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/pages/index/index</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> })
} catch (err : any) {
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> === 失败分支 === </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 拦截器已弹通用提示,这里可做“额外”处理</span>
console.error(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">登录失败</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, err)
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (err.statusCode === <span style="color: rgba(128, 0, 128, 1)">401</span><span style="color: rgba(0, 0, 0, 1)">) {
this.$u.toast(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">账号或密码错误</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
}
this.$u.toast(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">网络请求异常</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
}
},
gotoForget() {
uni.navigateTo({ url: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/pages/forget/index</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> })
},
gotoRegister() {
uni.navigateTo({ url: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/pages/register/index</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> })
}
}
}
</span></script>
<style scoped><span style="color: rgba(0, 0, 0, 1)">
.content {
padding: 40rpx;
display: flex;
flex</span>-<span style="color: rgba(0, 0, 0, 1)">direction: column;
align</span>-<span style="color: rgba(0, 0, 0, 1)">items: center;
}
.links {
margin</span>-<span style="color: rgba(0, 0, 0, 1)">top: 30rpx;
width: </span><span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)">;
}
</span></style></pre>
</div>
<p>效果如下:</p>
<p><img src="https://img2024.cnblogs.com/blog/1341090/202510/1341090-20251014182136267-490899665.png" alt="image" loading="lazy"></p>
<p> </p>
<p>针对大型项目,可以在utils里面新建一个api.ts,用来编写一些公用业务函数,例如:</p>
<div class="cnblogs_code">
<pre>import http from <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./request.js</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 登录 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
export const </span><span style="color: rgba(0, 0, 255, 1)">login</span> = (username, <span style="color: rgba(0, 0, 255, 1)">pwd</span>) =><span style="color: rgba(0, 0, 0, 1)">
http.post(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/login</span><span style="color: rgba(128, 0, 0, 1)">'</span>, { username, <span style="color: rgba(0, 0, 255, 1)">pwd</span><span style="color: rgba(0, 0, 0, 1)"> })
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 轮播图 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
export const getBanner </span>= () =><span style="color: rgba(0, 0, 0, 1)">
http.get(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/banner</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 商品列表 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
export const getGoods </span>= (params) =><span style="color: rgba(0, 0, 0, 1)">
http.get(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/goods</span><span style="color: rgba(128, 0, 0, 1)">'</span>, { params })</pre>
</div>
<p> 然后在pages里面的页面,就可以调用了,无需重复写函数。</p>
<div class="cnblogs_code">
<pre><script><span style="color: rgba(0, 0, 0, 1)">
import { getBanner } from </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">@/utils/api.ts</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
export default {
data() {
return {
title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Hello</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
bannerList: [],
}
},
onLoad() {
this.getbannerList()
},
methods: {
async getbannerList() {
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 直接调用 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
this.bannerList </span>=<span style="color: rgba(0, 0, 0, 1)"> await getBanner()
},
}
}
</span></script></pre>
</div>
<p>注意:直接调用,要用异步,函数名前面加async</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/xiao987334176/p/19141750
頁:
[1]