小程序 开发经验

项目目录理解

在这里插入图片描述

components自定义组件库
config一个公用的数据配置
images本地、上传的图片放置
pagespages目录存储小程序的每个页面,每个页面包含四个文档.json为配置文件.wxml 为模板文件,相当于HTML模板.wxss 为样式文件,相当于HTML的CSS样式表.js 为JS 脚本逻辑文件,相当于HTML的js脚本
utils一个共用程序逻辑库公共的js函数文件,通过module.exports的方式暴露pages下的每个页面使用不需要每个页面编写重复的Js代码。
app.js必填,小程序逻辑
app.json必填,小程序公共配置
app.wxss选填,小程序公共样式表
project.config.json项目配置文件或称为项目IDE配置文件在“微信开发者工具”上做的任何配置都会写入到这个文件

绝对路径和相对路径

“/”表示根目录
"…"表示返回上一级
区别:相对路径习惯用“…/”表示上一级

尺寸


rpx
换算:1px = 1rpx 要求:设计搞宽高满足750X1334 ipone6
px与rpx的区别:rpx可以自适应。让元素宽高根据不同屏幕自适应,px是固定大小的尺寸

元素偏移量

<view class="parent"><view>hello</view><view class="child"></view>
</view>
.parent{display:inline-flex; /* 自适应宽度 */width:90rpx;padding:10rpx; /* 解决子元素偏移量超出不显示问题,让子元素正常显示 */
}
.child{position:relative;top:-10rpx;left:6rpx
}

字体

eg:font-family:“PingFangSC-Thin” 设置平方细体 ,只在ios上有效
消除字体上下间距:eg:font-size:24rpx;line-height:24rpx;

数据来源

wxml
js——>wxml
服务器——>js——>wxml

数据绑定


“{{}}”插值
属性中同样使用“{{}}”
组件中存储数据有两个地方:properties存储其他外部引用的数据;data里存储组件中单独使用的数据

三元表达式:{{key? ‘yes’:‘no’}}。在双大括号“{{}}”中使用

生命周期函数


onLoad:function(options){ } //监听页面加载
onReady:function(){ } //监听页面初次渲染完成
onShow:function(){ } //监听页面显示
onHide:function(){ } //监听页面隐藏
onUnload:function(){ } //监听页面卸载

组件性的封装性、开放性、粒度:小组件灵活、大组件放方便


封装性:data里存储组件封装的数据供组件内部使用
开放性:properties存储组件开放的数据供其他外部使用;
粒度:组件功能的封装开放性
properties详解:
properties下的属性:对象形式
三个属性:eg:

like:{type:String //类型,必须value: '' //初始值,observer:function(){}
}
<view class="like-box" bindtap="onLike"><image src="{{islike?isimg:notimg}}" class="like-img"></image><text class="like-text">{{count}}</text>
</view> //开放属性:为了可以从外部设置的属性
properties: {islike: { // javascript对象:属性type(属性类型,必填)、value(初始默认值)、observer()type: Boolean,value: false,observer:function(){...}},count: {type: Number,value: 9}
},
//封闭属性:内部属性
data:{isLike:true,yesImg:'/images/yes.png',noImg:'/images/no.png'
} 
//粒度
methods: {onLike:function(event){let islike = this.properties.islikelet count = this.properties.countcount = islike ? count - 1 : count + 1this.setData({count: count,islike: !islike})}}

组件事件应用:

访问properties中的属性:this.properties.islike
methods: {onLike:function(event){       //自定义事件let islike = this.properties.islike //访问properties中的属性let count = this.properties.countcount = islike ? count - 1 : count + 1this.setData({count: count,islike: !islike})}}

js中取data、properties中的数据

this.data.数据属性
this.properties.数据属性

js中改变data、properties中的数据:

data:{like:false
}
this.setData({like:!this.data.like
})

@TOC

url服务器接口地址,必须
data请求的参数
header请求的头部
method请求方式:POST(请求数据)、GET(提交数据)、PUT(更新数据)…
success成功的回调参数
fail失败的回调参数(一般的失败不包括返回失败状态吗之类的错误,而是网络错误等错误)

HTTP状态码


200 请求成功
201 创建成功
202 更新成功
204 删除成功
301 永久重定向
400 请求包含不支持的参数
401 未授权
403 被禁止访问
404 请求的资源不存在
413 上传的file文件体积过大
500 服务器错误

wx:request二次封装

wx.request(object):发起网络http请求
属性参数:
url:'' //开发者服务器接口地址
data:'' //请求的参数
header:'' //设置请求的 header,header 中不能设置 Referer。content-type 默认为 application/json
method:'' //HTTP 请求方法(GET\POST\PUt\DELETE\HEAD\OPTIONS\TRACT\CONNECT)
dataType :'' //返回的数据格式(JSON\其他)
responseType: '' //响应的数据类型
success: //接口调用成功的回调函数
fail : //接口调用失败的回调函数
complete : //接口调用结束的回调函数(调用成功、失败都会执行)
wx.request({url: '', data:'',header:'',method:'',dataType:'',success:
})

a) 根目录下的config.js做一些常量配置
b) http.js请求方法写请求方法,并引用常量配置文件
c) module配置页面请求方法接口模型
d) 页面导入实例化使用

