先放个程序员的老婆

诸君,拔剑吧

言归正传

接触了小程序,发现还是挺有意思的,学习过程中也写写项目,那这次呢就写了一个拉勾小程序
来聊一聊踩到的坑,以及如何跳出坑,说不定对你有些帮助,来看看

准备工作

编辑器 : visual studio code 和 微信开发者公工具
数据来源 : 那当然是用easy-mock随便瞎编的数据啦

那就来聊聊写了些什么吧

首先看看界面吧

来一起爬坑和实现某些功能吧

  • 界面的坑
  • 如何跳转详情页
  • 搜索
  • 历史搜索记录数据的保存
  • 历史记录搜索
  • 猜你喜欢

1. 界面的坑

这个坑真是不踩不知道,点击搜索框跳转进搜索界面,那么点击取消返回直接使用navigateTo 跳转界面? no no no ,navigate不能跳 转到tabbar界面,这里我使用的是navigateBack

wx.navigateBack({delta:1
})
delta返回的页面数,如果 delta 大于现有页面数,则返回到首页。

当然还有switchTab等方法,详细可以参考小程序开发指南


小提示:其次界面上除非特定的位置,否则尽量避免使用position进行定位,毕竟段落或长或短,
使用position可能就会出现文字覆盖文字的情况

2. 再来说说如何跳转详情页

先来看看效果图(电脑反应有点迟钝,有些界面需要等待才加载完,哭唧唧)

那么是怎么实现的呢?首先来看看代码吧 ,毕竟是灵魂

index.wxml<view class="post-recommend-list" wx:for="{{job}}" wx:key="index" bindtap="navigateTap" data-index="{{index}}"><image mode="aspectFill" class="recommend-detail_image" src="{{item.image}}"></image>                  <text class="list_job">{{item.job}}</text><text class="list_money">{{item.money}}</text><text class="list_company">{{item.company}}</text><text class="list_address">{{item.address}}</text><text class="list_exp">{{item.exp}}</text><text class="list_education">{{item.education}}</text><text class="list_date">{{item.date}}</text>
</view>index.js
首先请求easymock中的假数据
onReady:function(){
wx.request({url:'https://www.easy-mock.com/mock/5b15fb5b9ab69517fa2acb43/lagou/lagou#!method=get',success:(res)=>{this.setData({job:res.data.data.jobs});}
})
},实现跳转详情页代码
navigateTap:function(e){
var index=e.currentTarget.dataset.index;
var detail=this.data.job[index];
app.globalData.detail=detail;
console.log(app.globalData.detail)
this.setData({detail:detail
})
// console.log(de)
wx.navigateTo({url: '../detail/detail',
})
}

那么就来解读下吧
设计原理是将每个index上的view设定一个bindtap事件,当点击view时触发,同时获取触发事件,将事件发生
时获取到的信息存储到app.js中。
首先在index.js中引入app.js ,
const app = getApp()
在app.js中设置一个空数组detail:[],用detail:[]来存储所获取到的信息

  globalData: {detail:[],details:[],userInfo: null}

接下来说说这触发时发生了什么

  var index=e.currentTarget.dataset.index;<view class="post-recommend-list" wx:for="{{job}}" wx:key="index" bindtap="navigateTap"     data-index="{{index}}">

设定data-index="{{index}"就是去获取currentTarget的下标,获取到下标之后将获取到的信息存储在某个数组中

var detail=this.data.job[index];

app的detail:[]再去获取触发事件时得到的数组

app.globalData.detail=detail;

然后后setData一下,
最后detail.js文件下获取下数据就OK了
onReady: function () {

this.setData({jobb:app.globalData.detail
})
},

3. 搜索

先来看看效果图

实现了搜索工作种类、工作地点、公司名称、在无输入下进行提示、搜索不到信息的提示
那就再来先看看代码吧

