美文网首页
uniapp学习历程

uniapp学习历程

作者: 遇见wn | 来源:发表于2023-07-06 16:05 被阅读0次

    1.不同盒子元素设置随机背景色

    //遍历数据,创建多个元素,需求是每个元素都会在多个颜色范围内设置不同的背景颜色
    <view class="tags" v-for="(citem, cindex) in list" :key="cindex">
      <text :style="[randomColor()]">{{ citem }}</text>
    </view>
    
    //js:创建一个随机色的方法,目前是固定的3中颜色之间随机,返回拼接好的css即可
    randomColor() {
          let arr = ['50, 166, 124', '125, 144, 94', '51, 124, 212'];
          let color = Math.floor(Math.random() * 3);
          return {
              color: 'rgb(' + arr[color] + ')',
              'border-color': 'rgb(' + arr[color] + ')'
          };
      }
    

    2.uniapp开发微信小程序,h5,app的主体内容和导航栏与状态栏的适配

    //顶部手机状态栏一般只需要加高导航栏,或者预留一块空白区域即可避免状态栏遮挡导航栏
    //导航栏和主体内容之间,一般会进行计算后得到高度
    //一般顶部导航栏都是使用了定位,所以会脱离文档流,这里我们使用了导航栏组件,而导航栏一般都是44px的高度
    <u-navbar title="导航栏" autoBack></u-navbar>
    <view class="list" :style="{ position: 'absolute', top: sHeight }">
      //主体内容区域,写业务逻辑代码
    </view>
    
    //js:
    // 计算距离顶部安全高度(顶部状态栏的高度加上导航栏的高度,如果导航栏高度不固定,可以通过获取节点信息来获取导航栏高度)
    getStatusHeight() {
        this.sHeight = uni.getSystemInfoSync().statusBarHeight + 44 + 'px';
        console.log(this.sHeight);
    },
    

    3.商城项目评论数、销量、库存等数字的格式化体现

    //业务需求是把所有的有关数字类的数据(除了金钱,时间等)做一个格式化处理,例如1230 => 1000+
    //辅助工具类代码可以自己创建一个js放置该代码,或者使用vue的过滤器filter,相关知识点自行搜索。这样就可以进行全局使用,复用比较方便
    export function handleNum(num) {
        if (num < 1000) {
            return num
        }
        if (num < 10000 && num >= 1000) {
            let numArr = ((num / 1000) + '').split('.')
            if (numArr.length > 1) {
                if (numArr[1][0] === '0') {
                    return numArr[0] + '000+'
                } else {
                    return numArr[0] + numArr[1][0] + '00+'
                }
            } else {
                return (numArr[0] + '000+')
            }
        } else if (num >= 10000) {
            let numArr = ((num / 10000) + '').split('.')
            if (numArr.length > 1) {
                if (numArr[1][0] === '0') {
                    return numArr[0] + '万+'
                } else {
                    return numArr[0] + '.' + numArr[1][0] + '万+'
                }
            } else {
                return (numArr[0] + '万+')
            }
        }
    
    }
    

    4.uniapp开发 页面通过拼接路由地址的传参方式(复杂型数据)

    //假设有2个页面
    index.vue
    cindex.vue
    
    //index.vue:
    //路由跳转,index页面跳转到cindex并携带参数
    uni.navigateTo({
        url: `/pagesA/cindex/cindex?dataList=${encodeURIComponent(JSON.stringify(dataList))}`
    });
    
    //接收由index页面带来的参数
    //cindex.vue:
    onLoad(option) {
        this.dataList = JSON.parse(decodeURIComponent(option.dataList));
    },
    

    5.跨越多页面,组件之间的传参

    //uni.$emit()  发送事件(vue则是this.$emit())具体用法类似
    //uni.$on 或者 uni.$once  接收事件,并做后续的逻辑处理
    //uni.$off 移除或卸载事件(避免多个页面事件杂乱,会影响到其他页面)
    

    6.基于原生框架的上拉和下拉刷新逻辑

    //在page.js中注册页面时
    {
        "path": "pages/index/index",
        "style": {
            "navigationBarTitleText": "首页",
            "enablePullDownRefresh": true,   //开启刷新
            "navigationStyle": "custom"
        }
    },
    
    //上拉事件生命周期和onload同级(上拉刷新)
    onPullDownRefresh() {
        //业务逻辑
        uni.stopPullDownRefresh(); //逻辑执行完停止刷新事件
    },
    
    //触底事件生命周期和onload同级(下拉加载)
    onReachBottom() {
        //业务逻辑
    },
    

    7.倒计时

    computetTime(current, create) {
            let st = current.replace(/\-/g, '/'), //当前服务器实时时间
                  ct = create.replace(/\-/g, '/'); //创建订单的时间
            let ts = new Date(st).getTime(),
                  tc = new Date(ct).getTime();
            let cm = 30 * 60 * 1000 - (ts - tc);  //固定30分钟倒计时
            this.runBack(cm);
        },
    runBack(cm) {
        if (cm > 0) {
            cm > 60000
                ? (this.rocallTime =
                    (new Date(cm).getMinutes() < 10 ? '0' + new Date(cm).getMinutes() : new Date(cm).getMinutes()) +
                    ':' +
                    (new Date(cm).getSeconds() < 10 ? '0' + new Date(cm).getSeconds() : new Date(cm).getSeconds()))
                : (this.rocallTime = '00:' + (new Date(cm).getSeconds() < 10 ? '0' + new Date(cm).getSeconds() : new Date(cm).getSeconds()));
            let _msThis = this;
            this.timeOut = setTimeout(function() {
                cm -= 1000;
                _msThis.runBack(cm);
            }, 1000);
        } else {
            uni.navigateBack({
                delta: 1
            });
            setTimeout(() => {
                this.tui.toast('该订单支付已超时');
            },300)
            if (this.timeOut) {
                this.timeOut = null;
                clearTimeout(this.timeOut);
            }
        }
    },
    
    

    8.返回上一页并刷新数据。当前方法是根据获取路由信息,得到页面实例,最终获取页面的刷新事件进行实现(需求场景:订单详情取消订单后返回上一页订单列表并刷新数据)

    //封装一个函数:(该方法有弊端,必须有跳转页面的路由记录才能进行使用)
    //num 自行传参,根据不同的场景,类型是数字,传2就是上一个页面,以此类推
    backReload(num){
        let pages = getCurrentPages(); //得到进入过的页面的列表
        let beforePage = pages[pages.length - num]; 
        beforePage.$vm.$refs.paging.reload()   //$vm是页面信息,包括页面的data,逻辑函数等等($refs.paging.reload() 是我这边列表的刷新方法)
    }
    

    9.uniapp获取页面节点信息

    let selectorQuery = uni.createSelectorQuery();
        selectorQuery
            .selectAll('.className').boundingClientRect(data => {      //.className是类名
                console.log(data)
            })
    .exec();
    

    相关文章

      网友评论

          本文标题:uniapp学习历程

          本文链接:https://www.haomeiwen.com/subject/oharldtx.html