百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

手把手教你用uniapp开发一个app(二)

liuian 2025-01-17 12:18 51 浏览

1. 组件自动注册机制:easycom

1.1 直接使用组件

传统 Vue 项目中,我们需要注册、导入组件之后才能使用组件。

uniapp 框架提供了一种组件自动注册机制,只要你在 components 文件夹下新建的组件满足 /components/组件名/组件名.vue 的命名规范,就能直接使用,例如:

1.在 components 文件夹下新建 hello-world 的文件夹,在 hello-world 文件夹下新建 hello-world.vue 文件,随便写点内容

2.在 index.vue 文件里面直接引用组件

1.2 注意事项

1.这种组件自动注册机制叫做 easycom,它可以自动扫描指定目录下的所有组件,并注册到全局组件中。

2.组件命名必须是小写字母,使用短横线连接单词。例如:hello-world。

3.easycom 支持多种规则,我们可以在 pages.json 文件里面自定义 easycom 规则。

1.3 自定义 easycom 规则

我们在开发项目时,不会每次都要创建一个同名文件夹的组件,例如:

这些组件一般是分模块的,例如跟用户相关的,放到 user 文件夹下,跟订单相关的放到 order 文件夹下,那么我们就可以自定义 easycom 规则。

1.3.1 场景一:分模块

我们分别在 order 和 user 文件夹下创建相关的组件

在 pages.json 里面配置 easycom 属性,其中 autoscan 表示自动扫描,custom 表示自定义规则。

"easycom": {
    "autoscan": true,
    "custom": {
        "user-(.*)": "@/components/user/user-$1.vue",
        "order-(.*)": "@/components/order/order-$1.vue" 
    }
},

引用组件

讲解:

当引入 user-add 组件时,uniapp 框架会根据我们在 pages.jon 文件里面配置的 easycom 规则去获取 /components/user 文件夹下以 user 为前缀的组件,并自动注册。

1.3.2 场景二:在同一父文件下面

新建 common 文件夹,新建 product-detail 同名的文件夹和 vue 文件。

配置 easycom 属性

引用组件

2. uniapp 生命周期

2.1 uniapp 生命周期介绍

生命周期是一个事物从产生到消亡的过程。

uniapp 的生命周期分为应用生命周期、页面生命周期和组件生命周期。

1.应用生命周期:整个 App 的生命周期,主要是在 App.文件中回调的函数

  • onLaunch:当 app 初始化完成时出发,全局只触发一次。
  • onShow:应用启动或从后台进入前台显示时触发。
  • onHide:应用从前台进入后台时触发。

2.页面生命周期:进入到每个页面时回调某些函数

3.组件生命周期:组件发生实例化、渲染数据、显示、隐藏等状态时触发某些函数。

2.2 uniapp 常用的生命周期函数

因为组件也是页面,所以这里主要讲解页面常用的生命周期函数。

1.onLoad()

该函数在页面加载时触发,可以用来初始化一些操作。例如获取父组件传递的数据、获取上个页面跳转时传递的参数、刚进入列表页面时获取列表数据等。

<template>
 <view>
 </view>
</template>
<script setup>
 import {
  onLoad
 } from "@dcloudio/uni-app"

 onLoad((option) => {
  // 获取传递参数
  name.value = option.name;
  age.value = option.age;
  // 获取列表数据
  getList();
 })

 const name = ref("");
 const age = ref(18);
 // 获取列表数据
 const getList = () => {}
</script>

2.onShow()

当页面每次显示时执行一些操作,如重新渲染数据、更新页面状态等。

import {
    onLoad,
    onShow
} from "@dcloudio/uni-app"
onShow(() => {
    refreshData();
})
const refreshData = () => {}

3.onReady()

页面渲染时触发,只会触发一次,可以用来操作 DOM 元素

<template>
 <view>
  <div ref="titleDiv">知否技术</div>
 </view>
</template>

<script setup>
 import {
  onLoad,
  onShow,
  onReady
 } from "@dcloudio/uni-app"
 import { ref } from "vue";
 onReady(() => {
  console.log("titleDiv:",titleDiv.value)
 })
 const titleDiv = ref();
</script>

4.onHide()

应用切换到后台或者隐藏时触发,主要执行清理操作,例如释放资源等。

