小程序--组件篇

因为不太习惯小程序的写法,过一段时间没有写的话就会忘记,每次都要重新看文档,所以在这里记录下小程序经常会用到的组件,防止脑子短路的时候,什么都乱~

微信开卡组件(会员一键开卡)

小程序文档:文档-API-开放接口-卡券-会员卡组件https://mp.weixin.qq.com/debug/wxadoc/dev/api/card.html#%E4%BC%9A%E5%91%98%E5%8D%A1%E7%BB%84%E4%BB%B6
https://mp.weixin.qq.com/cgi-bin/announce?action=getannouncement&key=1479824356&version=1&lang=zh_CN&platform=2
微信详细版本: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1499332673_Unm7V

image.png
image.png

image.png

image.png
// 在app的onshow中获取参数
App({
onShow(opitons){
  if(options.referrerInfo.appId){}
  if(options.referrerInfo.extraData.url == '/pages/index/index')
}
})

第三方平台发布小程序代码注意点

  • extJson:记录自定义属性【page,APPID】
  • 流程:微信开发者工具提交代码-到开放平台将草稿箱中的一个模板添加到模板-调用第三方平台接口提交代码包-体验版二维码-提交审核-审核通过-发布过审代码

scroll-view

这个组件,有时候脑子清醒的时候很容易就看清楚文档写出来了,但是有时候却迷迷糊糊,越乱越着急,所以在此贴上代码
这里要注意的点:scroll-view 里面设置scroll-x,然后加一个子层view(此view要设置具体的高度/宽度,内容的实际宽度,滑动的区间)

<!-- 横向滚动-->
 <scroll-view scroll-x scroll-with-animation>
    <view style="width:800px">
        <view class="item">4234</view>
        <view class="item">21234</view>
        <view class="item">000</view>
        <view class="item">111</view>
        <view class="item">5555</view>
        <view class="item">7777</view>
        <view class="item">21</view>
        <view class="item">4234</view>
        <view class="item">9999</view>
        <view class="item">888</view>
    </view>
 </scroll-view>
<!-- 纵向滚动 -->
<scroll-view scroll-y scroll-with-animation>
    <view style="height:100px;">
        <view class="item">7777</view>
        <view class="item">21</view>
        <view class="item">4234</view>
        <view class="item">9999</view>
        <view class="item">888</view>
    </view>
</scroll-view>
.item{
    flex: 0 0 auto;  // 自动适应每个元素的宽度
    display: inline-block;
    // width: 150rpx;
    height: 200rpx;
    margin: 20rpx 10rpx;
    border: 1px solid #ccc;
    text-align: center;
}
// 在安卓设备上滑动会出现滚动条,可以给滚动条设置样式,使其隐藏
::-webkit-scrollbar {
    width: 0;
    height: 0;
    color: transparent;
}

左滑删除

https://juejin.im/post/5be81e1251882516f578628a
注意:ios设备下的z-index无效

swiper 实现跑马灯效果

<!-- 跑马灯 -->
    <view class="list">
        <swiper circular="true" previous-margin="70px" next-margin="70px" skip-hidden-item-layout bindchange="handleSwiper">
            <block wx:for="{{imgUrls}}">
                <swiper-item >
                <image src="{{item}}" class="slide-image {{index == current? 'img-active' : ''}}"/>
                </swiper-item>
            </block>
        </swiper>
    </view>

//js
<script>
Page({
  data: {
    current: 0,
    imgUrls: [
      'http://img02.tooopen.com/images/20150928/tooopen_sy_143912755726.jpg',
      'http://img06.tooopen.com/images/20160818/tooopen_sy_175866434296.jpg',
      'http://img06.tooopen.com/images/20160818/tooopen_sy_175833047715.jpg'
    ]
  },
handleSwiper(e) {
    var i = e.detail.current
    this.setData({
      current: i
    })
  }
})

</script>
//css
<style>
.list{
    margin: 30rpx 0 0;
}
.list swiper{
    width: 100%;
    height: 500rpx;
}
.list swiper-item{
    width: 100%;
    height: 100%;
}
.swiper-item{
    width: 80%;
    overflow: auto;
  }
  .slide-image{
    width: 380rpx;
    height: 380rpx;
    margin: 35rpx auto;
    text-align: center;
  }
  .img-active{
    width: 480rpx;
    height: 500rpx;
    margin-top: -50rpx;
    box-shadow: 0 0 10rpx rgba(0,0,0,0.3);
  }
</style>

复制粘贴

wx.setClipboardData(Object object)

