小程序(二)

三、发起请求

1. scroll-view

可滚动视图区域。使用竖向滚动时,需要给scroll-view一个固定高度,通过 WXSS 设置 height。组件属性的长度单位默认为px,2.4.0起支持传入单位(rpx/px)。

scroll-x:允许横向滚动。

scroll-y:允许纵向滚动。

<!-- 导入wxs文件 --><wxssrc="../../wxs/filter.wxs"module="filter"/><viewclass="container"><scroll-viewscroll-yclass="left"><viewclass="item {{activeIndex===index?'active':''}}"wx:for="{{typeList}}"wx:key="index"bindtap="clickType"data-index="{{index}}"data-id="{{item.Id}}">{{item.Name}}</view></scroll-view><scroll-viewscroll-yclass="right"><viewclass="data"wx:for="{{dataList}}"wx:key="index"><viewclass="title">{{item.Title}}</view><viewclass="flex j-s a-c"style="padding:4px0;color:#333333"><view>{{item.Section.Name}}</view><view>{{filter.formatTime(item.Createtime)}}</view></view></view></scroll-view></view>

2. 发起请求

//显示Loadingwx.showLoading({title:'加载中',})//wx对象发送ajax请求的方法wx.request({method:'GET',url:'https://bingjs.com:8002/Subject/GetSubjects',data:{section_id:id},//成功后的回调success:({data})=>{//将获取到数据数据赋值给对应的数组,并更新到页面this.setData({dataList:data})},//完成后的回调complete:()=>{//关闭Loadingwx.hideLoading()}})

3. 封装方法

添加config配置

//导出请求地址根路径exportconstBASE_URL='https://bingjs.com:8002'

添加utils/request.js文件

//导入请求地址根路径import{BASE_URL}from'../config/const'//ajax请求的方法exportlet$request=function(method,url,data){returnnewPromise((resolve,reject)=>{//显示Loadingwx.showLoading({title:'加载中',})//wx对象发送ajax请求的方法wx.request({method,url:BASE_URL+url,data,//成功后的回调success:({data})=>{resolve(data)},//失败后的回调fail:(err)=>{reject(err)},//完成后的回调complete:()=>{//关闭Loadingwx.hideLoading()}})})}//get-ajax请求的方法exportlet$get=function(url,data){return$request('GET',url,data)}//post-ajax请求的方法exportlet$post=function(url,data){return$request('POST',url,data)}wx.$request=$requestwx.$get=$getwx.$post=$post

添加utils/index.js文件

import'./util'import'./request'import'./msg'

在app.js文件中

import'./utils/index'

4. wxs

新建filter.wxs文件,用于格式化时间

//定义一个格式化时间戳的方法functionformatTime(val){varnow=getDate()//获取当前时间//根据时间戳返回一个时间对象vardate=getDate(parseInt(val))varsec=parseInt((now-date)/1000/60)//返回两日期相差分钟if(sec<=5){return'刚刚'}elseif(sec<=60){returnsec+'分钟前'}elseif(sec<=60*24){returnparseInt(sec/60)+'小时前'}//超过一天,显示具体的日期varyear=date.getFullYear()varmonth=date.getMonth()+1varday=date.getDate()varhour=date.getHours()varminute=date.getMinutes()varsecond=date.getSeconds()//拼接时间并返回return[year,month,day].map(formatNumber).join('/')+' '+[hour,minute,second].map(formatNumber).join(':')}

//补0方法functionformatNumber(n){n=n.toString()returnn[1]?n:'0'+n}//导出该方法module.exports={formatTime:formatTime};


四、上拉下拉页面

1. 页面

<!-- 导入wxs文件 --><wxssrc="../../wxs/filter.wxs"module="filter"/><viewclass="container"><navigatorurl="../details/details?id={{item.Id}}"class="data"wx:for="{{dataList}}"wx:key="index"><viewclass="title">{{item.Title}}</view><viewclass="flex j-s a-c desc"><view>{{item.Section.Name}}</view><view>{{filter.formatTime(item.Createtime)}}</view></view></navigator></view><viewbindtap="click"class="btn_add">+</view>

2. 获取数据的方法

//获取数据信息的方法asyncgetDataList(){//参数pageSize是每页显示数量,pageIndex是页码letdataList=awaitwx.$get('/Subject/GetSubjects',{pageSize:15,pageIndex:this.data.pageIndex})//判断如果是首页,清空之前数组中的数据if(this.data.pageIndex===1)this.data.dataList=[]//判断本次查询,是否获取到了数据if(!dataList||dataList.length===0)returnwx.$msg('没有更多')//更新数组数据this.setData({//用之前数组里面保存的数据去拼接最新的数据dataList:this.data.dataList.concat(dataList)})}

3. 下拉刷新