5.onUnload()

页面销毁时触发,例如返回到其他页面时,主要用来执行一些清理工作,例如取消网络请求、移除事件监听器,保存当前页面状态等。

6.onPullDownRefresh()

监听用户下拉刷新事件,需要注意:

1.pages.json 的 enablePullDownRefresh 配置为 true 时才生效

2.最后需要调用 uni.stopPullDownRefresh() 方法表示下拉刷新已完成

<script setup>
  import {
      onLoad,
      onShow,
      onReady,
      onPullDownRefresh
  } from "@dcloudio/uni-app"
  import {
      ref
  } from "vue";
  // 下拉刷新
  onPullDownRefresh(() => {
      getDataList()
  })
  // 获取数据
  const getDataList = () => {
          http.get("/data/page", search).then(res => {
              if (res.code === 200) {
                  dataList.value = [...dataList.value, ...res.data.records]
                  // 停止下拉刷新
                  uni.stopPullDownRefresh();
              } else {
                  uni.$u.toast(res.data.message)
              }
          })
      },
</script>

7.onReachBottom()

监听页面上拉触底事件,例如当页面触底时继续获取列表数据:

<script setup>
 import {
  onLoad,
  onShow,
  onReady,
  onReachBottom
 } from "@dcloudio/uni-app"
 import {
  ref
 } from "vue";
 // 上拉触底
 onReachBottom(() => {
  getDataList()
 })
 // 获取数据
 const getDataList = () => {

 }
</script>

8.onPageScroll()

监听页面滚动事件,页面滚动时执行某些操作

9.onResize()

窗口变化时触发该函数,具体来说,onResize可以用于以下场景:

  • 响应式设计‌:在页面尺寸变化时,动态调整页面布局或元素位置,确保应用在不同设备上都能良好显示。
  • 资源优化‌:根据窗口尺寸调整加载的资源,比如图片、视频等,以提高加载速度和性能。
  • 交互优化‌:在尺寸变化时执行特定的交互逻辑,比如隐藏或显示某些元素,提升用户体验。

3. uni.request 发起网络请求

官网关于网络请求的文档地址:

https://uniapp.dcloud.net.cn/api/request/request.html

uniapp 框架无法使用 axios 库发起网络请求,只能使用自带的 uni.request() 方法发起网络请求。

<script setup>
const getDataList=()=>{
    uni.request({
        url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。
        method: 'GET', 
        data: {
            name: '知否君'
        },
        header: {
            'content-type': 'application/json' ,// 默认值,
            "token":"xxxxxxxx"
        },
        success: (res) => {
            console.log(res.data);
        },
        fail: () => {

        },
        complete: () => {
        }
    });
}
</script>

uni.request 方法常用参数说明:

  • url (string):必填参数,表示请求的 URL 地址。
  • method (默认'GET'):请求方法,如 'GET', 'POST', 'PUT', 'DELETE' 等。
  • data (Object | String):请求的参数,如果是GET请求则会转换为 query 字符串追加到 URL 上;如果是 POST 请求等,则作为请求体发送。类型取决于 content-type 设置。
  • header (Object):设置请求的头部信息,如{'content-type': 'application/json'}。
  • dataType (string, 默认'json'):服务器返回的数据类型。合法值:'json', 'text'。
  • responseType (string, 默认'text'): 设置响应的数据类型。合法值:'text', 'arraybuffer'。
  • success (Function): 请求成功后的回调函数,参数为一个对象,包含服务器返回的数据。
  • fail (Function): 请求失败的回调函数,参数为一个对象,包含错误信息。
  • complete (Function): 不管成功还是失败,都会执行的回调函数,参数为一个对象,包含请求的响应信息。

官方提供的网络请求 API 不是非常好用。

因为每次发起请求都要在 header 里面填写 token,没有统一的请求拦截和请求拦截,所以需要我们自己封装网络请求。

4. 封装网络请求

想想我们在开发 Vue 项目时是如何封装 axios 的?

1.axios 实例

  • 创建 axios 实例,实例包含 baseUrl
  • 请求拦截
  • 响应拦截

2.http 请求

  • 引入 axios 实例
  • 封装 GET、POST、DELETE 等 http 请求

