通过 Vue 3 组合式 API 优化 Uni-app 基础页面功能

Uni-app 是一个跨平台的应用开发框架,支持同时开发小程序、App 和 H5 等多个平台。而 Vue 3 的组合式 API 则是 Vue 3 新增的特性之一,它可以让我们更好地组织和复用组件逻辑。本文将结合 Vue 3 的组合式 API,来优化 Uni-app 中基础页面的功能实现。

1. 使用 ref 创建响应式数据

在 Vue 3 中,我们可以使用 ref 创建响应式数据。在 Uni-app 中,我们可以利用这一特性来管理页面中的状态和数据。比如,在基础页面中,我们经常需要管理页面数据、加载状态、分页信息等。我们可以这样来使用:

javascript 复制代码
import { ref } from 'vue';

export default function usePage() {
    const pageData = ref({});
    const status = ref('more');
    const totalPage = ref(0);
    const total = ref(0);

    // 其他逻辑...
    
    return { pageData, status, totalPage, total };
}

2. 使用组合式 API 分离逻辑

将页面逻辑按功能拆分成不同的组合函数,可以使代码更加清晰和可维护。比如,我们可以将页面初始化逻辑、数据请求逻辑、加载更多数据逻辑等分别放在不同的函数中,然后在页面中组合使用。

javascript 复制代码
  const initData = async () => {
        searchObject.value.no = 1
        await getData();
        uni.stopPullDownRefresh();
    };
    onPullDownRefresh(async () => {
        await initData();
    })

    const checkMore = (res) => {
        totalPage.value = res.totalPage;
        total.value = res.total;
        if (searchObject.value.no <= res.totalPage) {
            status.value = "loading";
        } else {
            status.value = "noMore";
        }

    }

    const getData = async () => {
        let res = await post(functionMethod, searchObject.value);
        if (res.code !== 200) {
            uni.showModal({
                content: res.msg,
                showCancel: false
            })
            return;
        }
        pageData.value = res.data;
		pageData1.value = JSON.parse(JSON.stringify(pageData.value))
        checkMore(res)
        if(functionMethod === '/saleOrder/search') {
            pageData.value.forEach((e) => {
                e.checked = false
            })
        }
    };
	
	const loadMore=async () => {
        searchObject.value.no = searchObject.value.no + 1;
        let res = await post(functionMethod, searchObject.value);
        if (res.code !== 200) {
            uni.showModal({
                content: res.msg,
                showCancel: false
            })
            return;
        }
        if (res.data) {
            pageData.value = pageData.value.concat(res.data);
        }
        checkMore(res)
    }

3. 页面生命周期的处理

在 Uni-app 中,页面的生命周期函数可以通过 onShowonLoad 等方式进行处理。我们可以在组合函数中使用这些生命周期函数,并结合上面的逻辑函数进行调用。

javascript 复制代码
	onPullDownRefresh(async () => {
	    await initData();
	})

    onReachBottom(async () => {
      await loadMore();
    });

    onShow(async () => {
        await getData()
    })

4.完整代码

javascript 复制代码
import {ref} from "vue";
import {post} from "/common/api.js"
import {
    onShow,
    onPullDownRefresh,
    onReachBottom
} from "@dcloudio/uni-app";

export function usePage(functionMethod, searchObject) {
    //集合
    let pageData = ref({})
	let pageData1 = ref({})
    //加载的状态
    const status = ref("more")
    //总页数
    const totalPage = ref(0)
    //总条数
    const total = ref(0)


    const initData = async () => {
        searchObject.value.no = 1
        await getData();
        uni.stopPullDownRefresh();
    };


    const checkMore = (res) => {
        totalPage.value = res.totalPage;
        total.value = res.total;
        if (searchObject.value.no <= res.totalPage) {
            status.value = "loading";
        } else {
            status.value = "noMore";
        }

    }

    const getData = async () => {
        let res = await post(functionMethod, searchObject.value);
        if (res.code !== 200) {
            uni.showModal({
                content: res.msg,
                showCancel: false
            })
            return;
        }
        pageData.value = res.data;
		pageData1.value = JSON.parse(JSON.stringify(pageData.value))
        checkMore(res)
        if(functionMethod === '/saleOrder/search') {
            pageData.value.forEach((e) => {
                e.checked = false
            })
        }
    };
	
	const loadMore=async () => {
        searchObject.value.no = searchObject.value.no + 1;
        let res = await post(functionMethod, searchObject.value);
        if (res.code !== 200) {
            uni.showModal({
                content: res.msg,
                showCancel: false
            })
            return;
        }
        if (res.data) {
            pageData.value = pageData.value.concat(res.data);
        }
        checkMore(res)
    }
	
	onPullDownRefresh(async () => {
	    await initData();
	})

    onReachBottom(async () => {
      await loadMore();
    });

    onShow(async () => {
        await getData()
    })
    return {pageData,pageData1, status, totalPage, initData, total,loadMore}
}

5.代码使用

javascript 复制代码
	const {
		pageData,
		status,
		totalPage,
		total,
		initData
	} = usePage("/saleOrderSummary/topByShop", searchObject);

通过以上的优化,我们可以更好地利用 Vue 3 的组合式 API 来优化 Uni-app 中基础页面的功能实现,使代码更加清晰、易读和可维护。

相关推荐
胡萝卜术6 小时前
力扣5. 最长回文子串
前端·javascript·面试
我星期八休息6 小时前
网络编程—应用层HTTP协议
linux·运维·开发语言·前端·网络·网络协议·http
不好听6136 小时前
前端路由完全指南(下篇):懒加载、History 栈与工程化实践
前端·react.js
宠友信息8 小时前
消息序号如何保证即时通讯源码聊天记录稳定加载
java·spring boot·redis·python·mysql·uni-app
圣光SG8 小时前
Java Web入门基础知识笔记
java·前端·笔记
cyforkk9 小时前
Vercel 绑定自定义域名极简配置指南
服务器·前端·网络
IT_陈寒10 小时前
React useEffect依赖数组中埋的坑,这次终于让我逮到了
前端·人工智能·后端
FourAu11 小时前
2026 前端突围指南:从 ESR 边缘渲染到封装 Web AI SDK,聊聊 AI 时代的职业进化
前端·人工智能
Zkeq11 小时前
不止是聊天框:我用 EdgeOne Makers Agents 给烹饪 APP 加了一位能“改菜谱”的 AI 主厨
前端