微信小程序

非教程,个人整理使用,欢迎提出建议 :D

文件格式

视图层 [ .wxml ]、[ .wxss ]、[ .wxs ]、逻辑层[ .js ]、配置[ .json ]
  wxml类似一个嵌套组件,开头并没有声明之类的东西,直接上了<view></view>功能类似于<div></div>。
  wxss目前没发现和css有太大区别的地方,可以用@import引入另外一个表(一般引公共表),也可以直接在wxml里写内联样式<view style="height={{mainHeight}}rpx"></view>。
  wxs是小程序的脚本语言,有自己语法,和js类似但并不一致,两者运行互不相关,也不能调用API,据官方说IOS下比js运行快2-20倍,通过<wxs></wxs>内嵌或者建立 .wxs 文件。注意每个wxs都是单独模块,变量和函数私有,给外边就用module.exports
  小程序的 js 里目前可知的是不能操作DOM的,但是同时也给定了一大批API,十分方便好用,js总是有很多好玩的,这里先贴一块文档介绍。

  • 增加 App 和 Page 方法,进行程序和页面的注册。
  • 增加 getApp 和 getCurrentPages 方法,分别用来获取 App 实例和当前页面栈。
  • 提供丰富的 API,如微信用户数据,扫一扫,支付等微信特有能力。
  • 每个页面有独立的作用域,并提供模块化能力。文档入口

  json是一个定义配置的json数据文件,有全局配置app.json、工具配置project.config.json,还有单个子页面的配置page.json。小程序的json里配置项有现成名字,像全局的 pages、window、tabBar、networkTimeout、debug等;至于page.json即单个页面的配置,只有window配置项(即页面展示样式)的权限,所以不用写配置项名字,直接写内容。写完页面配置会覆盖掉全局配置的window属性。

/*一个小程序的简单文件树模型*/
├── app.js
├── app.json 
├── app.wxss
├── pages     /*页面文件包*/
│   │── index  /*每个文件夹一个页面*/
│   │   ├── index.wxml
│   │   ├── index.js
│   │   ├── index.json  /*page.json*/
│   │   └── index.wxss
│   └── logs
│       ├── logs.wxml
│       └── logs.js
└── utils
    └── utils.js /*封装的工具类js,utils里用 module.exports 输出,外部用require调用*/

文件的嵌套

  wxml中嵌套另外一个wxml<include src="../public/public.wxml"/>
  wxss中的嵌套@import "../public/public.wxss";
  js中的嵌套var utils = require('../../utils/util.js')
需要配合在被引用js中使用module.exports = {sayHi:sayHi,task:task}

rpx/rem

  rpx、rem是自适应屏幕尺寸的单位。小程序的宽度是750rpx(20rem)。如果屏幕宽度是375px,使用rpx后, 1rpx = 0.5px;使用rem的话,1rem = 18.75 px。相比之下,rpx更适合精细定位。

花括号/大括号

//开发者工具中
if(true){
  this.setData({
    foo:'bar'
  })
}
//可省略为
if(true)
  this.setData({
    foo:'bar'
  })
//强迫症 短时间内不打算采用,还是老规矩写

双花/大括号

<text class="tipText">{{valueText}}</text>和Vue(或者PHP,同样都是嵌套插入)里的用法比较像,wxml里插入,js里动态设定内容。双括号可以充当类名(class="{{className}}")、属性(src="{{imageUrl}}")。可以包裹三元表达式如class="{{dataNum == 2?'newClass':''}}"根据外在条件做判断,可以达到动态改变元素样式的目的。

小程序组件

swiper

  滑块视图容器,就是焦点图,不用再写一大堆js,定义一下属性就可以实现不错的效果。

<swiper style="height:300rpx;width:100%" autoplay="true" 
indicator-dots="true" indicator-color="#fff" 
indicator-active-color="#00c0ff" 
bindchange="swiperChange" bindanimationfinish="swiperFinish">
  <swiper-item >
    <image mode="widthFix" src="demo.jpg"></image>
  </swiper-item>
</swiper>

  swiperswiper-item需要组合使用,上面这个定义了宽高、自动、小圆点指示器。还有intervaldurationcircularvertical这些属性等等。可以绑定 change 和 finish 事件。

view

  view也是视图容器,还有scroll-viewmovable-viewcover-view,就是字面意思,可滚动的,可移动的,覆盖的。给个入口

