微信小程序开发常用知识点

收集了一些小程序开发中常用到的知识点,记录一下。(小程序开发文档版本不断在更新,可能有些以后用不了的,这些发现了再更新,也请各位道友指正)


1.导航栏标题

与iOS开发很相似,小程序的导航栏也可以全局设置一下,在公共文件app.json中设置了导航栏相关样式如下:

  "window": {
    "navigationBarTextStyle": "black",
    "navigationBarTitleText": "小程序组件",
    "navigationBarBackgroundColor": "#f8f8f8",
    "backgroundColor": "#f8f8f8",
    "backgroundTextStyle": "light",
    "enablePullDownRefresh": "true"
  },

这个地方是全局设置,如果想要在不同的页面设置各自的标题属性,只需要在该子级文件中设置

{
"navigationBarTitleText": "页面1"
}

2.子页面调用公共js对象以便调用其方法

子页面想调用共公js的方法,需先在子页面js中先实例化app:具体过程如下

//app.js 中写子页面需要调用的公共方法
  App({
  // 自定义公共方法
  commonFunction:function(){
      return "公共方法"
    }
   })

在需要调用的子页面中,

var app = getApp();//先实例化应用
// console.log(app)//可查看公共app.js里面的方法
Page({
  data: {
  "label":app.commonFunction()//子页面中调用公共appjs的方法
  }
})

3.嵌套循环时候,最好重命名下list和index

如果是嵌套循环,很容易出现多个list和index,例如表视图一样,所以在小程序中可以重命名 list 和index 方法为:wx:for-index='重命名' wx:for-list="重命名"

<view>
重命名list和index:
<text class='{{classname}}' wx:for="{{array}}" wx:for-index="key" wx:for-item="value"> {{key}}--{{value}}    </text>
</view>

4.善用公共模板

在APP开发中,UI复用是一个很好的手段,在小程序上就是模板template。
在逛小程序联盟的时候发现了一个大湿总结的比我好,搬过来一下。


微信小程序中,如果几个页面中需要引用同一个header/footer,当定义了公共模板时,有两种引用方法如下:
方法一:在公共模板中定义template元素,利用 方法 ,这种方式只会显示公共模板的template里面的内容,之外的内容不会显示

//在wxml中
<import src='公共模板地址'/>
<template is='模板里面template定义的name名称' data='{{引入的数据1,引入数据2}}'></template>

注意:这里的data='{{引入的数据1,引入数据2}}' 是在template中要提取js文件中的data数据里面的key名字,否则无法显示。
公共模板的wxml:在公共模板中必须定义每一个template的的name的名字,否则引用的时候无法得知引用具体某一个;

<template name='header'><!--必须有有name不然import方式无法判断到底要引用哪一个tempalte-->
{{title.header}}<!--这个数据只是提取要引用的文件的里面js里面定义的对应的数据,如果在其他文件中定义不在要引用的文件中无效-->
</template>

要引用的文件js定义数据:

data: {
title:{header:'这是template的header部分',footer:'这是template的footer部分',other:'这是tempalt外部部分'}
}

** 方法二:**

<include src="公共模板地址"/>这种方式是引入了模板中除了tempalte以外的所有内容。
<include src="../../template/footer.wxml"/> 
公共模板的wxml:

{{title.other}}
js定义的数据:

 title:{header:'news里面的的header',footer:'这是template的footer部分'}

总结:import方式和imclude方式的不同在于前者仅引用公共模板中的template里面的内容后者仅引用template以外的内容,显而易见,include方式更简单一些,在wxml中只需要一句话即可。

5.小程序的尺寸单位rpx

rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px。
具体的这里有一片文章介绍的很详细还有这个

6.小程序中用html、css

  • 小程序中的选择器跟css的一样.

    1:.class
    2: #id
    3: element
    4:分组 element,element
    5:伪类选择器 :after :before 注意这里加入在了元素之内的最后/最前
    
  • 引入外部css文件的时候,只需像iOS中导入文件那样,在其css文件的开始写上 : @import "外部地址" 即可。

  • html中布局用div很多,但是在小程序中用view标签,文本用text。

  • 如果想用html原有的元素,必须在wxss中定义元素的display:block不然无法应用,且html元素的id选择器是无法应用的。

7.事件总结/冒泡事件

小程序的事件主要有:

 touchtab 点击事件
 touchstart 开始滑动
 touchmove 滑动中
 touchend 滑动结束
 touchcancel 滑动中断

小程序中的wxml中绑定事件有两种:以touchtab为例 ,在wxml中必须有bind/catch不然无法实现上述事件
bindtouchtab和catchtouchtab bind的不会阻止事件冒泡(元素最里层到最外层函数执行),catch会阻止冒泡,只是冒泡到当前层结束

如果想在元素执行某事件时把元素的某个属性传到后台 可在元素中加入data-属性名称=“xxx”,在事件函数中 function(event){}的event中的currentTarget里面的data-set里面可查看接收在元素中绑定的的id或者其他属性clientX/Y 查看滑动手指距离屏幕左侧的位置,查看滑动位置也可以通过touchstart和和touchend的clientx/y获取


