小程序的坑和技巧

1,136 阅读6分钟

position:stick;

基本功能:位于一个页面非顶部的元素,随着滚动条滚动会自动吸附到指定位置。
特点是:父容器overflow必须是visible。
问题: 网上有博客说
1、z-index 设置无效;
2、当父元素的height:100%时,页面滑动到一定高度之后sticky属性会失效。
这两个问题我没有遇到,为什么?
效果滚动前:

滚动后:

<view class="wrap">
  <view class="search-item">1</view>
  <view class="search-item">2</view>
  <view class="top-item">stick</view>
  <view class="goods-list">
    <scroll-view scroll-y>
 到南京时,有朋友约去游逛,勾留7了一日;第二日上午便须渡江到浦口,下午上车北去。父亲因为事忙,本已说定不送我,叫旅馆里一个熟识的茶房8陪我同去。他再三嘱咐茶房,甚是仔细。但他终于不放心,怕茶房不妥帖9;颇踌躇10了一会。其实我那年已二十岁,北京已来往过两三次,是没有什么要紧的了。他踌躇了一会,终于决定还是自己送我去。我再三劝他不必去;他只说:“不要紧,他们去不好!”
我们过了江,进了车站。我买票,他忙着照看行李。行李太多,得向脚夫11行些小费才可过去。他便又忙着和他们讲价钱。我那时真是聪明过分,总觉他说话不大漂亮,非自己插嘴不可,但他终于讲定了价钱;就送我上车。他给我拣定了靠车门的一张椅子;我将他给我做的紫毛大衣铺好座位。他嘱我路上小心,夜里要警醒些,不要受凉。又嘱托茶房好好照应我。我心里暗笑他的迂;他们只认得钱,托他们只是白托!而且我这样大年纪的人,难道还不能料理自己么?我现在想想,我那时真是太聪明了。
我说道:“爸爸,你走吧。”他往车外看了看,说:“我买几个橘子去。你就在此地,不要走动。”我看那边月台的栅栏外有几个卖东西的等着顾客。走到那边月台,须穿过铁道,须跳下去又爬上去。父亲是一个胖子,走过去自然要费事些。我本来要去的,他不肯,只好让他去。我看见他戴着黑布小帽,穿着黑布大马褂12,深青布棉袍,蹒跚13地走到铁道边,慢慢探身下去,尚不大难。可是他穿过铁道,要爬上那边月台,就不容易了。他用两手攀着上面,两脚再向上缩;他肥胖的身子向左微倾,显出努力的样子。这时我看见他的背影,我的泪很快地流下来了。我赶紧拭干了泪。怕他看见,也怕别人看见。我再向外看时,他已抱了朱红的橘子往回走了。过铁道时,他先将橘子散放在地上,自己慢慢爬下,再抱起橘子走。到这边时,我赶紧去搀他。他和我走到车上,将橘子一股脑儿放在我的皮大衣上。于是扑扑衣上的泥土,心里很轻松似的。过一会儿说:“我走了,到那边来信!”我望着他走出去。他走了几步,回过头看见我,说:“进去吧,里边没人。”等他的背影混入来来往往的人里,再找不着了,我便进来坐下,我的眼泪又来了。
    。。。
    这里多加一些
    </scroll-view>
  </view>
</view>
    .wrap{
      width: 100%;
      color: wheat;
      height: 100%;
      /* overflow: auto; */
    }
    .search-item{
      height: 500rpx;
      background-color: blue;
    }
    .top-item{
      position: -webkit-sticky;
      position: sticky;
      top: 0rpx;
      z-index: 3;
      background-color: gray;
    }
    .goods-list{
      color: white;
      background-color: red;
    }

首页广告

首页全屏显示广告,并可以关闭,实现自定义Modal。

<view class="wrap" wx:if="{{showModal}}" catchtouchmove="noneEnoughPeople">
  <image mode="aspectFit" class="first-sight" src="/static/first-sight.jpg"></image>
  <image mode="aspectFit" class="close_circle" src="/static/close_circle.png" bindtap="close"></image>
</view>

原理很简单:最外层wrap是flex布局,并且是固定定位。这里的技巧是图片显示采用 mode="aspectFit",缩放模式,保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以完整地将图片显示出来。

scroll-view 的 scroll-top 属性

scroll-view要设置height,scroll-top=0才会返回到顶部

文字滚动

