WePy框架开发小程序总结

现如今mvvm框架如此火热,其核心思想即js逻辑层不直接操作DOM,只改变组件状态;而视图层则通过模板template进行渲染。

1.WePy项目的目录结构

├── dist                        小程序运行代码目录
├── node_modules         依赖
├── src                          代码编写的目录
|   ├── components         WePY组件目录
|   |   ├─- com_a.wpy      可复用的WePY组件a
|   |   └── com_b.wpy     可复用的WePY组件b
|   ├── pages                 WePY页面目录(属于完整页面)
|   |   ├── index.wpy       index页面
|   |   └── other.wpy       other页面
|   └── app.wpy             小程序配置项(全局数据、样式、声明钩子等)
└── package.json           项目的package配置

二、实例

小程序定义了三大实例类,App、Page、Component; app

2.1 App

入口文件app.wpy声明的小程序实例继承至wepy.app类,包含小程序的生命周期函数、config配置、全局属性方法及自定义方法。

export default class extends wepy.app {
        config = {
            pages: [  //页面配置
                ‘pages/index/index‘,
                ‘pages/personals/personal‘,
            ],
            window: {
                backgroundTextStyle: ‘light‘,
                navigationBarBackgroundColor: ‘#a22b00‘,
                navigationBarTitleText: ‘‘,
                navigationBarTextStyle: ‘white‘
            },
            tabBar: {  //tab栏
              list: [
                {
                  pagePath: ‘pages/index/index‘,
                  text: ‘首页‘,
                  iconPath: ‘./static/images/icon-index2.png‘,
                  selectedIconPath: ‘./static/images/icon-index1.png‘
                },
                {
                  pagePath: ‘pages/personals/personal‘,
                  text: ‘我的‘,
                  iconPath: ‘./static/images/icon-my2.png‘,
                  selectedIconPath: ‘./static/images/icon-my1.png‘
                }
              ],
              color: ‘#000‘,
              borderStyle: ‘white‘,
              selectedColor: ‘#ff5000‘,
              backgroundColor: ‘#ffffff‘
            }
        };
        globalData = {
           //全局数据
        };

        onLaunch() {
            //生命周期函数--监听小程序初始化(全局只触发一次)
        };

        onShow() {
            //生命周期函数--监听小程序显示
        };

        customFunction() {
          //自定义方法
        };

    }    

2.2 Page

page页面继承至wepy.page类,该类主要属性如下:

  • config                页面配置对象,对应于原生的page.json文件;
  • components      页面组件列表对象;
  • data                   页面渲染数据对象,存放可用于页面模板绑定的渲染数据;
  • methods             wxml模板中事件处理函数;
  • events                WePy组件之间通信的函数,响应$broadcast$emit$invoke;
  • 生命周期函数      onLoad、onShow;
  • 自定义方法

2.3 component

components中的组件实例继承wepy.component,本质上page也是component,所以component组件实例除了不需要config配置以及页面特有的一些生命周期函数之外,其属性与页面属性大致相同。

三、组件间的通信

wepy.component基类提供$broadcast$emit$invoke三个方法用于组件之间的通信和交互。

this.$emit(funName,arg1,arg2);

组件间通信的事件处理函数需要写在组件和页面的events对象中,但是$invoke触发的事件在methods中响应:

import wepy from ‘wepy‘

export default class Com extends wepy.component {
    components = {};

    data = {};

    methods = {  //响应$invoke
        funNamet: (p1, p2, $event) => {
           //处理逻辑
        }
     };

    // events对象中所声明的函数为用于监听组件之间的通信与交互事件的事件处理函数
    events = {  //响应$emit、$broadcast
        funNamet: (p1, p2, $event) => {
           //处理逻辑
        }
    };
    // Other properties
}

$broadcast事件是由父组件发起,所有子组件都会收到此广播事件,除非事件被手动取消,捕获顺序。

$emit$broadcast正好相反,事件发起组件的所有祖先组件会依次接收到$emit事件,冒泡顺序。

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

四、数据绑定

原生小程序的数据绑定方式

原生小程序通过Page提供的setData方法来绑定数据,如:

this.setData({title: ‘this is title‘});

WePY数据绑定方式

Wepy使用脏数据检查对setData进行封装,在函数执行周期结束时进行脏数据检查。一来不用关心页面多次setData是否有性能上的问题;二来可以更加简洁去修改数据实现绑定。