看到几个别人写的,瞬间石化,果断收藏。

8.点击更换图片

data: {
    "banner":"../../../images/banner.jpg",
    "daimaisrc":"../../../images/cart2_xz02.png",
    "bianjie":"../../../images/cart2_xz04.png",
    "shihui":"../../../images/cart2_xz05.png",
    cityName:"",
    getChannelByCityId:"",
    carName:"",
    carId:""
  },
  // 点击选择代买平台
  daimaiClick: function(e){
    console.log("-------d:"+this.data.daimaisrc);
    if(this.data.daimaisrc=="../../../images/cart2_xz02.png"){
      this.setData({
        daimaisrc: "../../../images/cart2_xz01.png"
      })
    }else{
      this.setData({
        daimaisrc: "../../../images/cart2_xz02.png"
      })
    }
  },

9.锚点定位


<!--index.wxml-->
<view class="container">
<!--品牌-->
<scroll-view scroll-y="true" scroll-into-view="{{toView}}"> 
  <view wx:for="{{citysMap}}">
    <view class="ncq-smal" id="{{index}}">
      {{index}}
    </view>
    <view wx:for="{{item}}" wx:for-item="citys" class="ncq-box" 
         data-cityname="{{citys.city_name}}" bindtap="cityNameClick">
            <label class="ncq-brand-name">{{citys.city_name}}</label>
    </view>
  </view>
</scroll-view>
 <!--  字母导航-->
    <view class="ncq-fixe-nav">
            <view  wx:for="{{citysMap}}" data-letter="{{index}}" bindtap="rightZmClick">
                <label>{{index}}</label> 
            </view>
    </view>
   <!-- 字母导航end-->
</view>
 //字母锚链定位
  topZmClick: function (event) {
    var letter = event.currentTarget.dataset.letter;
    this.setData({
      toView: letter
    })
  },
scroll-view {
  height: 600px;
}
注:scroll-view必须要设置高度,不然无效

10.调用工具js文件/utils文件中的函数/变量

在小程序中,定义了一项工具文件utils,此文件的js旨在本文件之内有效,当其他子页面想调用其中的js方法或者变量时,需要两步骤:
1:在utils被调用的js文件中,面向对象的方式模型输出: module.exports={要调用的函数名称:要调用的函数名称 };
2:在要调用的js文件中模块化引入utils的js文件 var object=require("utils被调用的js文件地址"); 可以输出一下object就能看到被调用的方法了;
例子如下:

utils中被调用的js:

var URl='http://123.23.169';
 var getImageurl=function(imageurl){
return URl+imageurl;
 }
//  要引用这个文件的函数或者变量,除了在要引用的的js文件中模块化之外(var utils=require('js地址')),
// 在被引用的的js中要通过 module.exports={a:a}作为面向对象的变量输出函数如下:
 module.exports={
     URl:URl,//要引用的函数 xx:xx
     getImageurl:getImageurl
 }

要调用的js文件:

// 获得工具utils工具js里面函数,先模块化引用utils里面的js地址  reqiure('js地址')成一个面向对象
var utils=require('../../utils/app.js')
// console.log(utils) 可查看获得的函数
console.log(utils.getImageurl('iamgeaaddress.png'))

11.后台交互/wx.request({})方法/渲染页面方法 解析

小程序的后台获取数据方式get/post具体函数格式如下:wx.request({})

data: {
    logs:[]
  },
onLoad:function(){
this.getdata();
}
getdata:function(){//定义函数名称
var that=this;   // 这个地方非常重要,重置data{}里数据时候setData方法的this应为以及函数的this, 如果在下方的sucess直接写this就变成了wx.request()的this了
    wx.request({
      url:'http://www.phonegap100.com/appapi.php?a=getPortalCate',//请求地址
      data:{//发送给后台的数据
        name:"bella",
        age:20
      },
      header:{//请求头
        "Content-Type":"applciation/json"
      },
      method:"GET",//get为默认方法/POST
      success:function(res){
        console.log(res.data);//res.data相当于ajax里面的data,为后台返回的数据
      that.setData({//如果在sucess直接写this就变成了wx.request()的this了.必须为getdata函数的this,不然无法重置调用函数
      logs:res.data.result
          })
      },
      fail:function(err){},//请求失败
      complete:function(){}//请求完成后执行的函数
    })
  },

wxml页面:

<view  wx:for="{{logs}}" wx:for-item="value">
  {{value.catname}}
</view>

12.scroll-view用法

如果屏幕中某元素的内容超过此元素的高度,可设置元素为scroll-view 为滚动状态元素,这样可以做到元素固定高度且元素内容滚动屏幕不滚动的效果;

scroll-view标签的主要属性分为以下几种:

