当前位置: 首页 > 编程日记 > 正文

微信小程序开发初探

一、关于微信小程序

1.1 小程序诞生的背景

张小龙说道:

(1)一切以用户价值为依归→用户是微信的核心,所以微信中没有很多与客户无关的功能,比如QQ中的乱七八糟一系列东西。

(2)让创造发挥价值→所有围绕微信的创造比如公众号都应该发挥其应有的价值。

(3)用完即走的高效服务→这一点就厉害了word天,微信要打造一个以微信为中心的生态链,不以绑定用户为目标。比如生活中有一些不太常用的app,我们可能一年也使用不了几次,但是有时候就需要用到,微信就想要提供这样一个平台,让你可以在微信中使用这中所谓的app的功能。或者说可以这样理解,让微信成为一个类似于Windows的操作系统,各种小程序就是操作系统上的应用软件。

(4)无形存在的商业化→微信使得人与人之间的联系变成了无形的商业化网,这个网可以创造很多无形的商业价值。

1.2 小程序是个什么鬼?

张小龙在朋友圈里这样解释道:小程序是一种不需要下载安装即可使用的应用,它实现了应用「触手可及」的梦想,用户扫一扫或搜一下即可打开应用。也体现了「用完即走」的理念,用户不用关心是否安装太多应用的问题。应用将无处不在,随时可用,但又无需安装卸载。

1.3 技术层面的小程序

微信小程序 = XML + CSS + JS 的移动应用程序

1.4 为什么要开发微信小程序?

(1)更好的给用户提供用完即走的服务

(2)给用户提供更好的使用体验

(3)功能更加深入:https://mp.weixin.qq.com/debug/wxadoc/dev/

(4)设计更加统一:https://mp.weixin.qq.com/debug/wxadoc/design/index.html?t=20161109

(5)类似于微信钱包中的第三方服务

二、开发工具的安装

2.1 下载微信开发者工具

Windows 64位:点我下载

Windows 32位:点我下载

Mac 版 :点我下载

2.2 安装微信开发者工具

这里我使用的是wechat_web_devtools_0.10.102800_x64版:

安装完成后,第一次启动时会出现一个二维码,需要使用微信扫描该二维码才可登录开发者工具:

三、第一个微信小程序

3.1 添加微信小程序项目

Step1.选择调试类型:本地小程序项目→添加项目

Step2.由于我们暂时没有AppID,所以选择无AppID(无AppID部分功能会受限)

Step3.进入开发者工具界面,默认是选中“调试”面板

可以看到,在调试面板中,左侧是页面效果预览窗口,右侧是类似于Chrome的开发者的工具。在预览窗口可以选择一些常见的手机型号和不同的分变率,大家可以看出这简直就是Chrome开发者工具的翻版。

3.2 微信小程序结构一览

新建了一个小程序之后,开发工具为我们默认生成了一些文件,下面我们来看看这些文件都是看些什么用,以及程序结构又是什么样子的。

(1)项目结构

(2)应用程序级文件

① app.js

//app.js
App({onLaunch: function () {//调用API从本地缓存中获取数据var logs = wx.getStorageSync('logs') || []logs.unshift(Date.now())wx.setStorageSync('logs', logs)},getUserInfo:function(cb){var that = thisif(this.globalData.userInfo){typeof cb == "function" && cb(this.globalData.userInfo)}else{//调用登录接口
      wx.login({success: function () {wx.getUserInfo({success: function (res) {that.globalData.userInfo = res.userInfotypeof cb == "function" && cb(that.globalData.userInfo)}})}})}},globalData:{userInfo:null}
})

app.js定义了全局的一些重要事件,比如程序启动时要做些什么,如何获取微信用户信息等等。App函数是一个全局函数,它的作用就是用来创建一个应用程序实例,每个应用程序都会有它的生命周期,因此一些重要的生命周期事件都会在这里定义。例如,onLaunch事件就是程序在启动时需要干什么。

② app.json

{"pages":["pages/index/index","pages/logs/logs"],"window":{"backgroundTextStyle":"light","navigationBarBackgroundColor": "#fff","navigationBarTitleText": "Manulife WeChat Demo","navigationBarTextStyle":"black"}
}

app.json 则定义了程序有哪些页面,以及窗口标题及相关样式等。例如,我们再这里将navigationBarTitleText属性值改为了Manulife WeChat Demo,来看看调试窗口会显示什么?

③ app.wxss

/**app.wxss**/
.container {height: 100%;display: flex;flex-direction: column;align-items: center;justify-content: space-between;padding: 200rpx 0;box-sizing: border-box;
} 

