通过 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 中基础页面的功能实现,使代码更加清晰、易读和可维护。

相关推荐
还是鼠鼠1 小时前
图书管理系统 Axios 源码__新增图书
前端·javascript·vscode·ajax·前端框架·node.js·bootstrap
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
还是鼠鼠4 小时前
图书管理系统 Axios 源码 __删除图书功能
前端·javascript·vscode·ajax·前端框架·node.js·bootstrap
轻口味4 小时前
Vue.js `Suspense` 和异步组件加载
前端·javascript·vue.js
m0_zj5 小时前
8.[前端开发-CSS]Day08-图形-字体-字体图标-元素定位
前端·css
还是鼠鼠6 小时前
图书管理系统 Axios 源码__编辑图书
前端·javascript·vscode·ajax·前端框架
北极象6 小时前
vue3中el-input无法获得焦点的问题
前端·javascript·vue.js
百度网站快速收录6 小时前
网站快速收录:如何优化网站头部与底部信息?
前端·html·百度快速收录·网站快速收录
Loong_DQX6 小时前
【react+redux】 react使用redux相关内容
前端·react.js·前端框架
GISer_Jing6 小时前
react redux监测值的变化
前端·javascript·react.js