wx.setClipboardData({
  data: 'data',
  success(res) {
    wx.getClipboardData({
      success(res) {
        console.log(res.data) // data
      }
    })
  }
})

小程序显示富文本内容

最近小程序也新增了富文本组件【rich-text】,使用过程中如果图片过大显示不全,可以使用正则表达式做一些适配

<rich-text node="data"></rich-text>
let data = "<p><img src="https://aa.com/aa.png"/></p>";
data = data.replace(/\<img/gi,"<img style='width:100%;height:auto;'");

web-view:在小程序中内嵌网页

<web-view  src="https://baidu.com"></web-view>
image.png

需要先做设置才能在小程序打开网页:小程序公众号后台--开发设置--添加业务域名【同时下载一份文件放到服务器根目录下】

在小程序中使用自定义组件

Component({
    properties: {
        tabActive: String,
        positionSlug: String,
        groupId: Number
    },
    data: {
        device: ''
    },

    ready() {
        let _this = this
        wx.getSystemInfo({
            success(res) {
                console.log(res.model)
                if (res.model.indexOf('iPhone X') != -1) {
                    _this.setData({
                        device: 'iphoneX'
                    })
                }
            }
        })
    }
})
  • 使用组件:在需要引用组件的index.json中添加 usingComponents
    "usingComponents": {
        "navigation-tab": "/pages/components/navigationTab/index"
    }

适应iphone X 底部一栏抬高

// indexOf()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。
      let _this = this
      wx.getSystemInfo({
            success(res) {
                console.log(res.model)
                if (res.model.indexOf('iPhone X') != -1) {
                    _this.setData({
                        device: 'iphoneX'
                    })
                }
            }
        })

PHP生成小程序码

  /**
     * 生成小程序码
     */
    public function getGoodsMinaCode(Request $request){
        $goods_id = $request->goods_id;
        $goods_sn = $request->goods_sn;
        $this->openPlatform = \EasyWeChat::openPlatform();

        $app = WeChatAuth::query()->where([
            'business_no' => $this->business_no,
            'auth_type'   => 3,
        ])->select('app_id', 'refresh_token')->first();

        $app =  $this->openPlatform->miniProgram($app['app_id'], $app['refresh_token']);
        $response = $app->app_code->get('pages/index/details/index?id=' . $goods_id, []);
//        $response = $app->app_code->getUnlimit('scene-value', [
////            'path' => 'pages/point/gift-record/index'
//            'path' => 'pages/index/details/index?id='.$goods_id
//
//        ]);

        if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) {
            $filename = $response->saveAs(public_path('frontend/weChatMall/goodsMinaCode/'.$this->business_no), $goods_sn.'.png');
            $path = 'https://crm.pinkr.com/frontend/weChatMall/goodsMinaCode/'.$this->business_no.'/'.$filename;
            return $this->returnJsonMsg(200,['url'=>$path]);
        }
    }

小程序热启动与冷启动

image.png

更新新版本:wx.getUpdateManager API

  • 小程序发布一个新版本之后,让用户自己的小程序也更新到最新版本
  • 小程序冷启动时如果发现有新版本,将会异步下载新版本的代码包,并同时用客户端本地的包进行启动,即新版本的小程序需要等下一次冷启动才会应用上,如果需要马上应用最新版本,可以使用wx.getUpdateManager API 进行处理

热启动:
用户已经打开过某小程序,在一定时间内(5min)再次打开
此时无需重新启动,只需要将后台态的小程序切换到前台

冷启动:
用户首次打开 / 小程序被微信主动销毁后 再次打开,
此时小程序需要重新加载启动

重启:
小程序没有重启的概念,
当小程序进入后台,客户端会维持一段时间的运行状态,超过一定时间后(目前是5min)会被微信主动销毁
当短时间内(5s)连续收到两次以上收到系统内存告警,会进行小程序的销毁
一、运行机制

小程序启动会有两种情况,一种是「冷启动」,一种是「热启动」。
假如用户已经打开过某小程序,然后在一定时间内(五分钟)再次打开该小程序,此时无需重新启动,只需将后台态的小程序切换到前台,这个过程就是热启动;
冷启动指的是用户首次打开或小程序被微信主动销毁后再次打开的情况,此时小程序需要重新加载启动。

小程序没有重启的概念
当小程序进入后台,客户端会维持一段时间的运行状态,超过一定时间后(目前是5分钟)会被微信主动销毁
当短时间内(5s)连续收到两次以上收到系统内存告警,会进行小程序的销毁
二、更新机制

