微信小程序> 微信小程序bug集中营

微信小程序bug集中营

浏览量:513 时间: 来源:ai_ma_ai

微信小程序 bug 集中营

create by jsliang on 2018-9-17 17:58:56
Recently revised in 2018-10-18 09:38:15

 

Hello 小伙伴们,如果觉得本文还不错,记得给个 star , 你们的 star 是我学习的动力!GitHub 地址

 GitHub 最新更新:2018-10-17 13:34:11。追求最新文章的小伙伴可前往下载,掘金上的文章每周六、日更新。

写在前面

 首个微信小程序实践记录:
 工作量: PSD 18 张 (导出的 JPG 30 张)
 耗时:12 个工作日
 总结1: 在页面制作商,需要 3 周工作日(工作 15 天)搞定,前后端对接口另计。实际上,12 个工作日可以搞定所有页面,但是应该往前铺 1.5D 熟悉框架,往后铺 1.5D 整理代码。当然每个人的耗时可能不同,可根据个人实际情况进行调整。
 总结2:在 API 调用上,根据接口数量可能需要 7-12 个工作日进行 API 调用,难点表现在: 1. 接口不够丰富,数据量不足; 2. 接口数据不够正式真实,跟前面的假数据相差太大; 3. 接口可能没法正常调用 等原因。故因根据小程序业务逻辑进行工作时长的报备。

这里有 jsliang 微信小程序开发中遇到的所有坑,以及在填坑过程中的一些个人经验。jsliang 利用这篇教程存储一些常用的微信小程序开发技巧,方便查找。它可能教不了你什么,但至少能省下你百度的功夫。

请结合 《目录》 和 《返回目录》 来进行跳转,获得更好的阅读体验。

小程序

 

demo.js