3.具体接口

  • 引入 http 文件,调用请求

知道了核心逻辑,我们接下来封装一下 uni.request 请求

1.在 api 文件夹下新建 request.js

该文件主要包含封装的 uni.request 请求实例、GET 等4种 http 请求,请求拦截、响应拦截、异常处理。

const http = {
 // 接口 baseUrl
 baseUrl: "http://127.0.0.1:8000",
 // 请求方法
 request(config) {
  // 请求拦截
  config = beforeRequest(config);
  // 封装实际请求 url
  config.url = this.baseUrl + config.url;
  return new Promise((resolve, reject) => {
   // uni.request
   uni.request(config)
    .then(res => {
     const response = before(res);
     resolve(response);
    }).catch(error => {
     errorHandle(error);
     reject(error);
    })
  })
 },
 get(url, params) {
  return this.request({
   url: url,
   data: params,
   method: "GET"
  })
 },
 post(url, data) {
  return this.request({
   url: url,
   data: data,
   method: "POST"
  })
 },
 put(url, data) {
  return this.request({
   url: url,
   data: data,
   method: "PUT"
  })
 },
 delete(url, data) {
  return this.request({
   url: url,
   params: data,
   method: "DELETE"
  })
 },
}

// 请求拦截
const beforeRequest = (config) => {
 const access_token = uni.getStorageSync("token");
 const header = {
  'content-type': 'application/json'
 };
 if (token) {
  headers["Authorization"] = token;
 }
 Object.assign(assign, {
  "header",
  header
 })
 return config;
}
// 响应拦截
const beforeReponse = (response) => {
 return response;
}
// 异常处理
const errorHandle = (response) => {
 console.log('异常处理');
}

export default http

2.创建实际接口

3.页面调用接口

上面的案例中并没有详细说明请求拦截、响应拦截和异常处理的代码,等后面 app 实战的时候会给出完整代码,大家敬请期待。

5. 数据缓存

在移动应用中使用缓存来存储应用数据已经成为了一个常见的操作,这不仅可以提高应用的响应速度,还可以节约用户的流量。

在使用 uniapp 进行开发时,我们可以通过使用 uniapp 自带的本地缓存来实现这一目标。

uniapp 数据缓存 API 文档地址:

https://uniapp.dcloud.net.cn/api/storage/storage.html

1.存储数据:uni.setStorageSync

uni.setStorage("token", res.data.token);
uni.setStorageSync("token", res.data.token);

2.获取数据:uni.getStorageSync

let token = uni.getStorageSync("token");
let token = uni.getStorage("token");

3.清除本地缓存

uni.clearStorageSync();
uni.clearStorage();
uni.removeStorageSync("userInfo")
uni.removeStorage("userInfo")

注意:

  1. 后缀带 Sync 的是同步接口,不带 Sync 的是异步接口。

2.如果后续业务逻辑实时依赖于修改后的数据就使用同步 (后缀带 Sync 的方法),如果不需要就可以使用异步(后缀不带 Sync 的方法),

相关推荐

驱动网卡(怎么从新驱动网卡)
驱动网卡(怎么从新驱动网卡)

网卡一般是指为电脑主机提供有线无线网络功能的适配器。而网卡驱动指的就是电脑连接识别这些网卡型号的桥梁。网卡只有打上了网卡驱动才能正常使用。并不是说所有的网卡一插到电脑上面就能进行数据传输了,他都需要里面芯片组的驱动文件才能支持他进行数据传输...

2026-01-30 00:37 liuian

win10更新助手装系统(微软win10更新助手)

1、点击首页“系统升级”的按钮,给出弹框,告诉用户需要上传IMEI码才能使用升级服务。同时给出同意和取消按钮。华为手机助手2、点击同意,则进入到“系统升级”功能华为手机助手华为手机助手3、在检测界面,...

windows11专业版密钥最新(windows11专业版激活码永久)

 Windows11专业版的正版密钥,我们是对windows的激活所必备的工具。该密钥我们可以通过微软商城或者通过计算机的硬件供应商去购买获得。获得了windows11专业版的正版密钥后,我...

手机删过的软件恢复(手机删除过的软件怎么恢复)
手机删过的软件恢复(手机删除过的软件怎么恢复)