app.wxss 则定义了全局样式,你可以把它理解为一些所有页面公用的css样式。其实,它也就是一个披着wxss后缀名的css3样式表而已。

(3)具体页面级文件

① index.js

//index.js
//获取应用实例
var app = getApp()
Page({data: {motto: 'Hello World',userInfo: {}},//事件处理函数bindViewTap: function() {wx.navigateTo({url: '../logs/logs'})},onLoad: function () {console.log('onLoad')var that = this//调用应用实例的方法获取全局数据app.getUserInfo(function(userInfo){//更新数据
      that.setData({userInfo:userInfo})})}
})

每个页面的业务逻辑都会写在各自的js文件中,可以看到index.js中所有的业务逻辑都会写到Page中,而app.js中所有逻辑都写在App中。

② index.wxml

<!--index.wxml-->
<view class="container"><view  bindtap="bindViewTap" class="userinfo"><image class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image><text class="userinfo-nickname">{{userInfo.nickName}}</text></view><view class="usermotto"><text class="user-motto">{{motto}}</text></view>
</view>

index.wxml则类似于html为页面定了一个具体的div区域,通过类似于AngularJS的模型绑定将具体的数据绑定到具体的位置。这里再回到index.js中就可以看到原来在index.js中就是为了给这些模型赋值。另外,wxml=>weixin markup language.

wxml语法遵循XML语法,注意是XML语法,不是HTML语法,不是HTML语法,不是HTML语法

③ index.wxss

/**index.wxss**/
.userinfo {display: flex;flex-direction: column;align-items: center;
}.userinfo-avatar {width: 128rpx;height: 128rpx;margin: 20rpx;border-radius: 50%;
}.userinfo-nickname {color: #aaa;
}.usermotto {margin-top: 200px;
}

index.wxss则和app.wxss一样,都是css样式表,只是index.wxss主要针对于index.wxml这个页面,它有明确的作用域。另外,wxss=>weixin style sheet.

(3)微信小程序总体结构

我们的微信小程序会启动时会生成一个app应用实例,这个app实例会运行多个page,每个page之间又会有一些关联。多个page都需要用到的一些功能则封装到公共方法中,例如util.js,calc.js等等。

3.3 最小化编程体验

(1)添加一个文件夹test,新建三个页面级文件。

不要问我为什么要这样子命名,就像我们在ASP.NET MVC中Action与View的名字要保持一致一样,这是一个约定俗称的事儿。当然,你也可以新建一个文件夹,不叫pages,然后在那个文件夹里边定义这些页面。只需要在app.json中配置成另外的文件夹即可。

(2)修改app.json,添加页面设置

app.json中定义了一个pages数组,每一项代表对应页面的【路径+文件名】信息,数组的第一项代表小程序的初始页面。小程序中新增/减少页面,都需要对pages数组进行修改。因此,这里我们将刚刚的test页面假如pages数组,并放到首位。

"pages":["pages/test/test","pages/index/index","pages/logs/logs"]

(3)编辑test.wxml,添加一句hello world!

按照国际惯例,每次学习一个新的语言我们都会输出一句hello world!来代表我们的第一个程序,因此这里也不能免俗。

<text>Hello WeChat Little App!</text>

(4)编辑test.wxss,添加一个样式,为刚刚的hello world文本设置为红色字体

.hello
{font-size: 14pt;color:red;
}
<text class="hello">Hello WeChat Little App!</text>

(5)编辑app.js,定义一个全局使用的函数getMessage,方法很简单,就不再多说

