微信小程序开发手记之八:一个小程序上线后的总结(下)

Posted 王梵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信小程序开发手记之八:一个小程序上线后的总结(下)相关的知识,希望对你有一定的参考价值。

今天,说一下项目开发中遇到的一些问题,和一些效果。如果大家遇到了一些效果不好实现的,也可以给我留言,移动猿不怕尝试。

网络请求该怎么写

这个似乎不是个问题,但其实是的,先来看一个请求的代码。

wx.request(
  url: 'https://test.wisely.com/index.html?latitude=36.8962&longitude=132.5730',
  data: ,
  method: 'GET', 
  success: function(res)
    // success
  ,
  fail: function(res) 
    // fail
  ,
  complete: function(res) 
    // complete
  
)

直接将地址和参数都拼接起来,赋给url,行不行?可以。但这么写不规范,正确地写法应该是下面这样

wx.request(
  url: 'https://test.wisely.com/index.html',
  data: 
      latitude:36.8962,
      longitude:132.5730
  ,
  method: 'GET', 
  success: function(res)
    // success
  ,
  fail: function(res) 
    // fail
  ,
  complete: function(res) 
    // complete
  
)

第二种书写方式,将get请求的参数,放在data中,url中只保留地址,这样的好处显而易见,当url+参数很长时,并且参数都是变量,将参数写在data中,非常容易修改。
相信我,真的很容易修改!

点击列表组件的item,跳转到另一个页面

这个似乎是个很傻的问题,用navigator标签啊,或者用wx.navigateTo方法啊,但是,在项目中,怎么实现呢?navigator标签该怎么用,wx.navigateTo方法该怎么写?
先来看下要实现的效果

先是一个列表页,然后点击item,跳转到另一个页面,并且将item中的数据传递给了第2个页面。
好,我们先来看列表页

<view wx:for="list">
    <navigator url="../wiselyer/wisely?text=item">
        <text>item</text>
    </navigator>
</view>

js中的变量不在给出。
注意看navigator标签中的url,它的后面是拼接了一个text变量的,并且值为所点击的item的数据。
我们来看下第2个页面

