平台兼容性

记录下 自己花了一上午时间做的 UNIAPP 自定义 loading 自定义 toast 同理 只是给组件传个参数过去而已

个人觉得用UNIAPP开发小程序 还是vuex 好使 即使有的大佬 随随便便自己写个状态管理 或者自己写个 计算属性 之类的 反正我是做不到

先上个动图 看看 先不说好不好看,咱主要实现功能 我是随便找了个 loading动画

uni-app 自动以动画 兼容小程序

首先自带的loading及toast 虽然不难看 但是用多了 感觉千篇一律

使用到的知识点
  • vuex
  • 组件基本用法
首先自己写个 loading 的组件

loading 的组件

在main.js中注册全局组件
复制代码// 引入vuex 状态库
import store from "./store";
// 在main.js中注册全局组件
import toast from './components/toast/toast.vue'
Vue.component('toast',toast)
//挂在到Vue原型链上
Vue.prototype.$store = store;
//是否显示加载中 的方法 调用store中的mutations方法
function loading(tf){
    if(tf){
        store.commit("switch_loading",tf)
    }else{
        store.commit("switch_loading")
    }
}
//也挂在到原型链上 方便在每个页面中  使用 this.$loading()  去显示加载中
Vue.prototype.$loading = loading;
在store中加上控制显示隐藏的方法
复制代码//一个非常简单的store的示例
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
    state: {
        loading:false
    },
    mutations: {
        //tf作为主动控制的参数
        switch_loading(state,tf){
            if(tf){
                state.loading = tf;
            }else{
                state.loading = !state.loading
            }
        }
    }
})
export default store
最后在组件toast.vue中 加上控制方法 控制属性
复制代码<template>
    <view class="loading_box" v-show="is_loading" @click="switch_loading">
        <view class="loading">
            <view class="loader loader-17">
              <view class="css-square square1"></view>
              <view class="css-square square2"></view>
              <view class="css-square square3"></view>
              <view class="css-square square4"></view>
              <view class="css-square square5"></view>
              <view class="css-square square6"></view>
              <view class="css-square square7"></view>
              <view class="css-square square8"></view>
            </view>
             <!-- <view class="loader loader-4"></view> -->
        </view>
    </view>
</template>

<script>
    export default {
        data() {
            return {

            };
        },
        methods:{
            switch_loading(){
                this.$store.commit("switch_loading")
            }
        },
        //实测直接在标签属性里写  $store.state.XX  拿不到数据  所以这里通过 计算属性去监听一下
        computed:{
            is_loading(){
                return this.$store.state.loading
            }
        }
    }
</script>
最后 在任何一个页面中 只要在页面标签加上

以及在请求中 或者需要显示loading的时候 加上一句

复制代码this.$loading();

用法跟 uni.showLoading() 差不多

复制代码this.$loading(); 
//或者
this.$loading(false);

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

使用了 node中文社区 提供的API

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议
fee***@foxmail.com

2020-10-22

每个页面都写这个组件,第一个页面跳第二个页面的时候,第二个页面还没渲染出来,loading已经放出来了,感觉是第一个页面的loading,比较奇怪

avl***@qq.com

2019-11-08

这个还得在每个引用它的页面加上(还容易出错,万一子组件也引入就会出现很多重复弹窗) ,否则无效。不知大佬能做到uni.showToast这种不需要引入的效果没。

hai***@163.com

2019-07-08

在小程序里面,我的不生效。自定义组件loading computed:{ isLoading(){ console.log(11) return this.$store.state.loading } } 就这个无法输出,没办法show组件,连111都无法输出,但是在H5是可以的。

语文数学天才

2019-06-09

怎么说了。依然还需要每一个页面都写上这个组件,而且他们都共用一个状态。打开就所有的都打开,关闭就所有的都关闭。这种处理其实比较适合登录层弹出。 要是不需要在每一个页面都添加,像原生toast一样使用就好了。

panyh

2019-05-17

这个只能弄一个页面,其它页面就冲突,渲染错误

601***@qq.com

2019-04-23

下载的zip项目运行样式不对,和图片上也不是一个项目

负伍

2019-03-08

123***@qq.com

2019-01-09

这个组件在util.js(公共js)里面怎么调用啊

tha***@163.com 2019-01-13

引入 store 然后 commit() 就行了 给你个示例 比如我写个 公共的ajax.js 封装一下 所有的请求。 然后在请求前 打开loading 请求响应后关闭

1、引入store实例 import store from "../store"; 2、请求前 store.commit("switch_loading","true"); 3、请求相应后 store.commit("switch_loading","false")

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问