this.title = ‘this is title‘;

值得注意的是,在异步绑定数据时,需要执行$apply()才会触发脏数据检查,

setTimeout(() => {
    this.title = ‘this is title‘;
    this.$apply();
}, 3000);

WePY脏数据检查流程

在执行脏数据检查时,会通过this.$$phase标识当前检查状态,并且会保证在并发的流程当中,只会有一个脏数据检查流程在运行,以下是执行脏数据检查的流程图:

五、小程序登录授权获取逻辑

原生的小程序提供许多开放接口供使用者开发,快速建立小程序内的用户体系。

下面将小程序校验、登录、授权、获取用户信息诸多接口串联起来,以便更直观的认识到这些接口是如何在实际应用中使用的。

5.1 检验、登录

wx.checkSession({
    success: function() {
       //session_key 未过期,并且在本生命周期一直有效
    },
    fail: function() {
        //session_key 已经失效,需要重新执行登录流程
        wx.login({
            success: (res) => {
                if (res.code) {
                    //发起网络请求
                    wx.request({
                        //开发者服务器通过code换取用户唯一标识openid 和 会话密钥session_key。
                        url: ‘https://test.com/onLogin‘,
                        data: {
                            // 临时登录凭证code,并回传到开发者服务器
                            code: res.code
                        },
                        success: function(result) {
                            //返回业务数据,前后端交互身份识别
                        }
                    })
                } else {
                    console.log(‘登录失败!‘ + res.errMsg)
                }
            }
        });
    }
})

login说明:

  1. 小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
  2. 开发者服务器以code换取 用户唯一标识openid 和 会话密钥session_key。

之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

会话密钥session_key有效性:

开发者如果遇到因为session_key不正确而校验签名失败或解密失败,请关注下面几个与session_key有关的注意事项。

  1. wx.login()调用时,用户的session_key会被更新而致使旧session_key失效。开发者应该在明确需要重新登录时才调用wx.login(),及时通过登录凭证校验接口更新服务器存储的session_key。
  2. 微信不会把session_key的有效期告知开发者。我们会根据用户使用小程序的行为对session_key进行续期。用户越频繁使用小程序,session_key有效期越长。
  3. 开发者在session_key失效时,可以通过重新执行登录流程获取有效的session_key。使用接口wx.checkSession()可以校验session_key是否有效,从而避免小程序反复执行登录流程。
  4. 当开发者在实现自定义登录态时,可以考虑以session_key有效期作为自身登录态有效期,也可以实现自定义的时效性策略。

5.2 授权获取用户信息

// 可以通过 wx.getSetting 先查询一下用户是否授权了 "scope.record" 这个 scope
wx.getSetting({
    success(res) {
        if (!res.authSetting[‘scope.record‘]) {
            wx.authorize({
                scope: ‘scope.record‘,
                success() {
                    // 用户已经同意小程序使用录音功能,后续调用 wx.startRecord 接口不会弹窗询问
                    wx.startRecord()
                }
            })
        }
    }
})

注意:wx.authorize({scope: "scope.userInfo"}),无法弹出授权窗口,请使用 <button open-type="getUserInfo"></button>

如果用户已经授权,要获取用户信息,调下面接口:

wx.getSetting({
    success: (res)=>{
        if (res.authSetting[‘scope.userInfo‘]) {
            // 已经授权,可以直接调用 getUserInfo 获取头像昵称
            wx.getUserInfo({
              withCredentials: true,
              success: (res) => {
                  console.log(res);
              }
            })
        }
    }
}); 

注意:

  1. 当用户未授权过,调用该接口将直接报错
  2. 当用户授权过,可以使用该接口获取用户信息

原文地址:https://www.cnblogs.com/lodadssd/p/9069471.html

时间: 2024-08-27 02:58:29

WePy框架开发小程序总结的相关文章

wepy框架开发小程序遇到的node-sass问题解决方案

一.报错图 二.解决方案 主要是windows平台缺少编译环境, 1.先运行: npm install -g node-gyp 2.然后运行cmd:(右键点击:以管理员身份运行) 输入:npm install --global -production windows-build-tools  成功图: 3.在项目根目录下新建一个.npmrc,目的是把国外的npm源指向国内的镜像. 内容: phantomjs_cdnurl=http://cnpmjs.org/downloadssass_binar

微信小程序开发—小程序框架详解(二)

