热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

封装微信小程序的页面状态控制:加载中、断网错误重试、空页面等

本人承接微信小程序定制开发,需要的联系邮箱:ethanyt@qq.com最近在做微信小程序,发现很多页面都有一种特点:在onLoad里异步发送HTTP请求加载数据。默认的界面

本人承接微信小程序定制开发,需要的联系邮箱:ethanyt@qq.com

最近在做微信小程序,发现很多页面都有一种特点:在onLoad里异步发送HTTP请求加载数据。默认的界面是wxml中定义好的模板,如果断网或者网速较慢就会一直卡在这里,界面看起来不太友好。

默认模板

所以需要加入一个加载中的提示,成功加载后再切换回来。使用wx.showLoading等API无法完全遮挡后面突兀的模板,所以要在wxml中写一些界面的代码才可以完成这项需求。

如果在每个page的wxml中都写一次这种代码,工作量非常大,后期重构也不方便,所以本文提供了一种使用template的方式,复用这段代码。需要切换状态的时候直接在js中一行代码pageState.xxx()即可。

下面是演示图片,具体的内容可以定制,比如做一个加载动画。

演示

使用方法

在需要的page的wxml文件开头加入两行代码:

 <import src="/utils/pageState/index.wxml" /> <template is="pageState" data="{{...pageState}}" />  

在需要的page的js文件中使用:

import pageState from '这里写js文件的路径'

Page({
// ...
  getXXXXX(xxxxx) {
    const pageState = pageState(this)
    pageState.loading()    // 切换为loading状态
    api.getXXXXX(xxxxx) // 异步请求
      .then((res) => {
        // 更新界面...
        pageState.finish()    // 切换为finish状态
      })
      .catch(err => {
        pageState.error()    // 切换为error状态
      })
  },
// ...

模板代码

wxml

这里定义了模板,根据状态判断是否显示以及显示那种状态:

 <template name="pageState"> <view class="page-state-container" wx:if="{{state != 'finish'}}"> <view class="page-state-empty page-state-center" wx:if="{{state == 'empty'}}"> <icon type="info" size="70" /> <view class="message">{{message}}view> view> <view class="page-state-loading page-state-center" wx:if="{{state == 'loading'}}"> <icon type="waiting" size="70" /> <view class="message">{{message}}view> view> <view class="page-state-error page-state-center" wx:if="{{state == 'error'}}"> <icon type="warn" size="70" /> <view class="message">{{message}}view> <button class="retrybtn" type="warn" catchtap="onRetry">重试button> view> view> template>

这里使用了两个变量:statemessage,表示当前的状态和提示信息。

这里注意必须在使用此模板的page中定义onRetry,即异步加载数据的代码,才可以使用重试按钮。

wxss

接着定义样式:


.page-state-center {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  align-content: center;
  height: 100%;
  width: 100%;
}

.page-state-container {
  animation: fadein 2s 1 ease-out;
  height: 100%;
  width: 100%;
}

.page-state-container~view {
  display: none;
}

page {
  height: 100%;
  overflow-y: auto;
}

这里我设置了一个渐入的动画,删掉也没关系。注意最后一个.page-state-container~view这里是将class为page-state-container之后的view全部隐藏。如果模板之后想隐藏的不是view可以定义一个新class。我一般都用view作为container,所以这里就直接写了view。为了使内容竖直居中,我将所有页面都设置了最小高度为100%,暂时还没发现什么副作用,发现的朋友可以在评论中指出。

最后把它导入到app.wxss中,以便在全局范围内使用。

/**app.wxss**/
@import 'utils/pageState/index.wxss';

js

// utils/pageState/index.js
const loading = (that) => {
  return () => {
    that.setData({
      pageState: {
        state: 'loading',
        message: '加载中'
      }
    })
  }
}

const error = (that, message) => {
  return (message = '请检查您的网络连接') => {
    that.setData({
      pageState: {
        state: 'error',
        message
      }
    })
  }
}

const empty = (that, message) => {
  return (message = '空空如也') => {
    that.setData({
      pageState: {
        state: 'empty',
        message
      }
    })
  }
}

const finish = (that) => {
  return () => {
    that.setData({
      pageState: {
        state: 'finish',
        message: ''
      }
    })
  }
}

export default (that) => {
  return {
    loading: loading(that),
    error: error(that),
    empty: empty(that),
    finish: finish(that)
  }
}

推荐阅读
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 微信小程序导航跟随的实现方法
    本文介绍了在微信小程序中实现导航跟随的方法。通过设置导航的position属性和绑定滚动事件,可以实现页面向下滚动到导航位置时,导航固定在页面最上方;页面向上滚动到导航位置时,导航恢复到原始位置;点击导航可以平滑跳转到相应位置。代码示例也给出了具体实现方法。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
author-avatar
左莹薇_834
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有