<text>text</text>
Page(
  data:
    text:"",
  ,
  onLoad:function(options)
    var text = options.text
    this.setData(
      text:text
    )
  
  

在js方法中,onLoad中有参数options,通过它,可以获取到前一页面传递过来的参数,参数名就是navigator标签中写的。
so easy!!
那么问题来了,navigator标签的写法会了,wx.navigateTo该怎么写?
简单,绑定点击事件啊!
将列表页的wxml改改,如下

<view wx:for="list">    
    <text bindtap="itemClick" data-item="item"item</text>
</view>
Page(
  data:

    list:[
      "aa",
      "bb",
      "cc"
    ]
  ,
  itemClick:function(args)
    var item = args.currentTarget.dataset.item
    wx.navigateTo(
      url: '../wiselyer/wisely?text='+item,
      success: function(res)
        // success
      ,
      fail: function(res) 
        // fail
      ,
      complete: function(res) 
        // complete
      
    )
  

)

第2个页面不用动,运行效果是一模一样的。至于从wxml中向js中传值没搞懂的,看一下前面一篇文章

显示默认图片

比如说一个轮播图,结果没获取到图片,那也不能留着一片空白,是不,需要显示一张默认图片,默认图片该怎么显示呢?
好办,看下面

<view class="container">

    <!--显示默认图片-->
    <image wx:if="url.length == 0" src="../../images/index_bg.png"></image>
    <image wx:else src="url"></image>

</view>
Page(
  data:
    url:"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1494250838736&di=49c4ea7869bc39ca26ceccdf978ed493&imgtype=0&src=http%3A%2F%2Fpic.58pic.com%2F58pic%2F13%2F56%2F99%2F88f58PICuBh_1024.jpg"
  ,

)

当url的长度为0时,显示默认图片,不为0时,显示url对应的图片。

文本显示一行,多出的文字显示省略号

先看下效果图

<view class="container">

    <!--省略为...-->
    <view class="demo" style="background-color:#f2f2f2;width:400rpx;height:100rpx;">

        <text class="text">ababcabcdabcdeabcdefabcdefg</text>
        <text>bbbbb</text>

    </view>

    <!--省略为...-->
    <view class="demo_2" style="background-color:#d2d2d2;width:400rpx;height:100rpx;">
        <text class="text">ababcabcdabcdeabcdefabcdefg</text>
    </view>

</view>
.demo
    display: flex;
    justify-content: space-between;

.demo_2
    display: flex;
    flex-direction: column;


.text
    overflow:hidden; 
    text-overflow:ellipsis;
    white-space:nowrap; 

在写的时候,效果一直出不来,后来发现,在wxss中的class为demo_2,在wxml中写成了demo-2,所以不对

控制文本显示的行数

国际惯例,先看张图

来看布局

<view class="container">

    <!--限制显示行数为3行,超出显示...-->
    <view class="demo_2" style="background-color:#a2a2a2;width:400rpx;height:200rpx;">
        <text class="text_3">content</text>
    </view>

    <!--限制显示行数为5行,其实内容只有4行的情况-->
    <view class="demo_2" style="background-color:#828282;width:400rpx;height:200rpx;">
        <text class="text_5">content</text>
    </view>

</view>
.demo_2
    display: flex;
    flex-direction: column;


.text_3
    display: -webkit-box ;
    overflow: hidden;
    text-overflow: ellipsis;
    word-break: break-all;
    -webkit-box-orient: vertical;
    -webkit-line-clamp:3; 

.text_5
    display: -webkit-box ;
    overflow: hidden;
    text-overflow: ellipsis;
    word-break: break-all;
    -webkit-box-orient: vertical;
    -webkit-line-clamp:5; 
Page(
  data:
    content:"ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
  

)

数组拼接技巧

<view class="container">
    <button type="primary" bindtap="click">点击拼接字符串</button>

    <view wx:for="list">
        <text>item</text>
    </view>
</view>
Page(
  data:

      list:[
        "aa"
      ]
  ,
  click:function()
    var list = [
      "bb"
    ]

    var l = this.data.list
    for(var i=0;i<list.length;i++)

      var item = list[i]
      l.push(item)
    

    this.setData(
      list:l
    )
  

)

点击按钮后调用click方法,拼接数组,我之前一直用的是push方法,但后来发现,还有更好的方法concat方法,如下

Page(
  data:

      list:[
        "aa"
      ]
  ,
  click:function()
    var list = [
      "bb"
    ]

    var that = this
    this.setData(
      list:that.data.list.concat(list)
    )
  

)

虽然这个技巧大家可能都知道,但我之前真的不知道啊….

app.js中获取经纬度的问题

在我们的项目中,很多网络接口的访问都需要传入经纬度,所以准备在app.js中获取一次经纬度,然后赋值给变量,这样就不用每次调用获取经纬度的方法了。
貌似思路没错,对不?
但是,真正实现的时候有问题,不管将访问接口的操作放在onShow方法还是onLoad方法中,都可能在app.js中的经纬度还没获取到,就完成了生命周期方法的调用,所以,访问接口就出问题了。
于是,在每次调用有关经纬度的接口之前,都会先判断一样是否已经获取到了经纬度(可以通过变量的长度),如果没有,就再次调用获取经纬度的接口。

获取经纬度的api是wx.getLocation方法

scroll-view标签

坑1:scroll-view不显示


如果你设置了scroll-view标签,一切看上去都没问题,但就是不显示,那么最大的可能是没有为scroll-view设置高度(或者设置成了100%),因为,它的默认高度为0,不设置高度,当然显示不出来。(貌似有时候不用设置高度也行,原因搞不清了,暂且这么记录吧)


坑2:scroll-view标签设置了bindscrolltolower,实现上拉加载时,数据重复加载。


scroll-view标签中有属性bindscrolltolower,当滑动到底部时,就会触发,我们可以用来实现上拉加载。但是,在实现的时候有一个问题,在上拉的过程中,因为分页加载也是需要时间的,这就导致可能多次触发bindscrolltolower对应的方法,所以,我们需要设置一个标识符,只有当一次分页加载完成后,才能进行下一次,避免加载到重复数据


坑3:上拉加载更多时,加载更多之类的文字,要写在scroll-view标签内部(记忆模糊了,又不想再验证…)

关于域名

在正式项目中,域名必须是https协议的。如果你的域名是https协议,但还是在真机上获取不到接口数据,那么最大的可能就是域名缺少中间证书,可以在这里检测

另一点,正式项目中,是否可以使用http地址的图片?答案是可以!

background不显示问题

如果设置background属性或者background-image属性时,使用了本地的图片,那么在真机上是不显示的,所以,尽量避免使用background或background-image来设置图片,如果必须使用的话,那么需要将图片放在服务器上,通过网络路径来设置。

显示上拉加载的进度圈

来看一个加载的效果

当初看到要实现这个效果,我是很懵逼的,这怎么搞,旋转动画?后来还是一个前端的哥们儿实现了这个效果,如下

<view class="container">

    <view>
        <text>正在加载</text>
        <view class="weui-loading"></view>
    </view>

</view>
.weui-loading 
  width: 20px;
  height: 20px;
  display: inline-block;
  vertical-align: middle;
  -webkit-animation: weuiLoading 1s steps(12, end) infinite;
  animation: weuiLoading 1s steps(12, end) infinite;
  background: transparent url(data:image/svg+xml;base64,PHN2ZyBjbGFzcz0iciIgd2lkdGg9JzEyMHB4JyBoZWlnaHQ9JzEyMHB4JyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj4KICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIiBmaWxsPSJub25lIiBjbGFzcz0iYmsiPjwvcmVjdD4KICAgIDxyZWN0IHg9JzQ2LjUnIHk9JzQwJyB3aWR0aD0nNycgaGVpZ2h0PScyMCcgcng9JzUnIHJ5PSc1JyBmaWxsPScjRTlFOUU5JwogICAgICAgICAgdHJhbnNmb3JtPSdyb3RhdGUoMCA1MCA1MCkgdHJhbnNsYXRlKDAgLTMwKSc+CiAgICA8L3JlY3Q+CiAgICA8cmVjdCB4PSc0Ni41JyB5PSc0MCcgd2lkdGg9JzcnIGhlaWdodD0nMjAnIHJ4PSc1JyByeT0nNScgZmlsbD0nIzk4OTY5NycKICAgICAgICAgIHRyYW5zZm9ybT0ncm90YXRlKDMwIDUwIDUwKSB0cmFuc2xhdGUoMCAtMzApJz4KICAgICAgICAgICAgICAgICByZXBlYXRDb3VudD0naW5kZWZpbml0ZScvPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyM5Qjk5OUEnCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSg2MCA1MCA1MCkgdHJhbnNsYXRlKDAgLTMwKSc+CiAgICAgICAgICAgICAgICAgcmVwZWF0Q291bnQ9J2luZGVmaW5pdGUnLz4KICAgIDwvcmVjdD4KICAgIDxyZWN0IHg9JzQ2LjUnIHk9JzQwJyB3aWR0aD0nNycgaGVpZ2h0PScyMCcgcng9JzUnIHJ5PSc1JyBmaWxsPScjQTNBMUEyJwogICAgICAgICAgdHJhbnNmb3JtPSdyb3RhdGUoOTAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNBQkE5QUEnCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgxMjAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNCMkIyQjInCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgxNTAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNCQUI4QjknCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgxODAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNDMkMwQzEnCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgyMTAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNDQkNCQ0InCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgyNDAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNEMkQyRDInCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgyNzAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNEQURBREEnCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgzMDAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNFMkUyRTInCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgzMzAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0Pgo8L3N2Zz4=) no-repeat;
  background-size: 100%;

挺长的一个长串,不明觉厉,记录在这里。

tab效果

效果图如下

实现如下

<view class="container">

    <view class="toptab flex-wrp flex-tab ">
            <view class="tobtab index==0?'active':''" data-current="0" bindtap="switchTab">
           距离最近
            </view>
             <view class="tobtab index==1?'active':''" data-current="1" bindtap="switchTab">
           热门推荐
            </view>
      </view>

</view>
<view class="container">

    <view class="toptab flex-tab ">
            <view class="tobtab index==0?'active':''" data-current="0" bindtap="switchTab">
           距离最近
            </view>
             <view class="tobtab index==1?'active':''" data-current="1" bindtap="switchTab">
           热门推荐
            </view>
      </view>

</view>
.toptab
  width: 100%;
  background-color: #fff;
  height: 90rpx;
  line-height: 90rpx;
  font-size: 30rpx;

.tobtab.active
  color: #75b74d;
  font-weight: bold;
  border-bottom: 2px solid #75b74d;


.flex-tab
  display: flex;
  flex-flow: row nowrap;
  justify-content: space-around;
  align-items: stretch;
Page(
  data:
      index:0
  ,
  switchTab:function(e)
    var i = e.currentTarget.dataset.current
    this.setData(
      index:i
    )
  

)

这是tab的效果,如果tab中为icon+文字,那么实现起来会复杂一些,大家自行实现。

其它的一些小技巧与备忘

  • 抽取模版,尤其是一些列表的模版,一模一样,抽取出来方便你我他。
  • 一些字符串的操作,可以搜索js中的字符串操作,曾经一度很茫然,不知道小程序中的字符串操作的方法是啥,后来才知道,就是js的字符串操作
  • 数组操作的一些方法,其实就是js的数组操作。
  • 本地资源无法通过 css 获取
    background-image:可以使用网络图片,或者 base64,或者使用标签,
    你要用自己的图片的话只能先把它放到网上或者自己的服务器(有外部域名,能访问)上,用网络地址访问(PS:这句话来自网络)
  • 小程序最多打开5个页面,所以如果发现一直点击一个页面点击不开,有可能是已经达到了页面的上限。
  • 从提交审核到审核通过,大概花了不到1个工作日时间(第一天下班的时候提交,第二天下午4,5点左右就审核通过)

资料链接

以上是关于微信小程序开发手记之八:一个小程序上线后的总结(下)的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序开发手记之七:一个小程序上线后的总结(上)

微信小程序开发手记之七:一个小程序上线后的总结(上)

微信小程序开发优秀教程及文章合集第一期

[转]灯灯小程序开发手记:仿今日头条(上)

来客推:微信小程序开发制作流程 简单4步搞清楚丨小程序开发

微信小程序开发总结(附源代码)