.json文件中设置允许下拉刷新

"enablePullDownRefresh": true

onPullDownRefresh:function(){//当前页回到首页this.data.pageIndex=1//重新调用加载数据的方法this.getDataList()//1秒钟,关闭下拉刷新setTimeout(()=>{wx.stopPullDownRefresh()},1000);}

4. 上拉触底

onReachBottom:function(){//当前页码加1this.data.pageIndex++//重新调用加载数据的方法this.getDataList()}

5. 添加页面

<viewclass="content"><viewclass="item flex"><label>题目:</label><!-- 通过model:value的方式,将表单里面的数据跟js里面的数据进行了双向绑定,

    双向绑定指的是:一处被修改,另一处也一起修改--><inputclass="txt"placeholder="请输入题目"model:value="{{title}}"/></view><viewclass="item flex"><label>答案:</label><textareaclass="txt"placeholder="请输入答案"style="height:100rpx"model:value="{{answer}}"></textarea></view><viewclass="item flex"><label>分类:</label><inputdisabledbindtap="gotoTypeList"class="txt"placeholder="请选择分类"model:value="{{section_name}}"/></view><viewclass="item flex"><label>解析:</label><textareaclass="txt"placeholder="请输入解析"style="height:100rpx"model:value="{{desc}}"></textarea></view><viewclass="item flex"><buttonbindtap="click">添加</button></view></view>

6. 添加方法

//添加按钮点击事件asyncclick(){//非空验证if(!this.data.title||!this.data.section_id||!this.data.answer)returnwx.$msg('请输入完整信息!')//请求后台,添加题目信息letres=awaitwx.$post('/Subject/AddSubject',{title:this.data.title,answer:this.data.answer,desc:this.data.desc,section_id:this.data.section_id})if(res){wx.$msg('添加成功!')this.clear()//清空数据}}

7. 分类页面

<viewclass="flex"><view><buttonbindtap="click"data-id="{{item.Id}}"data-name="{{item.Name}}"class="item"wx:for="{{typeList}}"wx:key="index">{{item.Name}}</button></view></view>

8. 获取分类数据

//获取分类信息的方法asyncgetTypeList(){lettypeList=awaitwx.$get('/Section/GetSections')this.setData({typeList})}

9. 返回分类数据

click(e){//获取按钮传过的参数let{id,name}=wx.$key(e)//获取当前页面栈。数组中第一个元素为首页,最后一个元素为当前页面。letpages=getCurrentPages()//获取上一个页面letprev_page=pages[pages.length-2]//设置上一个页面中的分类id和分类名称prev_page.setData({section_id:id,section_name:name})//返回前一个页面wx.navigateBack()}

10. 获取url参数

onLoad:function(options){if(Object.keys(options).length>0){let{id,name}=optionsthis.setData({section_id:id,section_name:name})}}

11. 显示详情

<viewclass="content"><viewclass="title">{{data.Title}}</view><viewclass="hr">答案:</view><viewclass="answer">{{data.Answer}}</view><viewclass="hr">解析:</view><viewclass="desc">{{data.Desc}}</view></view>

onLoad:function(options){if(Object.keys(options).length>0){this.data.id=options.id}//调用获取数据的方法this.getData()},//获取数据的方法asyncgetData(){//根据题目的id,获取题目信息letdata=awaitwx.$get('/Subject/GetSubject',{id:this.data.id})this.setData({data})}

五、Vant组件库

1. 下载Vant Weapp

步骤一:通过 npm 安装

npm i @vant/weapp -S --production

步骤二:修改 app.json

将 app.json 中的 "style": "v2" 去除,小程序的新版基础组件强行加上了许多样式,难以覆盖,不关闭将造成部分组件样式混乱。

步骤三:修改 project.config.json

开发者工具创建的项目,miniprogramRoot 默认为 miniprogram,package.json 在其外部,npm 构建无法正常工作。

需要手动在 project.config.json 内添加如下配置,使开发者工具可以正确索引到 npm 依赖的位置。

"setting":{..."packNpmManually":true,"packNpmRelationList":[{"packageJsonPath":"./package.json","miniprogramNpmDistDir":"./miniprogram/"}]}

注意: 由于目前新版开发者工具创建的小程序目录文件结构问题,npm构建的文件目录为miniprogram_npm,并且开发工具会默认在当前目录下创建miniprogram_npm的文件名,所以新版本的miniprogramNpmDistDir配置为'./'即可。

步骤四:构建 npm 包

点击工具-->构建npm

并勾选本地设置-->使用npm模块选项

在.json文件中配置使用的组件,可以在全局中配置,也可以在单独页面中配置。

"usingComponents":{"van-field":"@vant/weapp/field/index","van-picker":"@vant/weapp/picker/index","van-popup":"@vant/weapp/popup/index","van-button":"@vant/weapp/button/index","van-divider":"@vant/weapp/divider/index","van-empty":"@vant/weapp/empty/index","van-search":"@vant/weapp/search/index"}

2. 列表页添加搜索功能

<!-- 导入wxs文件 --><wxssrc="../../wxs/filter.wxs"module="filter"/><viewclass="container"><van-searchmodel:value="{{ title }}"placeholder="请输入搜索关键词"bind:search="onSearch"bind:clear="onClear"/><navigatorurl="../vantdetails/vantdetails?id={{item.Id}}"class="data"wx:for="{{dataList}}"wx:key="index"><viewclass="title">{{item.Title}}</view><viewclass="flex j-s a-c desc"><view>{{item.Section.Name}}</view><view>{{filter.formatTime(item.Createtime)}}</view></view></navigator></view><viewbindtap="click"class="btn_add">+</view>

//搜索框的搜索方法onSearch(){this.data.pageIndex=1//页码重新设置为1this.getDataList()//调用获取数据的方法},//搜索框的清空方法onClear(){//清空titlethis.setData({title:''})this.data.pageIndex=1//页码重新设置为1this.getDataList()//调用获取数据的方法}

3. 重构添加页面

<viewclass="content"><viewclass="item"><van-fieldlabel="题目"title-width="80rpx"model:value="{{ title }}"placeholder="请输入题目"required/></view><viewclass="item"><van-fieldlabel="答案"title-width="80rpx"type="textarea"autosizecustom-style="height:150rpx"model:value="{{ answer }}"placeholder="请输入答案"required/></view><viewclass="item"><van-fieldlabel="分类"title-width="80rpx"readonlymodel:value="{{ section_name }}"placeholder="请选择分类"bindtap="showPopup"required/></view><viewclass="item"><van-fieldlabel="解析"title-width="80rpx"type="textarea"autosizecustom-style="height:150rpx"model:value="{{ desc }}"placeholder="请输入答案"/></view><viewclass="item flex j-c"><van-buttonloading="{{loading}}"loading-text="添加中..."type="primary"blockroundicon="plus"bindtap="click">添加题目</van-button></view></view><van-popupposition="bottom"show="{{ show }}"bind:close="onClose"><van-pickershow-toolbartitle="请选择分类"value-key="Name"columns="{{ typeList }}"bind:cancel="onClose"bind:confirm="onConfirm"/></van-popup>

//获取分类信息的方法asyncgetTypeList(){lettypeList=awaitwx.$get('/Section/GetSections')this.setData({typeList})},//显示弹出层方法showPopup(){this.setData({show:true});},//关闭弹出层方法onClose(){this.setData({show:false});},//选择器确定方法onConfirm(event){const{value}=event.detail;//设置分类编号和分类名称this.setData({section_id:value.Id,section_name:value.Name,show:false})},//添加按钮点击事件asyncclick(){//非空验证if(!this.data.title||!this.data.section_id||!this.data.answer)returnwx.$msg('请输入完整信息!')//请求后台,添加题目信息this.setData({loading:true})letres=awaitwx.$post('/Subject/AddSubject',{title:this.data.title,answer:this.data.answer,desc:this.data.desc,section_id:this.data.section_id})if(res){wx.$msg('添加成功!')this.setData({loading:false})this.clear()//清空数据}},//清空方法clear(){this.setData({title:'',answer:'',desc:'',section_id:0,section_name:''})}

4. 重构详情页

<viewclass="content"wx:if="{{data}}"><viewclass="title">{{data.Title}}</view><van-dividerfontSize="15"contentPosition="left"textColor="#248067"borderColor="#248067">答案</van-divider><viewclass="answer">{{data.Answer}}</view><van-dividerfontSize="15"contentPosition="left"textColor="#248067"borderColor="#248067">解析</van-divider><viewclass="desc">{{data.Desc}}</view></view><van-emptywx:elsedescription="暂无数据"/>

onLoad:function(options){if(Object.keys(options).length>0){this.data.id=options.id}//调用获取数据的方法this.getData()},//获取数据的方法asyncgetData(){//根据题目的id,获取题目信息letdata=awaitwx.$get('/Subject/GetSubject',{id:this.data.id})this.setData({data})},onPullDownRefresh:function(){//重新获取详情信息//调用获取数据的方法this.getData()//1秒后关闭下拉刷新setTimeout(()=>{wx.stopPullDownRefresh()},1000);}

六、自定义组件1

1. tabMenu组件

<viewclass="flex item">

<viewclass="title">{{label}}</view><viewdata-active="{{index}}"bindtap="change"class="tab {{active===index?'active':''}}"wx:key="index"wx:for="{{list}}">{{item}}</view>

</view>

/* 注意:组件中默认不会引入全局样式,如果要用全局样式,需要手动引入 */@import'../../app.wxss';.item{margin:10rpx0;}.title{padding:10rpx20rpx;color:#248067;}.tab{padding:10rpx20rpx;border:1pxsolid#eeeeee;margin:02px;}.tab.active{background:#248067;color:#ffffff;}

/**

  * 组件的属性列表:用于接收调用组件的页面传过来的数据

  */properties:{//添加组件的属性//该属性接收需要呈现的数据list:{//类型是数组,表示只能给该属性传数组值type:Array},//该属性接收高亮索引active:{//该属性是数字类型type:Number,//该属性的默认值0value:0},//该属性接收标题信息label:{type:String,value:'选项'}},/**

  * 组件的方法列表:组件的方法,必须要放在这里定义

  */methods:{change(e){let{active}=wx.$key(e)this.setData({active})

//组件内部触发一个事件//组件外部通过执行该事件,通过事件方法,获取传出来的数据// this.triggerEvent("change",{active,label:this.data.label})this.triggerEvent("change",active)},}

2. counter组件

<viewclass="flex a-c item"><viewclass="title">{{label}}</view><viewclass="jian"bindtap="jian">-</view><viewclass="count">{{count}}</view><viewclass="jia"bindtap="jia">+</view></view>

@import'../../app.wxss';.item{margin:10rpx0;}.title{padding:5rpx10rpx;}.jian,.jia{width:50rpx;height:50rpx;text-align:center;line-height:50rpx;border:1pxsolid#eeeeee;background:#248067;color:#ffffff;}.count{width:50rpx;height:50rpx;text-align:center;padding:010rpx;}

/**

  * 组件的属性列表

  */properties:{//标题label:{type:String},//初始值count:{type:Number,value:1},//最小值min:{type:Number,value:1},//最大值max:{type:Number,value:99999}},

/**

  * 组件的方法列表

  */methods:{//减方法jian(){letcount=this.data.count-1if(count<this.data.min){count=this.data.minwx.$msg('不能更少了',1000,'none')}this.setData({count})//触发事件this.triggerEvent('change',count)},//加方法jia(){letcount=this.data.count+1if(count>this.data.max){count=this.data.maxwx.$msg('不能更多了',1000,'none')}this.setData({count})//触发事件this.triggerEvent('change',count)}}

3. 页面中使用

"usingComponents":{"tabMenu":"../../components/tabMenu/tabMenu","counter":"../../components/counter/counter"},

<viewclass="content">{{wd}}-{{tf}}-{{pl}}<tabMenudata-key="wd"label="温度"list="{{wdList}}"active="{{wd}}"bind:change="syncData"></tabMenu><tabMenudata-key="tf"label="糖分"list="{{tfList}}"active="{{tf}}"bind:change="syncData"></tabMenu><tabMenudata-key="pl"label="配料"list="{{plList}}"active="{{pl}}"bind:change="syncData"></tabMenu><viewclass="line"></view>{{yfcount}}-{{kzcount}}-{{xzcount}}<counterdata-key="yfcount"label="衣服:"count="{{yfcount}}"min="{{1}}"max="{{10}}"bind:change="syncData"></counter><counterdata-key="kzcount"label="裤子:"count="{{kzcount}}"min="{{3}}"max="{{12}}"bind:change="syncData"></counter><counterdata-key="xzcount"label="鞋子:"count="{{xzcount}}"min="{{0}}"max="{{8}}"bind:change="syncData"></counter></view>

//切换高亮syncData(e){let{key}=wx.$key(e)this.setData({[key]:e.detail})},/**

  * 页面的初始数据

  */data:{wdList:['常温','去冰','少冰','热饮'],wd:0,tfList:['全糖','半糖','少糖','无糖'],tf:0,plList:['珍珠','椰果','布丁','红豆'],pl:0,yfcount:2,kzcount:3,xzcount:5},

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容

  • 微信小程序 一、创建项目 1、准备工作 微信公众平台注册开发者账号:https://mp.weixin.qq.co...
    名字真难取啊阅读 398评论 0 0
  • 一、创建项目 1、准备工作 微信公众平台注册开发者账号:https://mp.weixin.qq.com/[htt...
    一个想读书的人阅读 1,123评论 0 1
  • 微信小程序 一、创建项目 1、准备工作 微信公众平台注册开发者账号:https://mp.weixin.qq.co...
    元肖阅读 407评论 0 2
  • 之前项目有了需求就是列表右滑出现功能栏,类似QQ有右滑删除效果 话不多说,上代码 <viewclass="cont...
    南墙倒阅读 361评论 0 1
  • 当页面配置和全局配置冲突时,优先级最高的就是页面配置。app.wxss全局样式文件里面定义的选择器,在所有的页面中...
    混的一笔阅读 526评论 0 1