技巧点:

  1. wx:if会重新渲染,添加动画类,触发动画;
  2. setInterval(()=>{}, 5000); 每隔 5秒 执行一次,加上动画,这个值要改一下。
<view class="roll-wrap">
  <view><image src="/static/horn.png" class="roll-image"></image></view>
  <view class="text-wrap">
    <view wx:if="{{pauseRoll}}" class="textPre">
      <text class="roll-item">{{rollArr[curIndex]}}</text>
      <text class="roll-item">{{rollArr[nextIndex]}}</text>
    </view>
    <view wx:if="{{!pauseRoll}}" class="textPre">
      <text class="roll-item">{{rollArr[curIndex]}}</text>
      <text class="roll-item">{{rollArr[nextIndex]}}</text>
     </view>
  </view>
</view>  

顶部自定义banner

  1. 在.json文件中修改配置: "navigationStyle": "custom"
  2. 自定义顶部banner。
  3. 适配兼容各种机型:可以利用 wx.getMenuButtonBoundingClientRect();获取胶囊按钮的位置,接下来就可以为所欲为了。

小程序的生命周期

小程序的一辈子: 打开小程序:(App)onLaunch --> (App)onShow --> (Pages)onLoad --> (Pages)onShow --> (pages)onReady 进入下一个页面:(Pages)onHide --> (Next)onLoad --> (Next)onShow --> (Next)onReady 返回上一个页面:(curr)onUnload --> (pre)onShow 离开小程序:(App)onHide 再次进入:小程序未销毁 --> (App)onShow(执行上面的顺序),小程序被销毁,(App)onLaunch重新开始执行.

作者:虞小只 链接:juejin.cn/post/684490… 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

组件技巧

父组件向子组件传值

//在父组件中引用子组件
<poster wx:if="{{posterModal}}" activityId="{{activityId}}" bind:closePoster="onClosePoster"/>

如上,在父组件中引用子组件。activityId会被传给子组件。

  /**
   * 组件的属性列表
   */
  properties: {
    activityId: {
      type: String,
      value: ''
    }
  },

子组件触发父组件的方法

//在父组件中引用子组件
<poster wx:if="{{posterModal}}" activityId="{{activityId}}" bind:closePoster="onClosePoster"/>

父组件的onClosePoster被绑定在子组件上,子组件可以调用:

    //子组件调用
    close:function(e) {
      this.triggerEvent('closePoster');
    },

保存图片到手机相册

blog.csdn.net/m0_38134431… 这篇博客是介绍了很好的思路。我对它进行了优化。刚开始我很纳闷为什么要分第一次?为什么要分第一次呢? 因为如果不判断第一次的话,直接wx.openSetting不久可以了吗?事实是如果直接wx.openSetting,会出现下面的结果

这显然不是我们想要的。好了,说下我的思路:

  1. 保存图片的时候,首先根据 wx.getSetting 来判断当前用户所有的权限;
  2. 判断 authSetting.hasOwnProperty('scope.writePhotosAlbum'),为什么要判断呢?上面已经说了。
  3. 如果没有scope.writePhotosAlbum'这个属性,那么说明没有进行权限的询问,执行wx.authorize({ scope: 'scope.writePhotosAlbum'})

4. 如果有scope.writePhotosAlbum'这个属性,那么说明已经进行过权限的询问,执行wx.openSetting;

event.currentTarget 和 event.target

event.currentTarget是指绑定了事件的当前对象;
event.target触发了事件的对象,如果父元素有子元素的话,由于冒泡的存在,点击子元素的时候event.target是子元素对象。这个时候是获取不到绑定在父元素上的dataset里面的数据的。

点击文本的时候,输出的 target 是子元素,因为事件是绑定在父元素上的,所以currentTarget是父元素。

设置页面不能滑动

在对应的.json文件中设置:"disableScroll": true 即可

转发/分享

官方的例子:developers.weixin.qq.com/miniprogram…
注意:onShareAppMessage、onLoad是带参数的方法!!!

引入自定义字体

  1. 一般字体文件太大,我们可以先提取需要的文字样式。www.fontke.com/tool/subfon… 并下载对应的字体文件;
  2. 通过transfonter.org/ 将.ttf文件转换为base64文件
  3. 在对应 .wxss文件中使用: blog.csdn.net/weixin_4194… blog.csdn.net/weixin_4217…

所有技巧已上传git: github.com/YY88Xu/xiao…