上一节讲了微信小程序的目录结构及各个文件的作用,主要介绍了小程序的配置文件及其支持的配置属性. 本节主要从逻辑层和视图层来说明小程序的框架. 小程序的逻辑层由js完成,视图层由微信提供的WXML(WeiXin Mark Language)和WXSS(WeiXin Style Sheet)文件来完成. 其中官方给出的解释:页面的脚本逻辑是在JsCore中运行,JsCore是一个没有窗口对象的环境,所以不能在脚本中使用window,也无法在脚本中操作组件.同时由于zepto/jquery 会使用到w

wepy开发小程序eslint报错error &#39;getApp&#39; is not defined no-undef

wepy开发小程序使用getApp().globalData保存全局数据很方便,但是会在控制台看到很多报错:"error 'getApp' is not defined no-undef",这是eslint报错. 解决办法:在.eslintrc.js文件中加入   globals: { getApp: true } wepy开发小程序eslint报错error 'getApp' is not defined no-undef 原文地址:https://www.cnblogs.com/s

WePY 在手机充值小程序中的应用与实践

wepyjs 发布了两个月了,中间经历了很多版本更新,也慢慢开始有一些用户选择 wepyjs 作为开发框架来开发小程序,比如一些线上小程序. 以及一些来自网上的 wepyjs 的相关资源: demo源码: one,图书管理系统 组件:图表控件 因此我也将手机充值小程序在开发过程中 wepyjs 的应用心得分享出来,可以参照对比与传统小程序开发上的差异. 说明:本文不涉及到 wepyjs 的使用与说明,如果需要请参看我的另一篇文章 "打造小程序组件化开发框架" 或直接参看wepyjs 项

使用mpvue开发小程序教程(二)

在上篇文章中,我们介绍了使用mpvue开发小程序所需要的一些开发环境的搭建,并创建了第一个mpvue小程序代码骨架并将其运行起来.在本文中,我们来研究熟悉一下mpvue项目的主要目录和文件结构. 在Visual Studio Code里面打开项目文件夹,我们可以看到类似如下的文件结构: firstapp ├── package.json ├── project.config.json ├── static ├── src │ ├── components │ ├── pages │ ├── ut

跨端开发小程序

在微信小程序中,每个页面都是由.js..wxss..wxmk和.json四个部分构成,代码结构比较复杂.另外,由于对ES6语法和sass等css预处理支持的不友好,导致开发效率很低,所以早早就有用vue.js来开发小程序的框架,比如webpy和mpvue,但是基本都是单纯的开发微信小程序. 可是,随着微信小程序.网页H5.头条小程序.百度小程序.支付宝小程序.快运用.原生APP的增多,每个都独立开发的话,每个前端估计都要吐血了,所以,就出现了跨端开发的框架.现在基本对多端支持足够好的,就是tar

共享链模式开发小程序商城

微信里头的共享链是一款营销工具,解决实体店现有的营销方案难以刺激消费者.被电商的打压导致实体店的生意越来越难做.外卖成本越来越高等痛点."共享链"基于区块链技术理念而开发,以消费奖励的方式,让消费者重复消费,主动分享,持续关注.达到提升商家销量的目的.共享链模式开发小程序商城:151-1222-4001(微/电) 举例,顾客到某水果店购买商品后通过共享链支付成功后进入共享链小程序,该小程序里面会显示消费者的消费金额,奖励金额和已经到账金额,之后其他消费者也到该水果店消费,那共享链系统会

开发小程序(填坑之路,遇到一点就更新一点)

1.开发小程序发送请求时,报错不在以下合法列表中: 在开发工具详情中设置: 请参考微信官方文档:关于小程序网络相关API说明 2.如果你需要权限验证(如登录后访问),小程序不像浏览器能帮你自动携带cookie信息,那么你需要自己写在将cookie写入请求hedear中,不然每次请求都通不过权限验证. wx.request({ url: `${API_URL}/${type}`, data: Object.assign({}, params), method: 'POST', header: {

部署wepy框架开发微信小程序

我用的是yarn,如果你使用的是npm,也可以 首先需要安装wepy命令行工具 npm install wepy-cli -g 然后在选定的位置使用脚手架工具创建wepy项目 wepy init standard yy-cabinet PS C:\Users\gushi\Desktop> wepy init standard yy-cabinet ? Project name yy-cabinet ? Project description 研一智能药剂柜微信小程序项目 ? Author gst