// config.js
const config = {api_base_url: 'http://bl.7yue.pro/v1/',appkey: "AbhC31IG7ruCDp57",
}export { config }
// http.js
import {config} from '../config.js'const tips = {// 自定义错误码提示1: '抱歉,出现了一个错误',1005:'appkey无效,请前往www.7yue.pro申请',3000:'期刊不存在'
}class HTTP{request(params){// url, data, method,if(!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)=>{// 获取http状态码let code = res.statusCode.toString()if (code.startsWith('2')){//请求回调函数,把请求结果通过success回调函数传递回去params.success && params.success(res.data)}else{// 服务器异常调用let error_code = res.data.error_codethis._show_error(error_code)}},fail:(err)=>{this._show_error(1)}})}// 服务器异常方法_show_error(error_code){if(!error_code){error_code = 1}const tip = tips[error_code]wx.showToast({title: tip?tip:tips[1], icon:'none',duration:2000}) }
}export {HTTP}
// module/classic.js
import { HTTP } from '../utils/http.js'
// 继承
class Classic extends HTTP {getLatest(sCallback) {this.request({url: 'classic/latest',method: 'GET',success: (res) => {sCallback(res)}})}
}
export { Classic }
// index.js
import { Classic } from '../../models/classic.js'
let classicModel = new Classic()data: {classicData:null,},onLoad: function (options) {classicModel.getLatest((res)=>{console.log(res)this.setData({classicData:res})})},

export与import

export导出模块
import导入模块
注意事项:(1)import导入的名字必须与export的一样(2)使用 as重命名

全局使用:app.js

App({// 全局数据对象globalData: {isIphoneX: false,isIos: false,screenHeight: 667,screenWidth: 375,windowHeight: 667,windowWidth: 375,rpx: 0.5,user_id: '',open_id: '',},// 应用程序启动时触发一次onLaunch() {//获取系统信息,获取手机型号//screenWidth 、screenHeight(屏幕宽、高)//windowWidth 、windowHeight (可使用窗口宽、高)//windowWidth 、windowHeight (可使用窗口宽、高)// model(型号)// platform (客户端平台)var that = this;wx.getSystemInfo({success(res){that.globalData.screenHeight = res.screenHeight;that.globalData.screenWidth = res.screenWidth;that.globalData.windowHeight = res.windowHeight;that.globalData.windowWidth = res.windowWidth;that.globalData.rpx = Number((res.windowWidth / 750).toFixed(4));if (res.model.search('iPhone X') != -1) {that.globalData.isIphoneX = true}if (res.platform == 'ios') {that.globalData.isIos = true;}}});},// 全局方法,具体的把一些后面页面操作公共数据的公共方法写在这里onHide() {this.data.webShowed = false},setOpenId(open_id) {this.globalData.open_id = open_id;},getOpenId() {return this.globalData.open_id;},setUserId(user_id) {this.globalData.user_id = user_id;},getUserId() {return this.globalData.user_id;}
});

组件的定义与使用

  1. 定义
    a) 组件存储目录:components
    b) 新建组件:新建目录——>新建component
    c) 组件名字两级名字不需要都一样,可以目录外层命名,页面都定义为index
    在这里插入图片描述
  2. 使用
    a) 定义
    组件存储目录:components
    新建组件:新建目录——>新建component
    组件名字两级名字不需要都一样,可以目录外层命名,页面都定义为index
    b) 引用和使用
    组件定义完没有任何突出,只需要在page页面中引用就可以使用了
    引用:首先在要引用组件的页面的.json里,找到“usingComponents”属性,把要引用的组件通过对象键值对配置好就好;组件引用要使用绝对路径(/斜杠表示根目录);“key”:“components/like/index”,key为自定义组件名,为了容易看出是组件,推荐v-开头,eg: “v-like”
    使用:
    c) 从外部设置组件propeties中的属性值:
    把数据从页面js绑定到页面中的组件上
    d) 自定义事件的激活与监听:
    组件上:bind:islike=“onLike”
    js:激活islike事件this.triggerEvent(‘islike’,{behavior: behavior },{});第一个参数是自定义事件名称,第二个是传递的参数,第三个…
    页面自定义事件监听:onLike(e){console.log(e.detail.behavior)} 从中就能取到事件传递的参数
