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

相关推荐
计算机毕设VX:Fegn089523 分钟前
计算机毕业设计|基于Java + vue水果商城系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·课程设计
周杰伦_Jay24 分钟前
【 Vue前端技术详细解析】目录结构与数据传递
前端·javascript·vue.js
A24207349301 小时前
JavaScript学习
前端·javascript·学习
奋斗吧程序媛1 小时前
动态组件驱动的标签页架构(简单来说:一个页面包含许多Tabs页面,这些Tabs页面渲染逻辑)
前端·javascript·vue.js
Felix_Fly1 小时前
用 Vue3 + naive-cron 开发 Cron 表达式工具:从 0 到 1 实现生成 + 反解析
前端·javascript·vue.js·vue·cron·naive
开发者小天1 小时前
react中useReducer的使用
前端·javascript·react.js
小虎牙0071 小时前
关于Android Compose架构的思考
android·前端·mvvm
2501_915909061 小时前
手机崩溃日志导出的工程化体系,从系统级诊断到应用行为分析的多工具协同方法
android·ios·智能手机·小程序·uni-app·iphone·webview
Irene19912 小时前
Vue3 相比 Vue2 的主要变化(生命周期、状态管理、API风格)
vue.js