search.wxml<view class="search-top-input"><input type="text" placeholder="搜索公司/职位" auto-focus="true" value="{{inputsearch}}" bindconfirm="search"bindinput="inputSearchTap"data-index="{{index}}"/>
</view>search.jsdata: {inputsearch:'',
job:[],
newSearch:[],
},inputSearchTap:function(e){let inputsearch =e.detail.value;this.setData({inputsearch})},search:function(e){
var sear =this.data.inputsearch;
var jobs=this.data.job;
var input = new RegExp(sear);
var temp = [];
if(sear == ''){wx.showToast({title: '请输入要搜索信息',icon:"none",duration: 1000});return false;
}for(let i =0;i<jobs.length;i++){if(input.test(jobs[i].job) || input.test(jobs[i].company) || input.test(jobs[i].address){temp.push(jobs[i]);var detail=temp;app.globalData.details=detail;}} if(temp ==''){wx.showToast({title: '暂无此信息',icon:"none",duration: 1000});}else if(temp){wx.navigateTo({url:'../about/about'})}
}
this.setData({newSearch:temp,
})

}

定义一个sear去获取input输入框中的值,

var sear =this.data.inputsearch;

再使用正则去匹配输入的值,详情请看RegExp

var input = new RegExp(sear);

定义空数组temp

 var temp = [];

如果输入的是空,弹窗提示

if(sear == ''){wx.showToast({title: '请输入要搜索信息',icon:"none",duration: 1000});return false;
}