小程序冷启动时如果发现有新版本,将会异步下载新版本的代码包,并同时用客户端本地的包进行启动,即新版本的小程序需要等下一次冷启动才会应用上。 如果需要马上应用最新版本,可以使用 wx.getUpdateManager API 进行处理。

小程序分包

分包是为了优化首次加载小程序包的速度,后面按需加载

// 在app.json中,在pages[] 后面,加上subpackages, 
// root 是分包的根目录,name是分包名称
"subpackages": [{
            "root": "pages/livePlayer",
            "name": "livePlayer",
            "pages": [
                "list/index"
            ],
            "plugins": {
                "live-player-plugin": {
                    "version": "1.0.4",
                    "provider": "wx2b03c6e691cd7370"
                }
            }
        }

图片懒加载

小程序官方有个懒加载,只需要在image标签加上lazy-load="true"即可
注意,swiper中不能用懒加载,只能在列表中用

    <image src="{{item.img}}" mode="widthFix" class="min-img" lazy-load="true"></image>

骨架屏

https://github.com/jayZOU/skeleton
小程序中引入骨架屏组件,然后判断是否显示,给元素并设置类名:.skeleton-rect / .skeleton-radius

自定义组件

生命周期
created: function(){}, // 组件在内存中创建完毕执行
attached: function(){}, // 组件挂载之前执行
ready: function() {}, // 组件挂载后执行
detached: function(){}, // 组件移除执行
moved: function(){}, // 组件移动的时候执行

小程序官网中并没有明确地说明组件的生命周期,通过查阅资料,内容大致如下:

  • created 组件实例化,但节点树还未导入,因此这时不能用setData
  • attached 节点树完成,可以用setData渲染节点,但无法操作节点
  • ready(不是onReady) 组件布局完成,这时可以获取节点信息,也可以操作节点
  • moved 组件实例被移动到树的另一个位置
  • detached 组件实例从节点树中移除

组件所在页面的生命周期

pageLifeTimes: {
  show(){},
  hide(){}
}
image.png

小程序所在页面的生命周期

image.png

全局配置分享设置

微信小程序没有全局分享配置,页面开启分享功能必须要在页面中定义分享事件函数 onShareAppMessage 才可以。如果项目中对页面分享的需求比较复杂点,那么默认的自定义分享会很麻烦的,而且还不一定能满足我们的需求,因此全局自定义分享配置的实现就非常有必要了。
不仅仅能实现全局分享,还可以对不同页面实现不同的分享配置

image.png
//  utils/shareConfig.js: 重写分享方法
var overShare = (that) => {
  // that 为app.js传进来的变量
  // 定义非全局分享的页面: 这些页面的分享将会按照单个页面中写的onShareAppMessage方法去执行转发
  let noGlobalShare = [
    'pages/A/index',
    'pages/B/index'
  ]
  
  // 监听路由切换, 间接实现全局设置分享内容
  wx.onAppRoute(function (res) {
    let pages = getCurrentPages(),
        view = pages[pages.length - 1],  //获取当前页面的对象
        routerUrl,  // 当前页面路由
        options;  // 当前页面参数
    if (view) {
      routerUrl = view.route // 当前页面路由
      options = view.options;
      // 如果页面带有参数,则做好url拼接
      if(Object.keys(options) && Object.keys(options).length > 0) {
        routerUrl += '?'
        for(let key in options) {
          if(key) {
            routerUrl = routerUrl + key + '=' + options[key] + '&'
          }
        }
        routerUrl = routerUrl.substr(0, routerUrl.length - 1)
      }
      if(!noGlobalShare.includes(view.route)) {
        // 分享配置
        view.onShareAppMessage = function () {
            return {
                title: '分享配置标题',
                imageUrl: '分享配置图片',
                path: routerUrl,
            };
        }
        view.onShareTimeline = function () {
            return {
                title: '分享配置标题',
                imageUrl: '分享配置图片',
                path: routerUrl,
            };
        }
      }
    }
  })
}

module.exports = overShare

// 在app.js 中的onLaunch调用
// 给所有页面配置分享到朋友圈(这里因为有些页面没有写这个方法,所以先给全局页面都增加)
var PageTmp = Page;
Page = function (pageConfig) {
  pageConfig = Object.assign({
    onShareTimeline: function () {}
  },pageConfig);
  PageTmp(pageConfig);
};

import overShare from './utils/shareConfig';
App({
  onLaunch() {
    overShare(this)
  }
})

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容