微信小程序 -- 记录学习
Mock缺少与服务器交换数据的行为。
json中的最后一行的 逗号(,)不能保留。json格式下,键值都应该是双引号。
微信小程序---model弹窗:<model></model>标签
微信小程序修改checkbox和radio的样式
tabBar
json 的 pages 数组中排第一个的页面必须是 tabbar 的第一个标签的主页
请注意switchTab只能跳转到带有tab的页面,不能跳转到不带tab的页面!跳转不带tab的页面还是需要使用redirect或者navigate!
page.json
每一个小程序页面也可以使用.json
文件来对本页面的窗口表现进行配置。页面的配置比app.json
全局配置简单得多,只是设置 app.json 中的 window 配置项的内容,页面中配置项会覆盖 app.json 的 window 中相同的配置项。
页面的.json
只能设置window
相关的配置项,以决定本页面的窗口表现,所以无需写window
这个键
bindtap
小程序中,全用bindtap(bind+event),或者catchtap(catch+event)绑定事件,例如:
跳转其他页面,并传递一个参数:
一个超级简单的布局:....
/* pages/classify/classify.wxss */
.title {display: flex;justify-content: center;height: 80rpx;line-height: 80rpx;
}
.text {color:#ccc;font-size:30rpx;padding: 0 20rpx;
}
.line {position: relative;top: 40rpx;width: 30rpx;border-top: 1px solid #ccc;
}
还有一个超级简单的布局 :多份图片文字都居中
.container {display: flex;justify-content: space-around;
}
.container .item {width: 20%;text-align: center;border: 1px solid #ccc;
}
.container .item image{width: 100%;height: 80rpx;
}
.container .item view{font-size:26rpx;
}
flex布局:
flex-direction: column; //排列方向
justify-content: space-around; //主轴对齐方向: 每个元素两侧的距离均相等
align-items:center; //交叉轴对齐方向:根据flex-direction判断
1. 基础布局
.container {display: flex;flex-direction: column; justify-content: space-around; align-items:center; height: 400px;background-color:blue;
}
2. wrap 换行及根据高度计算消除多余的间距
.container {display: flex;flex-direction: row; justify-content: space-around;align-items:flex-start;flex-wrap: wrap;height: 200px;background-color:blue;
}
.chunk {width: 150px;height: 100px;
}
小程序:
1. 首页注意细节
点击到最后一期期刊时,箭头无法再点击。
通过本地缓存,读取期刊数据(而不是每次点击去请求服务端)。
2. 搜索页
头部搜索固定顶部。
点击搜索后,内容直接覆盖搜索页。
加载更多loading功能。
3. 其余
分享功能。
小程序跳转其他小程序。
<image> 标签引入图片时,需要设置高度和宽度。否则就是默认的宽高(宽320px;高240px))
小程序尺寸单位与设计原则:
rpx自适应尺寸。(当设计师以iphone6为设计稿标准时,标注的尺寸与rpx为1:1,而px则需要设置为标注的一半)。
情况:字体的大小假如不希望随机型改变。border边框。
只有很少的css样式可以被组件继承。
文字本身有空白间距。(设置和文字相同的line-height就能够消除)。
设置diaplay:inline-flex; 自适应宽度。
bind:tap(触摸事件,阻止点击冒泡)。
一般setData方法多用于点击后改变页面信息或者刷新后与后台交互获取最新的信息
注意:
- 直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的,还会造成数据不一致
- 单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。
组件内部的数据就直接写在data中(组件的内部数据),需要开放出来的数据写在properties属性中(组件的对外属性)。
wx.request(Object):
1. 只要服务器返回了结果(而不管结果是成功还是失败),都是执行success回调函数。需要在小程序的后台账号中添加要访问的域名。
2. 是一个异步函数,如果直接对这个赋值是取不到结果的。
3. 涉及到this的指代问题:可以直接在回调中使用箭头函数解决作用域的问题。获取异步的数据
success:(res)=>{console.log(this.data.test)
}
ES6的新语法:模块化的导入和导出
导出:新建一个config.js文件,写入:
const config = {api_base_url: 'http://bl.7yue.pro/v1/',appkey: 'KOLDaSADSDLWWbF'
}export {config}
导入:新建util/http.js,写入:
import {config} from '/config.js'
将API的调用封装成一个类:
ES5只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6又提供了三种新方法。
includes():返回布尔值,表示是否找到了参数字符串;
startsWith():返回布尔值,表示参数字符串是否在查找字符串的头部;
endsWith():返回布尔值,表示参数字符串是否在查找字符串的尾部。
let s = 'Hello world!';s.indexOf('e') //1s.startsWith('Hello') // true s.endsWith('!') // true s.includes('o') // true
同时这三个方法都支持第二个参数,表示开始搜索的位置。
在import时只能使用相对路径,而组件中是可以使用绝对路径的。
import {config} from '../config.js'class HTTP{// 类中的方法request(params) {// 如果没有指定方法,就默认是GETif(!params.method) {params.method='GET'}// 发起微信请求wx.request({url: config.api_base_url +params.url,method:params.method,data:params.data,header:{'content-type':'application/json','appkey': config.appkey},success:(res)=>{let code = res.statusCode.toString()// 如果是2开头则调用成功的方法,startsWithif(code.startsWith('2')){params.success(res.data)}else{}},fail:(err)=> {}})}
}
export {HTTP}
在classify/classify.js中使用:使用自定义的类的方法
import {HTTP} from '../../util/http.js'let http= new HTTP()Page({/*** 生命周期函数--监听页面加载*/onLoad: function (options) {http.request({url:'classic/latest',success:(res)=>{console.log(res)}})// wx.request({// url: 'http://bl.7yue.pro/v1/classic/latest',// header: {// appkey: 'KOLDaSADSDLWWbF'// },// success:(res)=>{// console.log(this.data.test)// }// })}
})
增加API调用时的错误异常处理:util/http.js:增加了一个私有方法去显示错误信息
import {config} from '../config.js'
const tip = {1: '抱歉,出现一个错误了', //作为默认的错误提示1005: 'appkey无效,申请一个咯',3000:'期刊不存在'
}
class HTTP{// 类中的方法request(params) {// 发起微信请求wx.request({success:(res)=>{let code = res.statusCode.toString()// 如果是2开头则调用成功的方法,startsWithif(code.startsWith('2')){params.success && params.success(res.data)}else{let error_code = res.error_codethis._show_error(error_code)}},fail:(err)=> {this._show_error(1)}})};_show_error(error_code) {if(!error_code) {error_code = 1}wx.showToast({title: tip[error_code],icon:'none',duration:2000})}
}
export {HTTP}
改写获取数据的方法:models/classic.js : 通过扩展HTTP这个类
import {HTTP} from '../util/http.js'
// 拓展一个类的方法,获取数据
class ClassModel extends HTTP {// 在方法中调用回调函数getLatest(sCallback) {this.request({url: 'classic/latest',success: (res) => {sCallback(res)}})
}
}
export {ClassModel}
同时获取数据的方法就可以改成:pages/classify/classify.js:在实例化的方法中使用箭头函数调用结果。
import {ClassModel} from '../../models/classic.js'let classic= new ClassModel()Page({onLoad: function (options) {classic.getLatest((res)=>{})}
})
通过回调函数获得调用的结果。
在组件中设置自定义事件:this.triggerEvent("like",{},{})
1. 通知页面,用户点击了这个组件
2. 并且需要附加一个状态:用户的行为
组件的自定义事件:this.triggerEvent("like",{},{}) 事件名就是like
// 激活事件let behavior = this.properties.like ? 'like' : 'cancel'this.triggerEvent("like", {behavior //改变事件中detail的值}, {})
然后在页面中通过bind:like=“like” 绑定自定义的事件。
models/like.js中写POST请求:
import { HTTP } from '../util/http.js'
// 拓展一个类的方法,获取数据
class LikeModel extends HTTP {// 在方法中调用回调函数like(behavior, artID, category ) {let url = behavior == "like" ? "like" : "like/cancel" this.request({url: url,method: 'POST',data: {art_id: artID,type: category}})}
}
export { LikeModel }
父组件中调用:
onLike: function (event) {console.log(event)let behavior = event.detail.behaviorlikeModel.like(behavior, this.data.classicData.id, this.data.classicData.type)},
在data中的字符串初始化应为: ''表示。数字就用:0表示。
组件的observer函数,在改变属性值之后会自动调用和这个函数:
(不能在属性properties中的observer中改变自身的值,否则会发生无限递归):利用wxs可以解决。
// components/expore/index.js
Component({/*** 组件的属性列表*/properties: {index: {type: String,oberver:function(newVal,oldVal,changePath) {let val = newVal < 10? '0'+newVal : newValthis.setData({_index:val})}}},/*** 组件的初始数据*/data: {_index:''},})
5. input封装为内置组件
对于将 input
封装在自定义组件中、而 form
在自定义组件外的情况, form
将不能获得这个自定义组件中 input
的值。此时需要使用自定义组件的内置behavior wx://form-field
。
form表单:
<form bindsubmit="formSubmit">表单<!-- 自定义的input组件 只需要在这个自定义的组件中加上name属性即可,不需要在组件中的input上加name属性 --><my-input name="test"></my-input><button form-type="submit">提交</button>
</form>
自定义input组件:
<!-- 自定义input组件 --><view><!-- 这里不需要设置name属性,而是在调用组件时,添加name属性。如<my-input name="test"></my-input> --><input bindinput="getInputValue"></input></view>
提示:behaviors的功能相当于组件之间公用代码,里面有公用的属性、方法。可以把behavior当做构造函数,别的组件能使用这个behavior的方法和数据。
Component({behaviors: ['wx://form-field'], //wx://form-field 代表一个内置 behavior ,它使得这个自定义组件有类似于表单控件的行为。properties: {// value:{ //其实要在自定义input组件中设置固定(默认)值,可以直接在properties中设置,不用在attached中调用setData设置// type: String,// value: '1' // 默认值为 1// }},attached() {// this.setData({// value: '官网给出的例子:在attached生命周期设置的value值是固定的,所以我在input失去焦点时,设置value值'// })},methods:{getInputValue (e) {this.setData({value: e.detail.value // behaviors: ['wx://form-field']里面就有设置value属性,所以我们可以直接拿来设置value})}}
})
可以: 原文地址
微信小程序 -- 记录学习相关推荐
- web前端-微信小程序开发学习
web前端-微信小程序开发学习 1. 小程序的概述 2. 小程序的项目结构 2.1 小程序项目结构分析 2.2 WXML模版 2.3 小程序的宿主环境 3. 组件 3.1 视图容器类组件 3.2 常用 ...
- 微信小程序记录用户行为浏览记录和停留时间以及小程序全局分享
微信小程序记录用户行为浏览记录和停留时间以及小程序全局分享 项目需求 1.后台统计一个用户在我们小程序的每个页面的停留时间 2,前台用户可以在个人中心看到自己的分享记录以及多少人查看 需求分析 需求一 ...
- 微信小程序开发学习1(小程序的入门知识)
微信小程序开发学习1(小程序的入门知识) 1.制定学习目标: 能够知道如何创建小程序项目 能够清楚小程序项目的基本组成结构 能够知道小程序页面的几个组成部分 能够知道小程序中常见的组件如何使用 能够知 ...
- 微信小程序开发学习5(自定义组件)
微信小程序开发学习5(自定义组件) 1.学习目标 能够知道如何自定义小程序组件 能够知道小程序组件中behaviors的作用 能够知道如何安装和配置vant-weapp组件库 能够知道如何使用MobX ...
- ssm基于微信小程序的学习资料销售平台+ssm+uinapp+Mysql+计算机毕业设计
本微信小程序的学习资料销售平台以ssm作为框架,b/s模式以及MySql作为后台运行的数据库,同时使用Tomcat用为系统的服务器.本系统主要包括以下功能模块:首页.个人中心.用户管理.资料类型管理. ...
- 微信小程序开发学习4(视图与逻辑)
微信小程序开发学习4(视图与逻辑) 1.学习目标 能够知道如何实现页面之间的导航跳转 能够知道如何实现下拉刷新效果 能够知道如何实现上拉加载更多效果 能够知道小程序中常用的生命周期函数 2.页面导航 ...
- 微信小程序开发学习6(基础加强之使用npm包和全局数据共享及分包【Tab底栏案例改进】)
微信小程序开发学习6(基础加强之使用npm包和全局数据共享及分包) 1.使用npm包 小程序对npm包的支持 目前,小程序中已经支持使用p安装第三方包,从而来提高小程序的开发效率.但是,在小程序中使用 ...
- 微信小程序开发学习2(模板与配置)
微信小程序开发学习2(模板与配置) 1.学习目标 能够使用WXML模板语法渲染页面结构 能够使用WXSS样式美化页面结构 能够使用app,json对小程序进行全局性配置 能够使用page.json对小 ...
- bilibili微信小程序开发学习总结
bilibili微信小程序开发学习总结 用来半天学习了微信小程序模仿做了个B站小程序,其实如果有编程基础特别熟悉Vue语法与web的话那小程序基本就是随便玩玩,整体写法与vue一致,页面搭建与web也 ...
最新文章
- 某小公司:MySQL连环问
- 含有“外骨骼”的电影和游戏
- Visitor(访问者)模式在SAP CDS view测试框架中的灵活运用
- CSS之calc()使用
- mysql适合什么阵列_如何选择最合适的RAID级别
- 解读 Knative Eventing v0.10.0 最新版本特性
- c#随机数的产生与输出【C#】
- Java中的queue和deque对比详解
- 9-12 原生安装4
- 轧机用弹性阻尼体反力计算_「轴承知识」轧机轴承故障频繁怎么办?必要的检查维护不可少...
- C# 线程安全的单例模式
- 可编程逻辑器件FPGA学习-VHDL
- 基于java宿舍管理系统的开题报告_基于Java的学生宿舍管理系统开题报告
- seaweedfs java_seaweedfs-java-client
- python 计算字符串表达式_python计算数学表达式
- 如何设置代理服务器?
- 项目vite1.0升级到2.0打包遇到Some chunks are larger问题如何解决
- linux设置sfq队列参数,Linux系统运维之Linux高级流量控制工具TC使用方法
- 【观察】从社恐症到社牛症,有一台微软Surface就够了
- 2012清明北京---泰山踏青
热门文章
- python图像处理实践——给头像加数字
- 金融行业与金融信息化讲座
- 奥林巴斯高管表示将会推出E-M5 II后续机型
- CAD中怎么生成图块表格?CAD图块表格使用技巧
- 低成本光端机设计方案
- Google Earth Engine(GEE)——全球影像拼接分析
- signature=0530fd811a6c6b231d307e5e78a2e12e,[Profound mycoses in AIDS in Abidjan (Cte d'Ivoire)]
- 5.2 综合案例-继电器控制
- Camera Feature
- 汽车模拟游戏源码下载Rigs of Rods(C/C++)