scroll-x/y='true/false'----允许横向/纵向滚动 
scroll-top/left='50'--设置滚动条出现的位置 
bindscroll='' 滚动中触发的函数 event.detail = {scrollLeft, scrollTop, scrollHeight, scrollWidth, deltaX, deltaY} 
bindscrolltoupper='scrolltoupper' 滚动到顶部/左边出发的函数scrolltoupper 
bindscrolltolower='scrolltolower' 滚动到底部/右边出发的函数scrolltolower 
upper-threshold='50' 距离顶部/左边多远时触发scrolltoupper函数 
lower-threshold='50' 距离底部/右边多远时触发scrolltolower 函数 
scroll-into-view=‘id名字.这个是用来设置此元素的某个子元素出现在最上方,id的名字为此子元素的id

13.广告轮播

微信小程序广告轮播元素 图片所在元素/swiper-item>
其中属性有:

   autoplay:true,//是否自动播放
   autoplaytxt:"停止自动播放",
   indicatorDots: true,//指示点
   // indicator-color:"white",//指示点颜色 暂未启动
   // indicator-active-color:"red",//当前选中的指示点颜色暂未启动
   indicatorDotstxt:"隐藏指示灯",
   interval: 1000,//图片切换间隔时间
   duration: 500,//每个图片滑动速度,
   circular:true,//是否采用衔接滑动
   current:3,//初始化时第一个显示的图片 下标值(从0)index

图片更改事件:bindchange='imgchange' imagechange()的e.detail.current为当前显示页面的下标值

wxml:

<swiper bindchange="imgchange" indicatorDots='{{indicatorDots}}' current='{{current}}' autoplay='{{autoplay}}' interval='{{interval}}'duration='{{duration}}' circular='{{circular}}'>
    <block wx:for='{{imgUrls}}'>
    <swiper-item>
        <image style="" mode="" src="{{item}}" binderror="" bindload="" class='swiper-img'></image>
    </swiper-item>
    </block>
</swiper>
<button  bindtap="autoplaychange" >{{autoplaytxt}}</button>

wxjs:

Page({
  data: {
    imgUrls: [
      '../../img/3.jpg',//图片src
      '../../img/6.jpg',
      '../../img/5.jpg',
      '../../img/4.jpg'
    ],
    autoplay:true,//是否自动播放
    autoplaytxt:"停止自动播放",
    indicatorDots: true,//指示点
    // indicator-color:"white",//指示点颜色 暂未启动
    // indicator-active-color:"red",//当前选中的指示点颜色暂未启动
    indicatorDotstxt:"隐藏指示灯",
    interval: 1000,//图片切换间隔时间
    duration: 500,//每个图片滑动速度,
    circular:true,//是否采用衔接滑动
    current:3,//初始化时第一个显示的图片 下标值(从0)index
  },
  autoplaychange:function(event){//停止、播放按钮
    if (this.data.autoplaytxt=="停止自动播放") {
      this.setData({
        autoplaytxt:"开始自动播放",
        autoplay:!this.data.autoplay
      })
    }else{
       this.setData({
        autoplaytxt:"停止自动播放",
        autoplay:!this.data.autoplay
      })
    };
  },
  imgchange:function(e){//监听图片改变函数
console.log(e.detail.current)//获取当前显示图片的下标值
  }
})

wxss:  

.swiper-img{
    width: 100%;
    height: 500rpx;
}

14.提示框

<!-- 提示view -->
  <loading hidden="{{loadingHidden}}">提交中...</loading>
  <modal bindconfirm="onTipsConfirm" hidden="{{hiddenTips}}" no-cancel>{{tipsContent}}</modal>
  <toast hidden="{{hideCommitSuccessToast}}">提交成功</toast>
// 提示框参数
    hiddenTips: true,
    tipsContent: '',
    loadingHidden: true,
    hiddenCommitTips: true,
    hideCommitSuccessToast: true,
  // 提示框
  onTipsConfirm: function (e) {
    this.setData({
      hiddenTips: true,
      tipsContent: ''
    })
  },
if (!name) {
        this.setData({
          hiddenTips: false,
          tipsContent: '请填写您的姓名'
        })
        return;
      }
第二种方式:
// 提交成功
              this.setData({
                loadingHidden: true,
                hideCommitSuccessToast: false
              })
              // 定时,3秒消化
              setTimeout(() => {
                this.setData({
                  hideCommitSuccessToast: true
                })
              }, 3000)

15.数据缓存

onLoad: function () {
    var that = this
    var brands = wx.getStorageSync('brands');// 从微信缓存中获取数据
    if(brands){
      //  console.log("从微信缓存中获取品牌数据");
       that.setData({
            brandsMap: brands
       })
    }else{
      //  console.log("从接口获取品牌数据");
       //获取接口品牌数据
        wx.request({
          url: userCarUtil.host + userCarUtil.getBrand_second,
          success: function (res) {
            wx.setStorageSync('brands',res.data);// 将数据放入微信缓存
            that.setData({
              brandsMap: res.data
            })
          }
        })
    }
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,248评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,681评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,443评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,475评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,458评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,185评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,451评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,112评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,609评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,083评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,163评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,803评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,357评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,357评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,590评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,636评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,925评论 2 344

推荐阅读更多精彩内容