撸了一个微信小程序项目
学会一项开发技能最快的步骤就是:准备,开火,瞄准。最慢的就是:准备,瞄准,瞄准,瞄准……
因为微信小程序比较简单,直接开撸就行,千万别瞄准。
于是乎,趁着今天上午空气质量不错,撸了一个小程序,放在了男性交友网站上了, 我添加了很全的注释,大家赏个star。
地址:https://github.com/yll2wcf/wechat-weapp-lifeTools
功能介绍
功能比较简单,调用了百度ApiStore的接口即时查询空气质量。
我计划多加一些功能,争取把微信小程序提供的功能全用一遍。
也许你可以学到的东西
- css的优先级 代码见: /pages/air_quality/result.wxss
- 页面跳转,数据的传递 /pages/air_quality/air_quality.js ../result.js common/utils.js
- 网络请求 /pages/air_quality/air_quality.js
- 样式统一 程序的配置 参考 app.wxss app.json
- modal显示和隐藏 /pages/air_quality/air_quality.wxml ../air_quality.js
- 状态机 事件绑定等等
css优先级
微信样式文件,其实就是css样式做了个加减法,就变成了wxss文件。
其中增加了一个单位 rpx(responsive pixel): 可以根据屏幕宽度进行自适应。不是绝对像素,类似Android中的dp单位。参考官方文档
除去上面的,剩下的wxss和css大部分还是一样的,包括样式选择的优先级。
原则一: 继承不如指定
原则二: #id > .class > 标签选择符
原则三:越具体越强大
原则四:标签#id >#id ; 标签.class > .classCSS优先级权重计算法
CSS优先级包含四个级别(标签内选择符,ID选择符,Class选择符,元素选择符)以及各级别出现的次数!
根据这四个级别出现的次数计算得到CSS的优先级。
CSS优先级的计算规则如下:
* 元素标签中定义的样式(Style属性),加1,0,0,0
* 每个ID选择符(如 #id),加0,1,0,0
* 每个Class选择符(如 .class)、每个属性选择符(如 [attribute=])、每个伪类(如 :hover)加0,0,1,0
* 每个元素选择符(如p)或伪元素选择符(如 :firstchild)等,加0,0,0,1
然后,将这四个数字分别累加,就得到每个CSS定义的优先级的值,
然后从左到右逐位比较大小,数字大的CSS样式的优先级就高。
啰嗦了这么多 ,不如直接看例子,项目中result.wxml文件中布局:
<View class="page">
<view class="container" style="align-items: center">
<!--...-->
<view class="text_area">
<text >
查询城市: {{city}}
</text>
<!--...-->
</view>
</view>
</View>
其中class="page"
中的page定义样式有:
.page {
...
font-size: 32rpx;
}
Text标签也指定了font-size
样式
text {
font-size: 34rpx;
}
当前位置由于 class page中指定了font-size,Text标签也制定了该属性, 虽然标签优先级不如class高, 但是原则一:继承不如指定,所以34rpx生效。
页面的跳转
再小的程序,一个界面也不太够用,跳转界面还是必须的。
微信提供了navigator组件,当用户按下该组件时跳转,这属于静态跳转,类似网页中的a标签;
也可以在触发某些事件时,通过导航Api 跳转界面,这种做法比较灵活。
//跳转地址可以写相对路径,绝对路径一定要以/ 开头 这样写pages/air_quality/result是错误的
wx.navigateTo( {
url:util.createURL( "./result", res.data.retData),
});
路径后面可以通过? 拼装要传递的数据, 类似网络中get请求拼装url一样。
上面createURL就是我写的一个工具方法 ,在项目的common/utils.js
文件中。
/*链接和参数*/
function createURL( url, obj ) {
let props = "";
let resultURL="";
for(let p in obj){
if(obj[p])
props+= "&"+p + "=" + obj[p];
}
resultURL=url+"?"+props.substr(1);
console.log(resultURL);
return resultURL;
}
module.exports = {
createURL: createURL
}
网络请求
具体写法可以参考官方文档
下面是我的代码:
//联网
wx.request( {
//url
url: Constant.AIR_QUALITY_URL,
header: {
"Content-Type": "application/json",
"apikey": Constant.API_KEY
},
data: {
"city": this.data.inputValue
},
//res = {data: '开发者服务器返回的内容'}
success: function( res ) {
console.log( res.data );
if( res.data.errNum === 0 ) { //成功
//跳转地址可以写相对路径,绝对路径一定要以/ 开头 这样写pages/air_quality/result是错误的
wx.navigateTo( {
url:util.createURL( "./result", res.data.retData),
});
}else{
that.setData( { //这个位置应该用page的引用调用
modalHidden: false,
modalErrorText:res.data.retMsg
});
}
},
//失败,弹出modal
fail: function() {
//console.log(this); //这时候的this不是Page了
that.setData( { //这个位置应该用page的引用调用
modalHidden: false,
modalErrorText:"请求失败,请检测网络"
})
},
//无论成功与失败,loading都取消
complete: function() {
that.setData( {
loading: false
})
}
});
页面统一样式
微信小程序的api不是很多,比较容易上手, 但是写出来一个好的程序还是需要仔细研究的,建议大家看一下微信提供的设计文档
好看的程序不一定好用,但是好用的程序一定好看。哪怕是个充气的,你也肯定选好看的那个。
为了每个界面样式统一,大家可以把相关样式抽取到app.wxss
文件中,这个文件的样式其它所以界面都可以直接使用。
下面是项目里的app.wxss
,因为涉及的页面较少,用到的样式不多,目前就下面几个:
/**app.wxss**/
page {
background-color: #fbf9fe;
height: 100%;
}
/**容器 flex-direction: column 表示元素垂直排列*/
.container {
min-height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 200rpx 0rpx;
}
/**page 用于页面根标签 overflow超出范围的裁剪**/
.page {
min-height: 100%;
flex: 1;
background-color: #FBF9FE;
font-size: 32rpx;
font-family: -apple-system-font,Helvetica Neue,Helvetica,sans-serif;
overflow: hidden;
}
/**页面中的input的组件**/
.page input{
padding: 20rpx 30rpx;
background-color: #fff;
}
/**段落*/
.section{
margin-bottom: 80rpx;
}
/**段落标题*/
.section__title{
margin-bottom: 16rpx;
padding-left: 30rpx;
padding-right: 30rpx;
}
/**button范围*/
.btn-area{
padding: 0 30rpx;
}
/**button*/
.btn-area button{
margin-top: 20rpx;
margin-bottom: 20rpx;
}
状态机
微信框架刷新界面的方式类似React Native的状态机。之前写过一篇从零学React Native之02状态机
微信每个页面都可以设置data数据。如我的项目中的:
Page( {
data: { //状态机数据
inputValue: "", //输入的内容
loading: false, //加载状态
disabled: true, //按钮是否可用
modalHidden: true, //modal弹出状态
modalErrorText:"请求失败,请检测网络"//modal弹出提示文字
},
....
}
data里的数据一般用来控制界面的变化。
data里的数据不要随便乱写, 只设置和界面相关的。因为里面的数据一旦发生变化就会刷新界面,无关的数据只会加重渲染的压力。
data里面的数据,可以在wxml文件中通过 {{js数据}}
格式绑定。
最后强调, 只能使用setData函数改变状态机变量
最后吐槽
世界上只有两种程序,一种是天天挨骂的,另一种是没人用的。
微信小程序的开发环境非常难用,简直在侮辱开发环境这个词。连个自动闭合标签都没有,好多提示都没有(没提示谁会写代码啊),用中文输入法就会发现好的问题,想写中文注释需要时刻保持shift键切换,千万别忘了。
如果不想用它,也没问题, 用webStorm也可以写, 但是目前调试还是在微信开发环境中好用点。
webStorm需要配置 *.wxss和 *.wxml 的文件类型。 wxss对应css , wxml对应xml或者html
有兴趣学习微信小程序开发的可以关注简书专题 微信小程序开发
更多精彩请关注微信公众账号likeDev
撸了一个微信小程序项目的更多相关文章
- 开发一个微信小程序项目教程
一.注册小程序账号 1.进入微信公众平台(https://mp.weixin.qq.com/),注册小程序账号,根据提示填写对应的信息即可.2.注册成功后进入首页,在 小程序发布流程->小程序开 ...
- 微信小程序开发01 --- 微信小程序项目结构介绍
一.微信小程序简单介绍: 微信官方介绍微信小程序是一个不需要下载安装就可使用(呵呵,JS代码不用下载吗?展示的UI不用下载吗?)的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用. ...
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
[微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...
- 《微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记1)WePY开发环境的安装
WePY的安装或更新都通过npm进行,全局安装或更新WePY命令行工具,使用以下命令: npm install wepy-cli -g 稍等片刻,成功安装后,即可创建WePY项目. 注意:如果npm安 ...
- 微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记4)支持React.js语法的Taro框架
Taro本身实现的情况类似于mpvue,mpvue的未来展望中也包含了支付宝小程序,现在的版本中,也可以使用不同的构建命令来构建出百度小程序的支持,如第10章所示,但是现在Taro先于mpvue实现了 ...
- 使用uni-app(Vue.js)创建运行微信小程序项目步骤
使用uni-app(Vue.js)开发微信小程序项目步骤 1. 新建一个uni-app项目 创建完成后的目录结构 2. 打开微信小程序开发工具端的端口调试功能 3. 运行创建的项目 效果
- 微信小程序项目转换为uni-app项目
一.它是谁? [miniprogram-to-uniapp]转换微信小程序"项目为uni-app项目.原则上混淆过的项目,也可以进转换,因为关键字丢失,不一定会完美. 二.它的原理是什么? ...
- 如何快速地开发一个微信小程序
如何快速地开发一个微信小程序呢?我觉得作为初学者,最好能有一个模板,然后改这个模板. 同样作为初学者,刚开始的时候我有下面的几个问题,后来通过问同学,我弄清楚了. 微信小程序可以连接MySQL或者Sq ...
- 高仿Readhub小程序 微信小程序项目【原】
# News #### 项目介绍微信小程序项目涉及功能 https://gitee.com/richard1015/News https://github.com/richard1015/News 高 ...
随机推荐
- Python numpy.transpose 详解
前言 看Python代码时,碰见 numpy.transpose 用于高维数组时挺让人费解,通过一番画图分析和代码验证,发现 transpose 用法还是很简单的. 正文 Numpy 文档 numpy ...
- Leetcode448.Find All Numbers Disappeared in an Array找到所有数组中消失的数字
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不 ...
- python \r \t \n 各种转义字符
转义字符 描述 \(在行尾时) 续行符 \\ 反斜杠符号 \’ 单引号 \” 双引号 \a 响铃 \b 退格(Backspace) \e 转义 \000 空 \n 换行 \v 纵向制表符 \t 横向制 ...
- Linux下perl模块安装
perl模块下载地址: http://search.cpan.org/ 假设放在/usr/local/src/下 cd /usr/local/src 上传下载的压缩包CGI-Session-3.95. ...
- COOK50小结
题目链接 很遗憾.看到第五题的通过人数就不敢做了.待日后补上. A题 求最长的连续子序列,使得他们满足gcd为1. 如果有相邻的两个数的gcd为1,那么整个序列的gcd值也就是1, 否则就是该序列不存 ...
- Eular质数筛法
小Hi:我们可以知道,任意一个正整数k,若k≥2,则k可以表示成若干个质数相乘的形式.Eratosthenes筛法中,在枚举k的每一个质因子时,我们都计算了一次k,从而造成了冗余.因此在改进算法中,只 ...
- spring cloud深入学习(一)-----什么是微服务?什么是rpc?spring cloud简介
近年来,微服务非常的流行,那么为什么是它?简单介绍一下. 为什么是微服务? 微服务架构是一种将单应用程序作为一套小型服务开发的方法,每种应用程序都在其自己的进程中运行,并与轻量级机制(通常是HTTP资 ...
- jeecms怎么修改后台访问路径?
1,修改后台访问路径: 如:http://localhost:8080/jeeadmin/jeecms/login.do 改:http://localhost:8080/hailou/index.do ...
- spring四种依赖注入方式(转)
spring四种依赖注入方式!! 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提 ...
- file.length()方法返回0字节
本地调试ok 扔到服务器上就返回0 初步估测是因为使用jnotify监控文件修改事件的时候,刚好文件被重命名了(下载完成后xxx.tmp,被改成正确的后缀名) 2019-7-20:不是上边说的那个亚子 ...