[解读小程序]菜谱查询+手机号吉凶查询Demo(一)
分析的程序来源:
http://blog.csdn.net/y1258429182/article/details/52666290
还是该作者的demo, 再次感谢.
github地址: https://github.com/StudyLifeTime/Eater-APP
因为是同一个作者的demo,有部分相同或者类似的功能将不再讲解.
预览效果图
>image>
view>
image组件有三种缩放模式: scaleToFill(不保持宽高比,拉伸填满image),aspectFill(保持宽高比,只保证短边完全显示,长边会被裁剪),aspectFit(保持宽高比,图片全部显示)
这里引用了两个样式container和img_splash. 样式的定义在splash.wxss中.
.container{
flex: 1;
}
.img_splash{
width: 100%;
height: 100%;
}
这里的弹性盒子的flex属性和Android中的weight有些类似.
所有含有flex的项加起来,假如值是y,自己flex的值是x,则宽度占总数的比例为x/y.
flex 是 flex-grow、flex-shrink、flex-basis的缩写.
这里定义的.container类选择器会和在app.wxss中定义的.container的属性组合起来共同控制元素的样式, 如果是同名的属性, 那么将会app.wxss中的将会被覆盖.
.container {
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
padding: 200rpx 0;
box-sizing: border-box;
}
splash.js
和之前的查询手机归属地一样, 就是创建动画, 执行动画等. 只不过这里初始大小只有原图的1/4. 1000ms之后再恢复原图大小.
var animation = wx.createAnimation( {
duration: 1000,
timingFunction: 'ease-in-out',
transformOrigin: "0% 100%",
})
animation.scale( 0.5, 0.5).opacity(1).step()
this.setData( {
animationData: animation.export(),
})
setTimeout( function() {
animation.scale(1,1).step()
this.setData( {
animationData: animation.export(),
})
}.bind( this ), 1000 )
登录页 login
登录逻辑和之前的一模一样, 不再赘述.
查吉凶页 index
index.wxml
<view class="container">
<view class="userinfo">
<text class="query_result_tips">{{result_tips}}text>
<text class="query_result">{{query_result}}text>
<input class="ipt_phone" placeholder="请输入查询的手机号" bindinput="bindKeyInput" />
<button class="btnQueryPhone" type="primary" bindtap="btnPhone">手机号查吉凶button>
<loading hidden="{{!loading}}">loading>
view>
view>
tips提示, 查询结果result的显示都采用了数据绑定.
这里引入了一个新的组件loading加载提示. 文档-加载提示
loading和toast的用法非常类似. 只是toast可以设置duration, 而loading没有. 也是采用数据绑定的方式控制显示和隐藏.
index.js
const app = getApp()
const APIURL = "http://apicloud.mob.com/appstore/lucky/mobile/query?key=17113fceca309&mobile="
var page = {
data: {
result_tips: '',
query_result: '无心插柳柳成荫,命中须有莫须有',
inputValue: "",
loading: false,
},
//查询手机归属地的方法
btnPhone: function() {
console.log( this.data.inputValue )
//调用网络请求
app.httpClient( APIURL + this.data.inputValue, (error, data) => {
// if(!data.result.value) return
console.log( data.result.conclusion)
this.setData({loading:true})
if(data.retCode == 200) {
this.setData( {
result_tips:'查询结果为如下: ',
query_result:data.result.conclusion,
loading:false
})
}
})
},
//输入绑定的方法
bindKeyInput: function( e ) {
this.setData( {
inputValue: e.detail.value
})
},
}
Page(page)
这里要说一下(error, data) =>{ //...}
这是ES6语法中的arrow function. 展开来就是
function(error,data){
//...
}
这种形式和Java8引入的lambda表示式的写法很像.
前面写到在app.js中的回调
callback(null, res.data);
callback(error);
调用的都是该方法.
(error, data) => {
// if(!data.result.value) return
this.setData({loading:true})
if(data.retCode == 200) {
this.setData( {
result_tips:'查询结果为如下: ',
query_result:data.result.conclusion,
loading:false
})
}
}
作者说这是对网络请求的优化, 我并没有觉得. 并且网络请求的loading对话框, 不应该如此控制. 当然对于小程序来说, 我还是newbie. 仅保持怀疑的态度, 努力学习.
剩下菜谱查询的部分. to be continued …