操作步骤:1、首先,我们需要先打开手机。然后在许多图标中找到带有[文件管理]文本的图标,然后单击“文件管理”进入页面。2、进入页面后,我们将在顶部看到一行文本:手机,最新信息,文档,视频,图片,音乐,收藏,最后是我们正在寻找的[更多],单击...

2026-01-29 23:55 liuian

一键ghost手动备份系统步骤(一键ghost 备份)

  步骤1、首先把装有一键GHOST装系统的U盘插在电脑上,然后打开电脑马上按F2或DEL键入BIOS界面,然后就选择BOOT打USDHDD模式选择好,然后按F10键保存,电脑就会马上重启。  步骤...

怎么创建局域网(怎么创建局域网打游戏)

  1、购买路由器一台。进入路由器把dhcp功能打开  2、购买一台交换机。从路由器lan端口拉出一条网线查到交换机的任意一个端口上。  3、两台以上电脑。从交换机任意端口拉出网线插到电脑上(电脑设置...

精灵驱动器官方下载(精灵驱动手机版下载)

是的。驱动精灵是一款集驱动管理和硬件检测于一体的、专业级的驱动管理和维护工具。驱动精灵为用户提供驱动备份、恢复、安装、删除、在线更新等实用功能。1、全新驱动精灵2012引擎,大幅提升硬件和驱动辨识能力...

一键还原系统步骤(一键还原系统有哪些)

1、首先需要下载安装一下Windows一键还原程序,在安装程序窗口中,点击“下一步”,弹出“用户许可协议”窗口,选择“我同意该许可协议的条款”,并点击“下一步”。  2、在弹出的“准备安装”窗口中,可...

电脑加速器哪个好(电脑加速器哪款好)

我认为pp加速器最好用,飞速土豆太懒,急速酷六根本不工作。pp加速器什么网页都加速,太任劳任怨了!以上是个人观点,具体性能请自己试。ps:我家电脑性能很好。迅游加速盒子是可以加速电脑的。因为有过之...

任何u盘都可以做启动盘吗(u盘必须做成启动盘才能装系统吗)

是的,需要注意,U盘的大小要在4G以上,最好是8G以上,因为启动盘里面需要装系统,内存小的话,不能用来安装系统。内存卡或者U盘或者移动硬盘都可以用来做启动盘安装系统。普通的U盘就可以,不过最好U盘...

u盘怎么恢复文件(u盘文件恢复的方法)

开360安全卫士,点击上面的“功能大全”。点击文件恢复然后点击“数据”下的“文件恢复”功能。选择驱动接着选择需要恢复的驱动,选择接入的U盘。点击开始扫描选好就点击中间的“开始扫描”,开始扫描U盘数据。...

系统虚拟内存太低怎么办(系统虚拟内存占用过高什么原因)

1.检查系统虚拟内存使用情况,如果发现有大量的空闲内存,可以尝试释放一些不必要的进程,以释放内存空间。2.如果系统虚拟内存使用率较高,可以尝试增加系统虚拟内存的大小,以便更多的应用程序可以使用更多...

剪贴板权限设置方法(剪贴板访问权限)
剪贴板权限设置方法(剪贴板访问权限)

1、首先打开iphone手机,触碰并按住单词或图像直到显示选择选项。2、其次,然后选取“拷贝”或“剪贴板”。3、勾选需要的“权限”,最后选择开启,即可完成苹果剪贴板权限设置。仅参考1.打开苹果手机设置按钮,点击【通用】。2.点击【键盘】,再...

2026-01-29 21:37 liuian

平板系统重装大师(平板重装win系统)

如果你的平板开不了机,但可以连接上电脑,那就能好办,楼主下载安装个平板刷机王到你的个人电脑上,然后连接你的平板,平板刷机王会自动识别你的平板,平板刷机王上有你平板的我刷机包,楼主点击下载一个,下载完成...

联想官网售后服务网点(联想官网售后服务热线)

联想3c服务中心是联想旗下的官方售后,是基于互联网O2O模式开发的全新服务平台。可以为终端用户提供多品牌手机、电脑以及其他3C类产品的维修、保养和保险服务。根据客户需求层次,联想服务针对个人及家庭客户...