App({// 一些自定义的额外方法
  getMessage(para){var result = "Your name is " + para;return result;},......
}

(6)编辑test.js,调用全局函数,输出控制台

//通过getApp方法获取应用实例
const app = getApp()Page({onLoad(){// 在test页面加载时调用全局方法getMessageconst msg = app.getMessage("Edison");// 在控制台输出msg结果
        console.log(msg);}
})

(7)编辑test.js,为页面添加一个数据供页面绑定

Page({data:{errorMessage: "User name can not be null!"},onLoad(){......}
})
<text>Hello WeChat Little App!</text>
<text class="hello">{{errorMessage}}</text>

四、调用服务加载数据

4.1 关于REST服务接口

这里就可以把我们的REST服务弄出来调用啦,不过这里我们采用已有的公开的API接口来调用,比如豆瓣的各种电影、读书等就提供了一些API可以供调用。

这里我们选择豆瓣电影提供的一些API,对于下面的这个list页面,使用的是“即将上映的电影”的接口:

4.2 添加必要文件

添加新文件夹:list,并添加三大页面级文件

4.3 调用API发起小请求

首先我们可以通过查看微信小程序官方开发文档,看到发起请求的示例代码如下:

wx.request({url: 'test.php',data: {x: '' ,y: ''},header:{"Content-Type":"application/json"},success: function(res) {var data = res.data;}
});

因此我们依样画葫芦:

//通过getApp方法获取应用实例
const app = getApp()Page({data:{message:"Hello Edison",list:[]},onLoad(){const currentPage = this// 在list页面加载时调用api获取数据
        wx.request({url : "https://api.douban.com/v2/movie/in_theaters",data: {},header:{"Content-Type":"application/json"},success: function(res) {var data = res.data;currentPage.setData({list : data.subjects})}})}
})

编辑list.wxml,添加一个列表:

<text>{{message}}</text>
<view><view class="item" wx:for="{{list}}"><text>{{item.title}}</text></view>
</view>

再来给每个item项设置一下样式:

.item
{border: 1px solid #000;font-size:12pt;
}

这时可以来看看效果,电影列表被加载了出来:

我们发现这个api还返回了电影的海报,因此我们还可以改造一下程序,在列表里边将海报也显示出来:

<text>{{message}}</text>
<view><view class="item" wx:for="{{list}}"><image src="{{item.images.large}}"></image><text>{{item.title}}</text></view>
</view>

这里我们加了一个image标签,注意不是html的img标签。这时,再来看看界面效果:

4.4 预览你的小程序

如果你有AppID,那么你就可以开始预览你的小程序了:

开发者工具左侧菜单栏选择”项目”,点击”预览”,扫码后即可在微信客户端中体验。这里我们是无AppID的体验模式,因此没法预览,更没法上传。

五、豆瓣电影示例项目

5.1 项目地址

这个项目是我看的一个公开课的讲师汪磊写的一个demo,功能虽小但五脏俱全,是一个拿来学习练手的小项目。

GitHub仓库地址:https://github.com/zce/weapp-demo

5.2 项目功能

前方流量预警,gif动图,你懂得:

demo show

5.4 学习计划

汪磊专门为这个demo设置了一些分支,每个分支循序渐进,实现了不同的功能。我们可以跟着这个计划,一步一步得去完成这个demo。

六、小结

本篇了解微信小程序是个什么鬼,最基本的小程序结构是什么样子的,还按照国际惯例做了一个hello world,并调用了一次api。虽然过程很简单很low,但前端程序包括app不就是做的这些事儿吗?后续我会跟着汪磊的demo一步一步得把那个豆瓣项目写出来,或许会分享一篇新的文章跟各位见面。好了,很久没有熬过夜了,今天就到此结束啦。

参考资料

(1)汪磊,《微信小程序公开课》

(2)汪磊,《微信小程序基础入门》

(3)劳卜,《通过微信小程序看前端》

(4)白琦,《一篇文章读懂微信小程序是什么》

(5)官方文档,https://mp.weixin.qq.com/debug/wxadoc/dev/

转载于:https://www.cnblogs.com/edisonchou/p/6081851.html

相关文章:

ue4商城资源 The Forest v1.5 森林景观场景

ue4商城资源 The Forest v1.5 森林景观场景 ue4商城资源 The Forest v1.5 森林景观场景 ue4商城资源 The Forest v1.5 森林景观场景 Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –The Forest v1.5 森林景观场景 大小解压后&#xff1a;2.62G 云桥网络 平台…

服务器硬盘如何增加分区,服务器硬盘分区方法是什么?

服务器硬盘&#xff0c;顾名思义&#xff0c;就是服务器上使用的硬盘。如果说服务器是网络数据的核心&#xff0c;那么服务器硬盘就是这个核心的数据仓库&#xff0c;所有的软件和用户数据都存储在这里。用户用久了服务器硬盘就可能会出现空间不足的情况&#xff0c;那么应该如…

在批处理中调用JS操作MongoDB

在MongoDB中&#xff0c;我们可以通过JS脚本去操作数据。 一、编写数据操作JS脚本 新建JS文件writeData.js&#xff0c;编写数据操作内容如下&#xff1a; var curTime new Date(); db.user.insert({name:张三,password:123456, UpdateTime:curTime}); 另存文件&#xff0c;将…

Object的finalize()方法的作用是否与C++的析构函数作用相同

Object的finalize()方法的作用是否与C的析构函数作用相同 public class Finalization {private static Finalization finalization;/**finalize在gc回收中有不确定性&#xff0c;所以不推荐用finalize进行回收*/Overrideprotected void finalize(){System.out.println("fi…

leetcode Edit Distance

作者&#xff1a;jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4051082.html 题目链接&#xff1a;leetcode Edit Distance 最短编辑距离&#xff0c;简单dp&#xff0c;dp[i,j]表示到str1的第i个字符和str2的第j个字符止的最短编辑距离。 dp[i,j] min(dp[i-1,j-…

设计模式的征途—10.装饰(Decorator)模式

虽然目前房价依旧很高&#xff0c;就连我所在的成都郊区&#xff08;非中心城区&#xff09;的房价均价都早已破万&#xff0c;但却还是阻挡不了大家对新房的渴望和买房的热情。如果大家买的是清水房&#xff0c;那么无疑还有一项艰巨的任务在等着大家&#xff0c;那就是装修。…

ue4商城资源 Nature Cave Cliff 自然洞崖景观场景

ue4商城资源 Nature Cave Cliff 自然洞崖景观场景 ue4商城资源 Nature Cave Cliff 自然洞崖景观场景 ue4商城资源 Nature Cave Cliff 自然洞崖景观场景 Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –Nature Cave Cliff 自然洞崖景观场景 大小解压后&#x…

android View未渲染时获得高度

ViewTreeObserver vto tv.getViewTreeObserver();vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {public void onGlobalLayout() {heigh appDescription.getHeight();tv.getViewTreeObserver().removeGlobalOnLayoutListener(this);}}); 转载于:https://www.c…

指定服务器无效,安装sqlserver2008r2 服务器配置,服务帐户配置出错,提示Sql server服务指定的凭据无效...

iOS 手势大全1.Touch事件 //系统自动调用 //一个UITouch代表一根手指 按住option变成两根手指 //虽然是两个手指,但只执行一次触摸事件 - (void)touchesBegan:(NSSet ...与useradd命令相关的两个默认配置文件Configuration Files for User Management Defaults When working …

2022-2028年中国树脂行业市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国树脂行业市场行业相关概述、中国树脂行业市场行业运行环境、分析了中国树脂行业市场行业的…

Web API路由和动作选择

前言 本文描述ASP.NET Web API如何把一个HTTP请求路由到控制器的一个特定的Action上。关于路由的总体概述可以参见上一篇教程 http://www.cnblogs.com/aehyok/p/3442051.html。这篇文章主要来学习路由过程的细节。如果你创建了一个Web API项目&#xff0c;发现有一些请求没有按…

希望和等待:目标,欲望和意志

意志是盲目的。 欲望是不能消灭的&#xff0c;只能代替。 高人云&#xff0c;人生最重要的是什么&#xff1f;是目标。哲人言&#xff0c;人生无非希望和等待而已。 人的信息系统是任务为导向的&#xff0c;所有的人都有目标&#xff0c;不过自觉不自觉&#xff0c;大小&#x…

c4d+ps打造抽象NFT加密艺术 Create Abstract NFT Crypto Art with Cinema 4D + Photoshop

c4dps打造抽象NFT加密艺术 Create Abstract NFT Crypto Art with C4D PS c4dps打造抽象NFT加密艺术 Create Abstract NFT Crypto Art with C4D PS c4dps打造抽象NFT加密艺术 Create Abstract NFT Crypto Art with C4D PS c4dps打造抽象NFT加密艺术 Create Abstract NFT Cryp…

vb打开ftp服务器文件路径,VB上传指定文件到FTP指定目录。。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼目前用如下代码能够实现上传&#xff0c;但是不能上传到指定目录去。。怎么改变&#xff1f;Option ExplicitPrivate Const INTERNET_OPEN_TYPE_DIRECT 1Private Const scuseragent "vb wininet"Private Const INTERNE…

firefox+linux+nginx搭建server与client通过证书双向认证环境

项目中需要搭建一个server和client基于证书的双向认证环境。由我来做&#xff0c;我也不会。 经过一晚上的研究&#xff0c;基本摸清了&#xff08;知其然不知其所以然&#xff09;。做下笔记。 基本环境&#xff1a; 1.安装nginx。 2.安装openssl。 生成证书&#xff1a; 首先…

编写高性能Java代码的最佳实践

编写高性能Java代码的最佳实践 摘要&#xff1a;本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控&#xff0c;随后介绍了编写高性能Java代码的一些最佳实践。最后研究了JVM特定的调优技巧、数据库端的优化和架构方面的调整。以下是译文。 介绍 在这篇文章中&…

Exchange 2013 OWA搜索邮件失败问题处理

Exchange 2013 OWA搜索邮件失败问题处理问题&#xff1a;接到用户反馈&#xff0c;exchange 2013 owa搜索邮件失败&#xff0c;提示“您的搜索未返回任何结果“&#xff0c;如下图&#xff0c;但是outlook搜索正常。打开EMS命令行工具&#xff0c;get-mailboxdatabasecopystatu…

PAT_B_1027 打印沙漏

题目描述&#xff1a; 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印************ ***** 所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符号中心对齐&#xff1b;相邻两行符号数差2&#xff1b;符…

3dmax2021入门学习教程

3dmax2021入门学习教程 MP4 | h264&#xff0c;1280x720 |语言&#xff1a;英语中文字幕&#xff08;根据原英文字幕机译&#xff09;原英文字幕 | 4h 23m | 3.55 GB 含课程素材工程文件 云桥网络 平台获取素材 你将学到什么 3DS MAX中的样条线和多边形建模 纹理、照明和渲…

关于HTML代码的转义

笔记&#xff1a; 1.在通过jsonp方式传输HTML代码的时候&#xff0c;为了防止代码中的一些字符影响json的语法&#xff0c;需要对HTML代码进行转义。 2.转义的时候可以只转义特殊字符&#xff08;引号之类的&#xff09;&#xff0c;也可以把所有字符&#xff08;中文&#xff…

php ajax替换数据,如何用ajax替换php函数

我是这里的 AJAX 新手。ajax的动作执行后如何替换初始的php函数&#xff1f;我发现执行操作后页面不会刷新。这是代码&#xff1a;javascriptfunction set_ddm(another_data) {var result $.ajax({url: ../display/ea_form_header.php,type: POST,data: {action: set_ddm,Data…

2022-2028年中国输送胶管行业市场全景调查及投资前景趋势报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国输送胶管行业市场行业相关概述、中国输送胶管行业市场行业运行环境、分析了中国输送胶管行…

CGIC简明教程(转摘)

CGIC简明教程 本系列的目的是演示如何使用C语言的CGI库“CGIC”完成Web开发的各种要求。&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#…

conflicts with existing, non-compatible bean definition of same name and class

Annotation-specified bean name xxxxxImpl for bean class [cn.abc.dao.service.xxxxxImpl] conflicts with existing, non-compatible bean definition of same name and class [cn.abc.dao.service.dev.xxxxxIImpl] 编译没问题&#xff0c;运行就报错了。 一查原来发现在dao…

Tree 使用方式

Traditional Ways of Tree Traversal This page contains examples of some “standard” traversal algorithms (ones that can be found in most textbooks). All examples perform pre-order tree traversal on a general rooted tree. “Algorithms, Data Structures and P…

网站更换服务器ip地教程,由于服务器更换IP地址,服务器不更换。需要如何操作使网站正常运行呢?,POSCMS,CodeIgniter技术文档,PHP开发文档,迅睿CMS框架官方教程...

多文件Files内容详情中(show.html) 模板中调用方法是&#xff1a;{loop $字段名 $i $c} 序号: {$i} 标题&#xff1a;{$c.title} 描述&#xff1a;{$c.description} 文件原始地址&#xff1a;{dr_get_file($c.file)} 文件的下载地址&#xff1a;{dr_down_file($c.file)} 图片缩…

3ds Max V-Ray5 完整指南大师班视频教程

3ds Max V-Ray5 完整指南大师班视频教程 时长15小时 包括项目文件 1920X1080 MP4 语言&#xff1a;英语中文字幕&#xff08;机译&#xff09; 标题&#xff1a;Gumroad–V-Ray 5 Masterclass:您的3ds Max V-Ray完整指南 大小&#xff1a;41.8G 共八大章 88小节课程 信息&am…

2022-2028年中国氢化丁晴橡胶行业市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国氢化丁晴橡胶电商行业市场行业相关概述、中国氢化丁晴橡胶电商行业市场行业运行环境、分析…

配置Exchange OWA和Sharepoint网站单点登录

配置Exchange OWA和Sharepoint网站单点登录如果我们在组织中已经部署完成了Lync、Exchange以及Sharepoint&#xff0c;那么我们会发现这三套系统在通过域账户登录计算机时&#xff0c;如果本机有安装Outlook和Lync&#xff0c;那么在登录Lync或启动Outlook的时候就会自动使用当…

BigTable

转载于:https://www.cnblogs.com/fanweisheng/p/11250529.html