Page({  data: {    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'    ],    indicatorDots: false,    autoplay: false,    interval: 5000,    duration: 1000  },  changeIndicatorDots: function(e) {    this.setData({      indicatorDots: !this.data.indicatorDots    })  },  changeAutoplay: function(e) {    this.setData({      autoplay: !this.data.autoplay    })  },  intervalChange: function(e) {    this.setData({      interval: e.detail.value    })  },  durationChange: function(e) {    this.setData({      duration: e.detail.value    })  }})

 

 好的,上面就是微信官方文档的演示代码,如果你跟着演示代码走了一遍碰到疑问的话,看看这里我挖的土是不是能填好你的坑:

 

3.1.1 行内样式无效

 返回目录

demo.wxml 中出现的 <image src="{{item}}" class="slide-image"/>

 虽然,它的属性名和属性值是这么说的。但是,用的时候,首先你需要在 demo.wxml 中的 swiper 绑定这个属性名,然后在 demo.js 中设置其属性值。值得注意的是,它的绑定值,稍微不同于 Vue, 需要设置 {{}} 形式。如果文字描述你看得不是很清楚,可以参照下面的代码进行理解。

 

3.1.4 轮播图图片跳转

 返回目录

 关于轮播图的地址跳转,在微信小程序的官网是没用提及的,也是 jsliang 去百度查看了下,才知道怎么设置(可能是我一开始就挑战的难度太高了么 -_-|| ),在下面 jsliang 贴出来代码~想知道怎么解决的可以去看看:首先,在 data 中设置 link;然后,设置 navigator 导航遍历 item.link 。

 

3.1.5 wx:key

 返回目录

 关于 wx:key , wx:key 的作用是:当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,框架会确保他们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。但是,在其 swiper 中,小程序本身是没有写的,所以它会带有 warning ,这里也是个小坑, jsliang 也是百度了下也知道这件事:点我了解。

 

3.1.6 实战代码

 返回目录

 下面给出这 5 个坑的解决代码,如有不对,尽情指出:

index.wxml

<view class="carousel">  <swiper indicator-dots="{{indicatorDots}}" autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}" indicator-color="#707071" indicator-active-color="#fff" circular="true">    <!-- wx:key : 提高列表渲染效率 -->    <block wx:for="{{imgUrls}}" wx:key="{{item.index}}">      <swiper-item>        <navigator url="{{item.link}}" hover-class="navigator-hover">          <image src="{{item.url}}" class="slide-image" />        </navigator>      </swiper-item>    </block>  </swiper></view>

 

index.wxss

.carousel .slide-image {  width: 100%;  height: 420rpx;}

 

index.js

Page({  data: {    imgUrls: [      {        link: '../index/index',        url: 'http://img02.tooopen.com/images/20150928/tooopen_sy_143912755726.jpg',      },      {        link: '../demo/demo',        url: 'http://img06.tooopen.com/images/20160818/tooopen_sy_175866434296.jpg',      },      {        link: '../logs/logs',        url: 'http://img02.tooopen.com/images/20150928/tooopen_sy_143912755726.jpg'      }    ],    indicatorDots: true,    autoplay: true,    interval: 5000,    duration: 1000  }})

 

3.2 tabBar 与 switchTab

 返回目录

本组件目前已有 3 个坑,有兴趣的小伙伴可以详看。

 tabBar :底部菜单栏,需要在 app.json 中设置。使用方法:见下文。
 navigator :导航切换。使用方法:地址
 switchTab :控制 tabBar 的切换。使用方法:地址

 

3.2.1 底部导航跳转

 返回目录

 在这里,我们讲下 tabBar 的坑,如果你在 app.json 中设置了 tabBar :

app.json

"tabBar": {    "list": [{      "pagePath": "pages/index/index",      "text": "首页",      "iconPath": "./public/index_tabBar1_nor.png",      "selectedIconPath": "./public/index_tabBar1.png"    }, {      "pagePath": "pages/demo/demo",      "text": "发现",      "iconPath": "./public/index_tabBar2_nor.png",      "selectedIconPath": "./public/index_tabBar2.png"    }, {      "pagePath": "pages/logs/logs",      "text": "我的",      "iconPath": "./public/index_tabBar3_nor.png",      "selectedIconPath": "./public/index_tabBar3.png"    }]  }

 

 那么,我们就需要通过设置 switchTab 来控制底部导航的跳转,而不能通过 navigator 来跳转:

demo.wxml

<view>  <button bindtap="linkTo">Hello</button></view>

 

demo.js

linkTo: function () {  wx.switchTab({    url: '../index/index'  });},

 

3.2.2 自定义底部导航

 返回目录

 那么问题又来了,当我们切换到子页面的时候,我们发现 tabBar 这个底部导航栏不见了,然后问了下 Ansen江 ,他说之前是整个小程序都有的,有些页面还要想方设法去隐藏。
 但是现在嘛……它没了!没了啊!!!在微信小程序的文档没看到有唤起底部导航条的方法,难道我要做一个导航条了么 -_-||
 回答是:yes!
 所以,下面给出该底部导航条 tabBar 的实现情况和代码片段:

注:图片宽高均为 54rpx

*.wxml

<view class="nav">  <view class="nav-home" bindtap="goHome">    <image src="../../public/index_productDetail_icon_home.png"></image>    <text>首页</text>  </view>  <view class="nav-service">    <image src="../../public/index_productDetail_icon_service.png"></image>    <text>在线咨询</text>  </view>  <view class="nav-phone" bindtap="callWaiter">    <image src="../../public/index_productDetail_icon_phone.png"></image>    <text>电话咨询</text>  </view>  <navigator url="../indexPurchaseProduct/indexPurchaseProduct">    <view class="nav-buy">      <text>立即订购</text>    </view>  </navigator></view>

 

*.wxss

.nav {  display: flex;  justify-content: space-around;  font-size: 20rpx;  border: 1px solid #ccc;  position: fixed;  bottom: 0;  background: #fff;}.nav view {  display: flex;  flex-direction: column;  align-items: center;}.nav image {  width: 54rpx;  height: 54rpx;}.nav text {  margin-top: 7rpx;}.nav-home {  border-right: 1px solid #ccc;  width: 130rpx;  padding-top: 5rpx;}.nav-service {  border-right: 1px solid #ccc;  width: 130rpx;  padding-top: 5rpx;}.nav-phone {  width: 130rpx;  padding-top: 5rpx;}.nav-buy {  background: #eb333e;  color: #fff;  width: 360rpx;  height: 98rpx;  line-height: 80rpx;  font-size: 34rpx;}

 

*.js

callWaiter: function(res) {  wx.makePhoneCall({    phoneNumber: '13264862250',    success: function(res) {      console.log("拨打成功");      console.log(res);    },    fail: function(res) {      console.log("拨打失败");      console.log(res);    },    complete: function(res) {      console.log("拨打完成");      console.log(res);    }  })},goHome: function() {  wx.switchTab({    url: '../index/index'  })},

 

3.2.3 自定义组件

 返回目录

 在最近的工作中,又发现一个小问题:

 像这个导航条,它需要根据页面所在的模块,动态地展示不同位置的状态为活跃,而且它是需要在多个页面重复出现的,如果每个页面我都要复制粘贴一遍,到时候要修改起来的时候,麻烦不说,最重要的是,它可能影响我前端的性能了,能不能直接将其封装起来呢?

 自定义组件:链接

 是的,发现在小程序文档中是存在这个东西的。当然,至于过程中我百度了几篇文章来辅助写出下面的代码,你猜?

 子组件写法

navBar.wxml

<!-- 底部导航条 --><view class="navBar">  <view class="navBar-home" bindtap='goHome'>    <image wx:if="{{homeActive}}" src="../../public/index_tabBar1.png"></image>    <image wx:if="{{!homeActive}}" src="../../public/index_tabBar1_nor.png"></image>    <text>首页</text>  </view>  <view class="navBar-explore" bindtap='goExplore'>    <image wx:if="{{exploreActive}}" src="../../public/index_tabBar2.png"></image>    <image wx:if="{{!exploreActive}}" src="../../public/index_tabBar2_nor.png"></image>    <text>发现</text>  </view>  <view class="navBar-user" bindtap='goUser'>    <image wx:if="{{userActive}}" src="../../public/index_tabBar3.png"></image>    <image wx:if="{{!userActive}}" src="../../public/index_tabBar3_nor.png"></image>    <text>我的</text>  </view></view>

 

navBar.wxss

/* 底部导航条 */.navBar {  width: 100%;  padding: 18rpx 0;  border-top: 1rpx solid #cccccc;  display: flex;  justify-content: space-around;  position: fixed;  bottom: 0;  background: #fff;}.navBar image {  width: 55rpx;  height: 55rpx;}.navBar view {  display: flex;  flex-direction: column;  align-items: center;  font-size: 20rpx;  color: #999999;}.navBar-user text {  color: #d0a763;}

 

navBar.js

// pages/componentNavBar/navBar.jsComponent({  /**   * 组件的属性列表   */  properties: {    homeActive: {      type: Boolean,      value: false    },    exploreActive: {      type: Boolean,      value: false    },    userActive: {      type: Boolean,      value: false    }  },  /**   * 组件的初始数据   */  data: {  },  /**   * 组件的方法列表   */  methods: {    // 返回首页    goHome: function (e) {      wx.switchTab({        url: '../index/index',      })    },    // 返回发现页     goExplore: function (e) {      wx.switchTab({        url: '../explore/explore',      })    },    // 返回我的页面    goUser: function (e) {      wx.switchTab({        url: '../user/user',      })    },    showCode: function(e) {      console.log(e);      let that = this;      console.log(that.data);    }  }})

 

navBar.json

{  "component": true,  "usingComponents": {}}

 

 然后,在父组件的使用,只需要:

*.wxml

<view>  <navBar userActive="{{userActive}}"></navBar></view>

 

*.json

{  "usingComponents": {    "navBar": "../componentNavBar/navBar"  }}

 

*.js

data: {  userActive: true},

 

 怎样?这就是自定义组件的写法,是不是觉得特好用涅,一次写完,终身受用。

 

3.3 px、rem 与 rpx

 返回目录

本节目前已有1个坑,有兴趣的小伙伴可以详看。

 在微信中,它自带了一套属于自己的单位:rpx , rpx 不同于之前我们认识的 px 、 rem 、 em ,如果你的设计稿是 750 px 的,那么很容易的, 1px = 1rpx ,但是,如果设计稿不是 750 px ,那么将造成一个 bug ,至于这个 bug 如何解决……
 -_-|| 谁知道呢……要不先把UI设计师宰了?
 知识补充:关于 rpx 。

 

3.4 微信 web 开发者工具

 返回目录

本节目前已有 2 个坑,有兴趣的小伙伴可以详看。

 

3.4.1 无法输入中文

 返回目录

 如果你在开发过程中,发现只能写英文了,而中文无法输入了,千万别急,也别怪输入法出 bug 了,你只需要:重启开发工具。

 

3.4.2 无法滑动滚轮

 返回目录

 如果你某时刻,突然发现你没法滚动代码进行查看,而是需要拖动滚动条才行,请别怪你的鼠标,你可以去浏览器打开一篇文章看看,enm...你的鼠标还是好的~所以,请:重启开发工具。

 

3.5 组件与 API

 返回目录

本节目前已有 2 个坑,有兴趣的小伙伴可以详看。

3.5.1 概念混淆:组件 VS API

 返回目录

 首先,科普下 组件 与 API 是什么:

  • 组件:对数据和方法的封装,使用组件可以实现拖放式编程、快速的属性处理以及真正的面向对象的设计【百度百科】。那么,可以理解为:开发中常用的一些部件,我们都可以封装起来,然后在需要的时候拿来用,即为组件。
  • API:预先定义的函数,提供应用程序与开发人员无需访问源码,基于某软件或硬件得以访问一组例程的能力【百度百科】。就是说已经写好的一些 Function 或者后端接口,前端直接调用就行了。

 但是,在微信小程序官方文档中,组件与API,拆分地有点不科学。
 例如:轮播图底部导航条

  • 一个在组件中,一个在 API 中;
  • 一个在 wxml 、 wxss 、 js 中要设置对应的参数,一个只需要在 app.json 中设置就行。

 可能微信小程序考虑到底部导航条不应该有太大的变化(例如让你修改太多样式或者 js ),所以将导航条内嵌至源码中了。
 但是,这可能导致什么重要影响吗?是的,如果底部导航条需要进行修改呢?例如:3.2.3 自定义组件。这样的情况下,我们的开发时间就有所增加了。

 

3.5.2 API 查询不到对应的方法

 返回目录

 如果小伙伴你经常有去看微信小程序官方文档的话,那么你一定会有一件事需要吐槽,那就是:
 明明上次我见到过某个 API 实现了我需要做的功能,但是改天我回去查找的时候,它却提示我没有这个玩意,这是什么鬼?!
 是的,跟我们 3.13 黑科技:<modal> 这一章中讲到的 <modal> 这个黑科技一样,有时候官方文档也不是万能的,它总会有这样那样的毛病,导致我们找不到需要的东西,只能去百度了 -_-||

 

3.6 flex 布局

 返回目录

本节目前已有 3 个坑,有兴趣的小伙伴可以详看。

 Flex布局又称弹性布局,在小程序开发中比较适用。但是由于 jsliang 之前没怎么用过 Flex 布局,所以在这里咱们特意去踩下坑,充实下自己。【小程序开发之页面布局】【阮一峰-Flex 布局教程】
 在我们布局页面的时候,最好看看 阮一峰 的教程,平时遇到布局的问题的时候,我都习惯去上面 阮一峰 的文章看看:

 

3.6.1 基础概念

 返回目录

 基础概念:地址

  <!-- 设置 flex 布局 -->  display: flex;  <!--     1、决定主轴的方向    row - (默认)水平方向,起点在左端    row-reverse - 水平方向,起点在右端    column - 垂直方向,起点在上沿    column-reverse - 垂直方向,起点在下沿   -->  flex-direction: row | row-reverse | column | column-reverse;    <!--     2、一条轴线(一行)排不下时如何解决    nowrap - (默认)不换行    warp - 换行,第一行在上方    wrap-reverse - 换行,第一行在下方   -->  flex-wrap: nowrap | wrap | wrap-reverse;    <!--     3、flex-flow = flex-direction + flex-wrap。即 flex-flow 是这两个属性的合集    row nowrap - (默认)水平方向,起点在左端,不换行   -->  flex-flow: <flex-direction> || <flex-wrap>;    <!--     4、justify-content 定义项目在主轴上的对齐方式    flex-start - 左边对齐    flex-end - 右边对齐    center - 居中对齐    space-between - 两端对齐,空格在中间    space-around - 空格环绕   -->  justify-content: flex-start | flex-end | center | space-between | space-around;    <!--     5、align-items 定义项目在交叉轴上如何对齐    flex-start - 顶部对齐,即文字图片等顶部同一条线上    flex-end - 底部对其,即文字图片等底部在同一条线上    center - 中间对其,即文字图片不管多高,都拿它们的中间放在同一条线上    stretch - 将文字图片充满整个容器的高度,强制统一    baseline - 将每项的第一行文字做统一在一条线上对齐   -->  align-items: flex-start | flex-end | center | stretch | baseline;    <!--     6、align-content 定义多根轴线的对齐方式。如果只有一根轴线(只有一行),该属性不起作用    flex-start - 这几行顶部对齐    flex-end - 这几行底部对齐    center - 这几行居中对齐    stretch - 这几行进行扩展或者缩放,从而填满容器高    space-between - 这几行中间使用空格进行填充    space-around - 这几行两边及中间进行填充   -->  align-content: flex-start | flex-end | center | space-between | space-around | stretch;

 

3.6.2 左右布局

 返回目录

 实现效果如下:

 如图,这是我们要实现的左右布局效果。那么,在微信小程序要怎么做呢?

*.wxml

<view class="top-recommended-headlines">  <view class="top-recommended-headlines-left">    <text>热门推荐</text>  </view>  <view>    <image src="../../public/index_top_recommended_headlines.png"></image>  </view>  <view class="top-recommended-headlines-right">    <navigator url="../indexProduct/indexProduct">查看全部 ></navigator>  </view></view>

 

*.wxss

.top-recommended-headlines {  display: flex;  align-items: flex-end;  height: 31rpx;  line-height: 31rpx;  margin-bottom: 10rpx;}.top-recommended-headlines-left text {  font-size: 32rpx;  font-weight: bold;}.top-recommended-headlines image {  width: 366rpx;  height: 31rpx;  margin-left: 10rpx;}.top-recommended-headlines-right navigator {  font-size: 26rpx;  color: #a9a9a9;  margin-left: 50rpx;}

 

3.6.3 混合布局

 返回目录

 实现效果如下:

 如图,这是我们要实现的左右布局效果。那么,在微信小程序要怎么做呢?

*.wxml

<view class="weui-tab__content-item3" wx:for="{{tabs3Content}}" wx:key="{{item.index}}">  <navigator url="../indexProductArticle/indexProductArticle">    <view class="weui-tab__content-item3-question">      <image src="../../public/index_productDetail_icon_question.png"></image>      <text>{{item.title}}</text>    </view>    <view class="weui-tab__content-item3-answer">      <image src="../../public/index_productDetail_icon_answer.png"></image>      <text>{{item.content}}</text>    </view>    <view class="weui-tab__content-item3-detail">      <text class="weui-tab__content-item3-detail-datatime">{{item.datatime}}</text>      <text class="weui-tab__content-item3-detail-reader">{{item.reader}}阅读</text>      <text class="weui-tab__content-item3-detail-label">#{{item.label}}#</text>    </view>  </navigator>  <view class="weui-tab__content-item3-gap">    <image src="../../public/index_productDetail_gap.png"></image>  </view></view>

 

*.wxss

.weui-tab__content-item3 {  padding-left: 30rpx;  padding-right: 30rpx;  margin-top: -10rpx;  margin-bottom: 10rpx;}.weui-tab__content-item3:first-child {  padding: 40rpx 30rpx 0;}.weui-tab__content-item3-question image {  width: 30rpx;  height: 30rpx;}.weui-tab__content-item3-question text {  font-size: 30rpx;  line-height: 46rpx;  font-weight: bold;  color: #333;  margin-left: 10rpx;}.weui-tab__content-item3-answer image {  width: 30rpx;  height: 30rpx;}.weui-tab__content-item3-answer text {  font-size: 26rpx;  line-height: 42rpx;  color: #a9a9a9;  margin-left: 10rpx;}.weui-tab__content-item3-detail {  display: flex;  justify-content: space-between;  font-size: 26rpx;  color: #a9a9a9;}.weui-tab__content-item3-detail-label {  color: #d0a763;}.weui-tab__content-item3-gap image {  width: 100%;  height: 30rpx;}

 

*.js

tabs3Content: [  {    title: '员工发明创造是否属于职务发明的认证标准?',    content: '随着企业对知识产权在企业发展中核心竞争力的认识力提高,企业保护自身知识产权的意识不断增强,使其技术得......',    datatime: '2018-03-05',    reader: '2081',    label: '知识产权'  }]

 

3.7 background-image 套用本地图片无效

 返回目录

本节目前已有 1 个坑,有兴趣的小伙伴可以详看。

 在小程序中,如果你使用 wxss,你是可以发现有 background-image 的提示的。但是,如果你设置它的背景图是本地图片,你会发现,它是不生效的。
 解决方案:

  1. 在使用背景图片的时候用网络图片,就是用外链的形式,比如你将这张图片放到你的服务器,如:https://xxxx/xxx.jpg
  2. 将背景图片使用编码base64进行转换,可以在这个网址进行 点我前往 转换,如:background-image: url("转换后得到的编码文本"),如果多次使用的话可以将该值设置为全局变量,再在js文件进行引用即可。
  3. 使用 image 组件 + position 定位而不是使用 background-image 。

 

3.8 <block> 与 <view>

 返回目录

本节目前已有 1 个坑,有兴趣的小伙伴可以详看。

 两者的区别是,<view> 是一个组件,会在页面上做渲染;<block> 不是一个组件,它仅仅是一个包装元素,只接受控制属性,不会在页面中做任何渲染。
 所以,如果你仅仅是需要包裹,而不是渲染一个层,可以使用 <block> 提升性能。

 

3.9 搜索框

 返回目录

本节目前已有 2 个坑,有兴趣的小伙伴可以详看。

 

3.9.1 margin-top 无法上浮

 返回目录

 首先,我们要实现的效果是:

 然后, jsliang 的想法是:

*.wxml

<view class="search">  <input class="search-product-input" bindinput="bindKeyInput" auto-focus maxlength='10'></input>  <label class="search-placeholder">    <image class="search-placeholder-icon" src="../../public/index_indexProduct_icon_search.png"></image>    <text class="search-placeholder-text">搜索产品</text>  </label>  <view></view></view>

 

*.wxss

.search {  height: 100rpx;  display: flex;  flex-direction: column;  justify-content: space-between;  align-items: center;  position: relative;}.search-product-input {  background: #f5f5f5;  width: 650rpx;  height: 65rpx;  border-radius: 30rpx;  font-size: 30rpx;  padding-left: 20rpx;}.search-placeholder {  font-size: 26rpx;  text-align: center;  margin-top: -65rpx;  z-index: 2;}.search-placeholder-icon {  width: 24rpx;  height: 24rpx;}.search-placeholder-text {  margin-left: 10rpx;}

 

 你注意到了吗?在 *.wxml 中, jsliang 设置了个空的 <view> ,如果你把这个 <view> 去掉,你会惊奇地发现,它……下来了……

 好吧,可能有其他的实现方式,但是如果你下次使用这种方式,注意上面这个坑~

 

3.9.2 改造 WeUI 搜索框

 返回目录

 回头看了下 WeUI 的实现方式,发现跟我的思路是挺像的,关于 input 的实现方式,现在依据 WeUI ,成功实现了输入框:

 源码奉上:

*.wxml

<!-- 搜索框 --><view class="search">  <view class="weui-search-bar">    <view class="weui-search-bar__form {{inputShowed ? 'form-border' : ''}}">      <view class="weui-search-bar__box">        <icon class="weui-icon-search_in-box" type="search" size="14"></icon>        <input type="text" class="weui-search-bar__input" placeholder="搜索" value="{{inputVal}}" focus="{{inputShowed}}" bindinput="inputTyping" />        <view class="weui-icon-clear" wx:if="{{inputVal.length > 0}}" bindtap="clearInput">          <icon type="clear" size="14"></icon>        </view>      </view>      <label class="weui-search-bar__label" hidden="{{inputShowed}}" bindtap="showInput">        <icon class="weui-icon-search" type="search" size="14"></icon>        <view class="weui-search-bar__text">搜索</view>      </label>    </view>    <view wx:if="{{inputVal.length <= 0}}" class="weui-search-bar__cancel-btn" hidden="{{!inputShowed}}" bindtap="hideInput">取消</view>    <view wx:if="{{inputVal.length > 0}}" class="weui-search-bar__submit-btn" hidden="{{!inputShowed}}" bindtap="searchInput">搜索</view>  </view></view>

 

*.js

Page({  data: {    inputShowed: false,    inputVal: ""  },  showInput: function () {    this.setData({      inputShowed: true    });  },  hideInput: function () {    this.setData({      inputVal: "",      inputShowed: false    });  },  clearInput: function () {    this.setData({      inputVal: ""    });  },  inputTyping: function (e) {    this.setData({      inputVal: e.detail.value    });  }})

 

*.wxss

.search {  height: 100rpx;  padding: 18rpx 30rpx;}.weui-search-bar {  padding: 0;  background-color: #fff;  border-top: none;  border-bottom: none;  height: 64rpx;}.weui-search-bar__form {  border: none;}.form-border {  border: 1rpx solid #f5f5f5;  background: #f5f5f5;}.weui-search-bar__label {  background: #f5f5f5;  border-radius: 30rpx;}.weui-search-bar__cancel-btn { font-size: 26rpx;  background: rgb(8, 202, 186); color: #fff; padding: 2rpx 20rpx 0 20rpx; border-radius: 10rpx;}.weui-search-bar__submit-btn {  font-size: 26rpx;   background: rgb(8, 200, 248);  color: #fff;  padding: 10rpx 20rpx 0 20rpx;  border-radius: 10rpx;}

 

3.10 微信小程序分享

 返回目录

本节目前已有 1 个坑,有兴趣的小伙伴可以详看。

 官方文档:地址
 在这里,提醒广大小伙伴注意了,注意了,注意了!重要的事说三遍。
 当你新建 page 的时候,微信 web 开发者工具会自动帮你添加分享事件:

/**  * 用户点击右上角分享  */onShareAppMessage: function (res) {}

 

 所以,如果你在前面定义了,它会在最下面偷偷帮你清空,然后你就觉得无法自定义分享事件……
 是的,jsliang 打死都不承认这是我自己的锅,新手注意!新手注意!!新手注意!!!

 

3.11 border-box 设置

 返回目录

本节目前已有 1 个坑,有兴趣的小伙伴可以详看。

 熟知盒模型的小伙伴应该知道,盒模型有两种计算方式:

  1. box-sizing: border-box;
  2. box-sizing: content-box;

 在 border-box 中,整个 view 的宽、高,包括 marginpaddingborder
 而在 content-box 中,整个 view 的宽、高,则不包括上面元素。

 如上图,如果一个 view ,你的代码如下:

view {  box-sizing: border-box;  margin: 10rpx;  width: 100rpx;  height: 100rpx;  padding: 10rpx;}

 

 那么,你的整个宽高还是 100rpx
 但是,如果你的代码如下:

view {  box-sizing: content-box;  margin: 10rpx;  width: 100rpx;  height: 100rpx;  padding: 10rpx;}

 

 那么,你的整个盒子宽高是 120rpx

 如果你在设计页面中,发现内容区被撑爆了,那么,请检查下现在的 border-box 是什么。

 

3.12 自定义选项卡

 返回目录

本节目前已有 6 个坑,有兴趣的小伙伴可以详看。

 

3.12.1 WeUI 选项卡

 返回目录

 使用 WeUI 的导航条,首先需要引用 WeUI 的 CSS 样式:地址

 下载 weui.wxss 并在 app.wxss 中引用即可

app.wxss

/* 引用WeUI */@import 'weui.wxss';

 

 然后,我们直接往页面加入它的选项卡并根据项目需求修改其样式:

 

*.wxml

<view class="tab">  <view class="weui-tab">    <view class="weui-navbar">      <block wx:for="{{tabs}}" wx:key="*this">        <view id="{{index}}" class="weui-navbar__item {{activeIndex == index ? 'weui-bar__item_on' : ''}}" bindtap="tabClick">          <view class="weui-navbar__title">{{item}}</view>        </view>      </block>      <view class="weui-navbar__slider" style="left: {{sliderLeft}}px; transform: translateX({{sliderOffset}}px); -webkit-transform: translateX({{sliderOffset}}px);"></view>    </view>    <view class="weui-tab__panel">      <!-- 全部 -->      <view class="weui-tab__content" hidden="{{activeIndex != 0}}">        <view class="weui-tab__content-item1">          <text>全部</text>        </view>      </view>      <!-- 已付款 -->      <view class="weui-tab__content" hidden="{{activeIndex != 1}}">        <view class="weui-tab__content-item2">          <text>已付款</text>        </view>      </view>      <!-- 待付款 -->      <view class="weui-tab__content" hidden="{{activeIndex != 2}}">        <view class="weui-tab__content-item3">          <text>待付款</text>        </view>      </view>    </view>  </view></view>

 

*.wxss

.tab {  font-size: 26rpx;}.tab image {  width: 173rpx;  height: 29rpx;}.weui-navbar {  border-top: 1rpx solid #efefef;  border-bottom: 1rpx solid #efefef;}.weui-navbar__slider {  background: #d0a763;  width: 4em;}.weui-navbar__item.weui-bar__item_on {  color: #d0a763;}.weui-tab__content {  margin-bottom: 100rpx;}

 

*.js

var sliderWidth = 52; // 需要设置slider的宽度,用于计算中间位置Page({  /**   * 页面的初始数据   */  data: {    // 选项卡导航    tabs: ["全部", "已付款", "待付款"],    activeIndex: 1,    sliderOffset: 0,    sliderLeft: 0,  },  // 选项卡切换  tabClick: function (e) {    this.setData({      sliderOffset: e.currentTarget.offsetLeft,      activeIndex: e.currentTarget.id    });  },  /**   * 生命周期函数--监听页面加载   */  onLoad: function (options) {    // 计算搜索框活跃条    var that = this;    wx.getSystemInfo({      success: function (res) {        that.setData({          sliderLeft: (res.windowWidth / that.data.tabs.length - sliderWidth) / 2,          sliderOffset: res.windowWidth / that.data.tabs.length * that.data.activeIndex        });      }    });  }})

 

3.12.2 自定义选项卡效果与实现

 返回目录

 自定义选项卡的代码实现:

 实现效果图如下:

 实现代码如下:

*.wxml

<view>  <view class="weui-tab__nav">    <text wx:for="{{tabs2Nav}}" wx:key="item.index" class="{{item.state == 1 ? 'weui-tab__nav-active' : ''}}" bindtap="tabs2NavClick" data-labelId="{{item.id}}">{{item.label}}</text>  </view>  <view class="weui-tab__content-item2" wx:for="{{tabs2Content}}" wx:key="{{item.index}}">    <view class="weui-tab__content-item-descritpion">      <view class="{{item.type == 1 ? 'weui-tab__content-item-icon-type' : 'hide'}}">        <image src="../../public

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