<!--components/like/index.wxml-->
<view class="like-box" bindtap="onLike"><image src="{{islike?isimg:notimg}}" class="like-img"></image><text class="like-text">{{count}}</text>
</view> 
// components/like/index.js
Component({properties: {islike:{type:Boolean,value:false},count:{type:Number,value:9}},data: {isimg:"/images/shouye/islike.png",notimg:"/images/shouye/notlike.png"},methods: {onLike:function(event){//自定义事件let islike = this.properties.islikelet count= this.properties.countcount = islike?count-1:count+1this.setData({count:count,islike:!islike})//激活一个事件 this.triggerEventlet behavior = this.properties.islike?'islike':'notlike'this.triggerEvent('islike',{behavior: behavior},{})}}
})
// index.json
{"usingComponents":{"v-like":"/components/like/index",}
}
// index.wxml使用组件
<v-like like="{{classicData.like_status}}" count="{{classicData.fav_nums}}" bind:islike="onLike" />
 // index.js onLike:function(event){let behavior=event.detail.behaviorlet id = this.data.classicData.idlet types = this.data.classicData.typelikeModel.like(behavior, id,types)},
// module/like.js
import { HTTP } from '../utils/http.js'
class Like extends HTTP {like(behavior,artId,category){let url = behavior == 'islike' ? 'like' :'like/cancel'console.log(behavior, artId, category)this.request({url:url,method:"POST",data:{index:artId,type:category}})}
}
export {Like}
  1. 组件图片的使用: 建议放在comonents下的images里

初始化授权

<button open-type="getUserInfo" bindgetuserinfo="goBegin">开始</button>goBegin: function (e) {console.log(e)if (e.detail.errMsg == 'getUserInfo:ok') {// 授权成功,提交用户信息到后台,重定向到首页}},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyUI,二级页面内容的操作

2019独角兽企业重金招聘Python工程师标准>>> 父页面获取子页面的数据 1.若仅仅是勾选&#xff0c;则将勾选的放到map中(key&#xff0c;value)&#xff0c;key是能验证数据唯一的字段&#xff0c;value就是勾选行的rowData&#xff1b; 再将map转换成json格式的字…

Javascript 对象二(Number、String、Boolean、Array、Date、Math、RegExp)

Javascript 对象二&#xff08;Number、String、Boolean、Array、Date、Math、RegExp&#xff09;Number 数字 对象String 字符串 对象Boolean 布尔 对象Array 数组 对象Date 日期 对象Math 算数 对象RegExp 正则表达式 对象Number 数字 对象 JavaScript中 数字不分为整数类型…

GItHub--Makedown语法学习(快速入门)

段落支持两种标题的语法&#xff1a;Setext 和 atx 形式Setext形式&#xff1a;利用 &#xff08;最高阶标题&#xff09;和 - &#xff08;第二阶标题&#xff09; 标题1标题2 ---Atx 形式&#xff1a;在行首插入 # 即可。可以增加一级标题、二级标题、三级标题、四级标题、…

转:ASP.NET MVC4细嚼慢咽---(5)js css文件合并

原文&#xff1a;http://blog.csdn.net/zx13525079024/article/details/19161777 MVC4增加了一些新功能&#xff0c;接下来&#xff0c;我们来研究下MVC4中的新增功能&#xff0c;我们在新建一个MVC4项目的时候&#xff0c;会发现在项目下多出了一个App_Start文件夹&#xff0c…

[读码时间] 完美拖拽

说明&#xff1a;代码取自网络&#xff0c;注释为原文所有&#xff01; <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title>完美拖拽</title><style type"text/css">html, body {overflow: hidden;}…

Oracle 随机取某一列的值

2019独角兽企业重金招聘Python工程师标准>>> select t.recd_idfrom (select recd_id, ROWNUM RN from RT_TICKETS_BIS_RECD) twhere t.RN (select round(DBMS_RANDOM.VALUE(1, count(1)))from RT_TICKETS_BIS_RECD); 1) select round(DBMS_RANDOM.VALUE(1, count(1…

ZooKeeper典型应用场

为什么80%的码农都做不了架构师&#xff1f;>>> 数据发布与订阅&#xff08;配置中心&#xff09; 发布与订阅模型&#xff0c;即所谓的配置中心&#xff0c;顾名思义就是发布者将数据发布到ZK节点上&#xff0c;供订阅者动态获取数据&#xff0c;实现配置信息的集…

Mysql jdbc driver源码浅析(一)

jdbc操作实例代码 //1. 加载驱动Class.forName("com.mysql.jdbc.Driver");//2. 获取连接Connection connection DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/dbName", "userName", "password");Statement stmt conne…

用rem来做响应式开发

电脑版的商城昨晚做完了&#xff0c;今天赶着做手机端的&#xff0c;提到手机端的网站第一个想到的就是要 适应不同手机屏幕的宽度&#xff0c;保证在不同手机上都能正常显示给用户&#xff0c;我之前做这类网站都是无脑引进bootstrap的。但前一个项目做完之后我发现bootstrap虽…

Java 编程下 Eclipse 如何设置单行代码显示的最大宽度

Eclipse 下一行代码的默认宽度是 80 &#xff0c; 稍长一点的一行代码就会自动换行&#xff0c;代码可读性较差&#xff0c;我们可以自己在 Eclipse 对代码宽度进行设置。 设置路径为&#xff1a;【Window】→【Preferences】→【Java】→【Code Style】→【Formatter】&#x…

基于VMWare配置VxWorks开发环境

常规VxWorks的开发环境都是基于目标开发板或目标机来构建的&#xff0c;但并非所有人都具备这样的条件&#xff0c;所以本文主要介绍如何基于vmware来构建VxWorks开发环境。Step 1. 安装vmware 首先需要安装vmware, 版本没有什么限制&#xff0c;我装的是vmware 8.0&#xff0c…

keepalived实现高可用nginx反向代理的简单案例

写在前面&#xff1a;如果此文有幸被某位朋友看见并发现有错的地方&#xff0c;希望批评指正。如有不明白的地方&#xff0c;愿可一起探讨。案例拓扑图安装keepalived和nginx安装keepalived# yum -y install keepalived创建nginx用户组及nginx用户# groupadd -r nginx # userad…

gulp+PC前端静态页面项目开发

前言&#xff1a; 现在单页面很流行&#xff0c;但是在 PC 端多页面还是常态&#xff0c;所以构建静态页面的工具还有用武之地 gulp构建前言&#xff1a; 如今我们开发web网页的方式主要有几种&#xff0c;使用vue-cli、create-react-app、webpack、不借助构建工具等实现单页…

vue开发问题积累

mounted钩子中使用$refs出现undefined 原因&#xff1a;如果在DOM结构中的某个DOM节点使用了v-if、v-show或者v-for&#xff08;即根据获得的后台数据来动态操作DOM&#xff0c;即响应式&#xff09;&#xff0c;那么这些DOM是不会再mounted阶段找到的。 **解决方法&#xff1…

动态规划0—1背包问题

动态规划0-1背包问题 问题描写叙述&#xff1a;给定n种物品和一背包。物品i的重量是wi&#xff0c;其价值为vi&#xff0c;背包的容量为C。问应怎样选择装入背包的物品&#xff0c;使得装入背包中物品的总价值最大?对于一种物品&#xff0c;要么装入背包&#xff0c;要么不装。…

vmstat命令详解

参数详情&#xff1a; r runingb blockswpd 虚拟内存使用时间free 物理free内存buff 从硬盘--->内存的 缓冲cache 从内存--->硬盘的 缓存si 从磁盘写入swap的大小/sso 从swap写入磁盘的大小/sbi 块设备每秒接收的块数量bo 块设备每秒发送的块数量cs 每秒上下文切换次数us…

CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)...

策略模式(Strategy Pattern)&#xff1a;定义一系列算法类&#xff0c;将每一个算法封装起来&#xff0c;并让它们可以相互替换&#xff0c;策略模式让算法独立于使用它的客户而变化&#xff0c;也称为政策模式(Policy)。 模式角色与结构&#xff1a; 示例代码&#xff1a; usi…

评论 展开|收起

场景&#xff1a; 列表中文本最多三行&#xff0c;超出部分省略&#xff0c;并显示展开收起按钮&#xff0c;如果文本没有超出三行则不显示展开收起按钮 方案&#xff1a; 1&#xff09;在div 中添加一个span 然后给div设置超出三行省略&#xff0c;这时候就可以获取到文本高…

引用类型赋值

转载于:https://www.cnblogs.com/dongyuhan/p/6519711.html

Windows Phone开发(30):图形 转:http://blog.csdn.net/tcjiaan/article/details/7453028

图形如矩形、椭圆、路径等都从Shape类派生&#xff0c;它们一般表示规则或不规则图形&#xff0c;这些图形都是简单的二维图形&#xff0c;我相信大家都能理解的。 例一&#xff1a;矩形。 请看下面的XAML代码。 [html] view plaincopyprint? <Rectangle RadiusX"20&q…