微信小程序基础知识总结

wepy+vant 微信小程序开发总结

前言

本次小程序开发选择使用 wepy作为小程序第三方框架,在UI组件库方面选择的是有赞的移动端组件库Vant去快速搭建小程序应用。这次小程序功能需求并不是特别复杂,目前亲测功能基本满足。这段时间刚好工作空闲期,决定将这次开发的坑以及重要点记录下来,以备今后查阅。(另外,与小程序同期还有用vue做的H5 app开发,下面会在部分情况比较二者的区别!)

wepy准备工作

全局安装wePy模块包

npm install wepy-cli -g

代码编辑用的一直还是VsCode,在VsCode编辑器里开发,然后通过开启wepy实时编译,用微信原生开发者工具实时预览与调试!

wepy build --watch

微信原生开发者工具使用注意事项

  1. 项目设置中,关闭ES6转ES5,上传代码时样式自动补全,开启不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书 。 注意:官网说,应当关闭上传代码时自动压缩混淆,否则会导致部分功能不能正常使用,但我因为在真机调试或者预览的时候,编译打包失败超出大小限制还是勾上了,以保证手机可以正常预览调试。
  2. 使用微信原生开发者工具实时预览时,只需导入wepy build 后生成的build目录即可!

wepy 基本常见用法总结

  1. 事件绑定

    原生的bindtap="click" 变成 @tap="click"catchtap="click"变成@tap.stop="click"

  2. 事件传参
    原来通过自定义data-param变量 :bindtap="click" data-index={{index}}传参优化成:@tap="click('{{index}}')"吃(注:传递变量需要加' ' 包裹)

    传递多个变量:@tap="checkedChange('{{item.id}}', '{{index}}')"

  3. wepy使用单文件模式,将原生的page页面的4个文件page.js,page.json,page.wxml,page.wxss汇总成一个page.wpy;app页面一样。

    以page页面为例,简述wepy优化后的页面代码结构:

    <template>
        <view>
            ... 我是html部分
        <view>
    </template>
            
    <script>
      import wepy from 'wepy';
      import HomoloStep from '../../components/HomoloStep';
      export default class PayResult extends wepy.page {
        config = {
          navigationBarBackgroundColor: '#447BC9',  // 此处设置相当于page.json内容,定义页头
          navigationBarTitleText: '支付结果',
          navigationBarTextStyle: 'white',
          usingComponents: {  // 引入的第三方UI组件库vant
            'van-button': '../../components/van/button/index'
          }
        };
        // 此处注册自己封装的公共组件
        components = {
            'HomoloStep': HomoloStep 
        }
        data = {
            show: false,
            ...
        };
        // methods 里面只负责写页面交互相关的方法,比如:@tap...
        methods = {
            ...
        };
        // 无交互的事件,自己写的一些初始方法挪出methos,保持于methods同级!
        getNotaryOffices () {
        }
        // 初始化生命周期,加载页面数据
        onLoad () {
         this.getNotaryOffices()
        }
      }
    </script>
            
    <style lang='less' scoped>
        ...
    </style>
    
  4. 数据更新

    原生使用this.setData({title: 'this is title'});的形式更新数据,wepy优化为:this.title = 'this is title'

    注意:在异步更新数据,接口返回数据前端对数据做复杂forEach操作,或者比如删除操作成功很久了,视图才减少掉等等...各种数据更新,页面没有更新的情况,都可以使用this.$apply()方法,触发脏数据检查,使页面强制更新!

  5. img属性绑定区别

    这里没有为什么,就想特别记录一下image标签的src绑定区别:

    用vue 写的h5 APP时是这样的:

    <img :src="environment.restServiceUrl +'tk.File/' +unUploadItem.fileId +'/view'">
    

    并且:vue这边,要想在data数据里面直接写入img的src本地图片路径,需要使用requie('../../bg.png')

    defaultOfficeBg: require("@/assets/images/office-default.png")
    

    微信小程序是这样的...

    <image src="{{item.img}}" />
    

    注: 小程序无法在样式style中,直接使用background-image 去加载本地图片,只能用网络url或者base64的形式 ;要想使用本地图片要用image标签才行。

  6. 动态样式

    // 写法一: 
    <ul class="search-history {{isShowMore ? 'search-history-more' : ''}} {{...}}"></ul>
    // 写法二:
    <view class="m-select-group-item" :class="{'m-select-group-item--active': activeIdx === index}"></view>
    
  7. 数据循环 , 条件判断

    小程序这边数据循环,我因为写法的大意,踩了一个坑,这边特别记录一下:

    // 特别设置key,item 属性的时候,注意没有{{}},并且 wx:key就可以啦,没有for-前缀
    <view wx:for="{{offices}}" wx:key="item.id" wx:for-item="item">
     {{item.name}} ...
    </view>
    
    // 小程序条件判断
    <view wx:if="{{ident.result === '同一人'}}">...</view>
    <view wx:elif="{{ident.result === '非同一人'}}">...</view>
    <view wx:else>...</view>
    // vue 这边是直接 v-if... v-else 即可
    
  8. 组件封装使用

    组件引用:父组件script中,先import引用子组件,然后在components对象中给组件声明唯一的组件ID,接着在template中,用声明的组件ID所命名的自定义标签插入组件。

    <template>
        <!-- 以`<script>`脚本部分中所声明的组件ID为名命名自定义标签,从而在`<template>`模板部分中插入组件 -->
        <child></child>
    </template>
    
    <script>
        import wepy from 'wepy';
        //引入组件文件
        import Child from '../components/child';
        export default class Index extends wepy.page {
            //为两个相同组件的不同实例分配不同的组件ID,从而避免数据同步变化的问题
            components = {
                child: Child,
                anotherchild: Child
            };
        }
    </script>
    

    props 父子组件传值:与vue一样,包括静态传值动态传值

    静态传值:父组件给子组件传递常量数据 String类型(不需要加:

    <homolo-select-translate placeholder="请选择翻译语种"></homolo-select-translate>
    

    动态传值:父组件向子组件传递动态数据(需要加::),可以通过使用.sync修饰符达到父组件数据绑定至子组件,也可以通过设置twoWay:true达到子组件数据绑定至父组件的效果。两者同时使用,可以实现双向绑定

    <homolo-select-translate :list.sync="translateLists" :id.sync="translateId"></homolo-select-translate>
    
    export default class HomoloSelect extends wepy.component {
     props = {
       list: { // 父组件向子组件单向传值,有.sync修饰符的props属性值,当在父组件中改变时,会同时改变子组件对应的值
         type: Array,
         default: []
       },
       id: {
         type: String,
         default: undefined,
         twoWay: true  // 子组件props中的属性值改变时,会同时改变父组件对应的值
       },
       placeholder: String // 静态传值
     }
    };
    

    组件通信交互

    $emit:子组件向父组件通信交互 。(暂时只用过这种...)

    $broadcast: 父组件向所有子组件通信。

    $invoke: 是一个页面或组件对另一个组件中的方法的直接调用,通过传入组件路径找到相应的组件,然后再调用其方法。

  9. 请求封装

    wepy框架wepy.request() 默认对所有的小程序提供的API进行了promise处理。支持promise,但是需要手动开启promise的支持

    wxRequest.js页面:

    import wepy from 'wepy';
    
    const request = (url, config = {}) => {
      return wepy.request({
        url: url,
        data: Object.assign({}, config.data, wepy.$instance.globalData.tokenId ? {personId: wepy.$instance.globalData.tokenId} : {}) || {}, // 每次请求data中携带固定的参数
        method: config.method || 'GET',
        dataType: config.dataType || 'json',
        header: config.header || {
          'Content-Type': 'application/json',
          'X-CSRF-TOKEN': wepy.$instance.globalData.CSRF_TOKEN, // 自定义js文件获取globalData的全局变量
        }
      })
    }
    
    export default {
      request
    }
    

小程序授权,登陆流程

暂时项目进度,还没有特别完善的登陆流程。后续,看情况再更新。。。暂时记录一下,关于授权,登陆的注意点:

  1. 授权方面:

    如果想通过wx.getUserInfo()获取用户信息,需要先走授权。可以使用 wx.getSetting 获取用户当前的授权状态。

    向用户发起授权窗口请使用:<button open-type="getUserInfo">

    <button open-type="getUserInfo" bindgetuserinfo="onGotUserInfo">获取用户信息</button>
      
    <script>
        onGotUserInfo(e) {
          console.log(e.detail.userInfo)
          wx.getSetting({
            success (res) {
              if (res.authSetting['scope.userInfo']) {
                wx.redirectTo({url: './login-register/login'})
              } else {
                  ...
              }
            }
          })
        },
    </script>
    
  2. 登陆流程

    menu.saveimg.savepath20190329134012.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 开源项目 wepy-wechat-demo:基于wepy开发的仿微信聊天界面小程序 深大的树洞:基于wepy开发的...
    dufebin阅读 4,118评论 0 19
  • 因新工作主要负责微信小程序这一块,最近的重心就移到这一块,该博客是对微信小程序整体的整理归纳以及标明一些细节点,初...
    majun00阅读 7,327评论 0 9
  • 简介 微信小程序入门门槛低、开发周期短、代码编写灵活、传播速度快等优点让微信小程序迅速火爆,开发者纷纷涌入,任何语...
    大公爵阅读 4,140评论 0 10
  • Feeling a pure delight. 中午没睡觉,太困了! 早上学习打卡了,but晚上没锻炼. 是否可以...
    W大步溜阅读 406评论 0 0
  • 蔬食衛生 肉食傷生 殺时恨心 其毒非輕 勿貪吃肉 吃了须還 還的時候 真個可憐
    释净意阅读 195评论 0 1