如果输入了值,则进行匹配,将匹配到的信息存放在app.js中的details[]中

    for(let i =0;i<jobs.length;i++){if(input.test(jobs[i].job) || input.test(jobs[i].company) || input.test(jobs[i].address){temp.push(jobs[i]);var detail=temp;app.globalData.details=detail;}} 

如果没查询到则提示

if(temp ==''){wx.showToast({title: '暂无此信息',icon:"none",duration: 1000});

查询到则跳转

else if(temp){wx.navigateTo({url:'../about/about'})}

这样就实现了搜索功能了,bindconfirm在input组件中可实现手机软键盘中的回车事件,详情看小程序开发指南小程序开发指南

4. 再说说历史搜索

历史搜索是个很方便用户的体验,在需要用到搜索的地方必不可少了,所以怎么去实现呢?
代码部分

    search.wxml<view class="search-history" wx:if="{{status}}"><view class="search-history-title"><text>历史搜索</text><image src="../../images/delete.png" bindtap="deleteHistory"></image></view><view class="search-history-detail" ><view class="history-detail" wx:for="{{history}}" wx:key="{{item}}" bindtap="historySearch" data-index="{{index}}"><text class="detail" >{{item}}</text></view></view></view>search.jssearch:function(e){
var that =this;
var sear =this.data.inputsearch;
var jobs=this.data.job;
var input = new RegExp(sear);
var temp = [];
if(sear == ''){wx.showToast({title: '请输入要搜索信息',icon:"none",duration: 1000});return false;
}else{this.data.history.unshift(sear);
wx.setStorage({key: 'history',data: that.data.history,success: function(res){// successthat.setData({history:that.data.history,status:true})console.log(res.data);},
})for(let i =0;i<jobs.length;i++){if(input.test(jobs[i].job) || input.test(jobs[i].company) || input.test(jobs[i].address)){temp.push(jobs[i]);var detail=temp;app.globalData.details=detail;}} if(temp ==''){wx.showToast({title: '暂无此信息',icon:"none",duration: 1000});}else if(temp){wx.navigateTo({url:'../about/about'})}
}
this.setData({newSearch:temp,
})

},
那么怎么将搜索记录保存在本地呢?
这里使用了小程序的本地保存数Storage,这样每次登陆就可以保存有上次登陆搜索过的历史记录了
小程序开发手册中的介绍小程序指南中的Storage,
看了指南如何用setStorage去存储数据,但是发现每次存储之后会将上一次的key值的数据覆盖掉,那么怎么办呢?
有了,可以去定义一个空数组去存储setStorage中的值吗?
好的,那么怎么去获取呢?再定义一个空数组去获取吗?最后再将第二个数组push进去吗?
显然不行,当定义了两个数组时你会发现多次搜索后存储在key中的值就会是这样的

Array(2)0:{0:"前端",1:"java"}1:"深圳"length:2

后续搜索的历史记录都存到Array[0]中了
而实际上历史记录上需要展示的搜索记录数组的存储是这样的

    Array(2)0:"前端",1:"java"  2:"深圳"length:3

那么怎么在setStorage和getStorage中去实现不被覆盖而又能不存储到Array[0]中?
首先去获取storage中key:"history"的数据,将获取到的值直接返回给history,而不是返回给另外一个数组,这样history就获取到了本地缓存的数据

onLoad: function (options) {
var that =this;
wx.getStorage({key: 'history',success: function(res){// successthat.setData({history:res.data,// sear_his:res.data})if(that.data.history.length==0){that.setData({status:false});}else{that.setData({status:true})}},fail: function(res) {// failconsole.log(res+'aaaaa')}
});

},
使用setStorage api放到search中,将key值设置为history,当sear输入时进行判断,如果为空值则不进行存储,不是空值则使用unshift将输入的搜索值添加到history数组中的第一项,这样就不会被覆盖了,解决了value被覆盖的问题

if(sear == ''){wx.showToast({title: '请输入要搜索信息',icon:"none",duration: 1000});return false;
}else{this.data.history.unshift(sear);
wx.setStorage({key: 'history',data: that.data.history,success: function(res){// successthat.setData({history:that.data.history,status:true})console.log(res.data);},

历史记录的删除

当然是将本地缓存删除啦

实现代码deleteHistory(){
var that=this;
const status=this.data.status;
wx.showModal({content:'确定删除全部搜索历史?',confirmText:'全部删除',success:function(res){if(res.confirm){ wx.removeStorage({key: 'history',success: function(r){that.setData({status:false,history:[]})},})console.log(status);}else if(res.cancel){that.setData({status:true})} }
})
},

猜你喜欢


实现代码

  likeSearch(e){
var index=e.currentTarget.dataset.index;
var detail=this.data.like[index];
var input = new RegExp(detail);
console.log(detail);
var temp = [];
var jobs=this.data.job;
for(let i =0;i<jobs.length;i++){
if(input.test(jobs[i].job) || input.test(jobs[i].company) || input.test(jobs[i].address)){temp.push(jobs[i]);var details=temp;app.globalData.details=details;}
}if(temp ==''){wx.showToast({title: '暂无此信息',icon:"none",duration: 1000});}else if(temp){wx.navigateTo({url:'../about/about'})
}

},

最后

感谢看完文章,小程序之路是一条坎坷的路,虽然路上有许多磕绊,但最后是有所斩获的。
成功是多么美妙的一件事。
互联网日新月异,需要你我共同努力,相互分享,
如果你觉得文章还OK
那么请点个赞吧

博客地址使劲点这
获取源码请点击github
谢谢你的Star

湖人总冠军

打开小程序之门,“拉勾”之约相关推荐

  1. 基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计)

    基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计) 文章目录 基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计) 一.低功耗蓝牙(BLE)的配置和与FPGA通信代码 1.1 低功耗蓝牙的介 ...

  2. 侧边栏跳转_微信和三星首次系统级合作:在负一屏和侧边栏直接打开小程序

    通常,我们把在手机上按下 Home 键返回的桌面算作「首屏」,首屏再向右滑则被称为「负一屏」.现在,手机「负一屏」已经是集成智能助手.全局搜索.系统应用和应用快捷方式(如苹果的 Widget)的重要入 ...

  3. Android开发之APP唤醒小程序,打开小程序,调起小程序以及传参数的实现方法(附加源码)

    老套路咱们先看效果图: 可以先看下官方文档介绍:微信官方文档APP打开小程序链接 我这边打开了,上面奔溃是因为模拟器不兼容的原因: 主要讲解下打开小程序核心代码: // 填应用AppIdString ...

  4. App打开小程序,小程序打开App

    App打开小程序(Android) 需要以下小程序和app的信息: 应用的AppID,小程序的AppID,小程序的原始ID 第一步:App所在开放平台关联要跳转的小程序 管理中心->移动应用-& ...

  5. vue uniapp 微信小程序 搜索下拉框 模糊搜索

    vue uniapp 微信小程序 搜索下拉框 模糊搜索 话不多说 直接贴代码 template <template><view class="index"> ...

  6. 微信网页开发:微信内h5使用wx-open-launch-weapp打开小程序,微信内h5使用wx-open-launch-app打开App的方案

    需求场景: 当我们需要使用在微信客户端打开的h5页面,在页面上打开微信小程序或者唤起App时,我们需要使用微信js-sdk提供的开放标签能力.这其中:使用wx-open-launch-weapp标签打 ...

  7. 小程序 小程序中打开其他小程序、小程序跳转其他小程序、微信群聊中打开小程序

    1.小程序中打开其他小程序可将要打开的小程序通过半屏的形态快速拉起(1)配置app.json的embeddedAppIdList字段中声明需要通过半屏形态打开的小程序,若不配置将降级为普通的小程序跳转 ...

  8. 飞鹅小票打印机嵌入生成指定小程序页面二维码的解决方案 | 扫普通链接二维码打开小程序示例 | 生成正方形小程序码

    部分朋友不需要打印机的业务,则 忽略有关打印机的部分 即可. 其他有关 微信小程序配置的介绍是通用的!通用的! 生成正方形小程序码,请看 标题一. 扫普通链接生成的二维码打开小程序,请看 标题二. 目 ...

  9. 你能用微信小程序打开小程序了【附开发方法】

    6月21日晚间,微信小程序再次迎来升级:小程序可以打开小程序了,同一个公众号下关联的10个同主体小程序和3个非同主体小程序之间,可以调用接口直接相互跳转.微信客户端6.5.9及以上版本支持.另外门店小 ...

最新文章

  1. python数据结构与算法:二叉树及三种遍历方式(先序遍历/中序遍历/后序遍历)
  2. 面试被问到秒杀系统,这个点你一定得答到!
  3. SAP MM 工序委外流程初探
  4. 男人一辈子就喜欢一种类型的女人,至死不渝从一而终!
  5. NavReady 试用小记(2)
  6. 神策数据助力海通证券,精耕 4 大场景,全面强化数字化运营
  7. 关于silverlight+MVVM+WCF保存数据出错的问题
  8. SpringBoot 配置Tomcat运行
  9. 2 django系列之django分页与templatetags
  10. 突变检测软件 测试数据库,测序数据比对和变异检测
  11. 卷积神经网络的权值参数个数的量化分析
  12. 高岭土吸附阳离子_高岭石对金属阳离子的吸附特性研究
  13. Android GMS重要工具和资料下载
  14. xshell绿色版下载-连接远程服务器-unzip使用
  15. HTML超链接引用到地图,HTML超链接
  16. 上传图片校验图片类型、大小及尺寸
  17. 3t服务器装linux系统如何分区,Linux 分区、格式化3T大容量存储分区
  18. 谷歌浏览器本地HTML文件无法打开
  19. SQL语句实现查询SQL Server服务器名称和IP地址_MsSql
  20. 基于MATLAB的远程声控小车的系统设计与仿真

热门文章

  1. Android工具开发一(清除手机所有app缓存)
  2. 静态html无法进行post请求,静态页接收post请求
  3. 空调老大易主后,格力能否下定决心多元化?
  4. Unity 自定义自发光材质 shader (对比Standard Eimission)
  5. 只有7步,就能将任何魔方6面还原
  6. Pandas-csv格式转tsv格式
  7. 为什么总是出现Facebook封号问题?
  8. 男人很容易喜欢一个女人,却不轻易深爱一个女人。
  9. 一张图理解线性空间,度量空间,赋范空间,巴拿赫空间,内积空间,欧几里得空间,希尔伯特空间
  10. 大学四年·写于离校前