textarea原生组件

  textarea适合在输入多行文本时候使用,不过需要注意这是个原生组件,层级是最高的,非原生组件是盖不到它上面的。scroll-viewswiperpicker-viewmovable-view这几个里面不能使用,没C3动画,也不能fixed。
  为了在原生组件上添加内容,小程序定义了两个特殊的原生组件,cover-viewcover-image,这两个可以覆盖在部分原生组件之上。可覆盖的原生组件包括mapvideocanvascameralive-playerlive-pusher。很遗憾这个部分并不包括textarea,需要覆盖的情况可以考虑隐藏textarea的样式,附加的内容在带有样式的view里上下排列。
  另外,在textarea输入区域内也不建议有其它元素的事件,因为开发者工具中事件是可以绑定和测试成功的,但是真机上有问题。比如之前的项目里有需要通过定位把一个按钮布局进textarea区域内,bindtap="copy"(copy是自定义的名字)开发者工具里点击按钮一次,实现了复制;预览进入真机之后,点击会弹出键盘,私以为这是原生组件的最高层级问题,但是在疯狂点击之后,有那么一两次会触发成功,而且在特意放大按钮之后,触发几率会变大。最后是以text替换textarea解决,暂时没有详细测试根本原因。Mark

小程序Flex布局

  Flex布局的常用属性总结一下

.container{//容器
    display:flex;
    height:100%;
    width:100%;
    flex-direction:row; //默认是 row 按行排,column 是按列排
    flex-wrap:nowrap; //挤不下的时候缩窄,选用wrap 的话是换行
    flex-flow:nowrap row; //上边两个的复合写法
    justify-content:center; //水平居中
    //flex-start | flex-end | space-between | space-around
    align-items:center; //垂直居中,针对一行
    //flex-start | flex-end | baseline | stretch;
    align-content:center; // 垂直居中,针对wrap的多行
}
.content{//内容
    flex-grow:2; //地方足够大时,规定这个元素放大的比例
    flex-shrink:1; //不够大时,规定这个元素缩小的比例
    flex-basis:100rpx; //水平方向占多大空间
    flex:2 1 100rpx; //grow,shrink,basis复合写法
    order:3; //从左到右显示的顺序
    align-self:; //每个元素自己的对齐方式
}

做一个简单的复制、清空按钮

<!--wxml文件-->
<view>
    <text>{{results}}</text>
    <button size='mini' bindtap='clear'>清空<button/>
    <button size='mini' bindtap='copy'>复制<button/>
</view>
//js文件
page({
    data:{
        results:'测试文本',
    }
    //判断是否有内容,没有就提示,有就清空
    clear: function (e) {
    var that = this;
    if (that.data.results == '') {
      wx.showToast({
        title: '无内容',
        icon: 'none'
      });
    } else {
      that.setData({
        results: ''
      })
      wx.showToast({
        title: '清除成功',
        icon: 'none'
      });
    }
  },
  //判断是否有内容,没有就提示,有就放进剪切板
  copy: function (e) {
    var that = this;
    if (that.data.results == '') {
      wx.showToast({
        title: '无内容',
        icon: 'none'
      });
    } else {
      wx.setClipboardData({
        data: that.data.results,
        success: function (res) {
          wx.showToast({
            title: '复制成功',
            icon: 'none'
          });
        }
      });
    }
  },

做一个有字数提示的输入框

使用的组件是textarea,想添加一个限定字数的提示。

<!--wxml文件-->
<view>
    <textarea bindinput='inputs' value='{{majorValue}}'></textarea>
    <text class='textTip'>你还可以输入{{currentLeft}}字</text>
</view>
//js文件 字数检测
page({
    data:{
        majorValue:"",
        currentLeft:140,
    }
    inputs: function (e) {    
    var value = e.detail.value;     //找到当前框内的值
    var len = parseInt(value.length);   //算出长度          
    this.setData({
      currentLeft: 140-len  //总长度减去目前长度
    });  
  },
})

生命周期函数

onLoad: function ()  //监听页面加载
onShow: function ()  //页面显示/切入前台时触发。
onReady: function ()  //页面初次渲染完成时触发。一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。
/*对界面内容进行设置的 API 如wx.setNavigationBarTitle,需在onReady之后进行。*/
onHide: function ()  //页面隐藏/切入后台时触发。 如 navigateTo 或底部 tab 切换到其他页面,小程序切入后台等。
onUnload: function ()  //页面卸载时触发。如redirectTo或navigateBack到其他页面时。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352