本文先写写首页的内容吧,其他页面后续更新。
标签列表图片列表最近滚回原生党,除非巨型项目,否则都会利用原生,包括但不限于小程序。
标签列表
效果:
标签列表
干系代码:
html
<view id=\公众nav\"大众> <button class=\"大众item\"大众 bindtap='tapButton' wx:for=\"大众{{classes}}\"大众 wx:key=\公众{{index}}\公众 data-index=\"大众{{index}}\"大众> {{item}} </button></view>
这里该当利用 scroll-view,然后设置 x 方向滚动。由于当时写顺手了,就弄了个 view,然夹帐动 css 设置 x 滚动,听说性能是差一点,但是既然代码这样,就先这样放出来,当个反面教材。
然后,wx:for 与 wx:key 是一对冤家,基本都是一起涌现,for 是循环好理解,key 是避免 for 天生的节点不唯一导致的一些 bug,这里不细说,大略记下便是一起涌现即可。对了,key 要唯一,以是一样平常来说,index 是最好的小伙伴。
bindtap 便是 click 事宜的“别名”了,但道理上是不一样的,这样记问题不大。
data-index 便是绑定的数据,可以在 js 里面类似 DOM data 属性一样获取到。
“{{x}}” 便是获取 js 里面声明的 data 绑天命据了,这个 data 数据是可以自动绑定的。
其他便是跟 HTML 差异不大了,除了标署名之外。
css
#nav { white-space: nowrap; overflow-x: scroll; height: 64rpx;}#nav .item { display: inline; min-width: 120rpx; line-height: 64rpx; margin: 8rpx 0; color: grey;}
css 没什么说得,不说样式丑就行。
js
//index.js//获取运用实例const app = getApp()const AV = app.globalData.AVPage({ data: { classes: ['Asuna'], images: [], }, // 获取标签列表 getClasses() { new AV.Query('CLASSES') .find() .then(res => { const classes = Array.from(res, item => item.get('className')) this.setData({ classes: classes }) }) .catch(console.error) }, // 点击标签 tapButton(e) { const className = this.data.classes[e.target.dataset.index] this.getImages(className) }, onReady() { this.getClasses() },})
前两行是获取小程序实例,以及第三方干系,这里第三方便是之前项目供应数据源的地方,不打广告,理解成后台获取资源就行,详细获取办法在 js 里面,也不要穷究。
onReady 是当前页加载前,此时获取数据,由于是异步,以是该当不会涌现渲染失落败。把稳是该当,个人建议还是放在 onLoad 里面, 我这里由于是第三方官网的 Demo 拷贝,就没有去改它,等下有自己写的,我都是放在 onLoad。
this.setData({ classes: classes})
React 小伙伴该当比较熟习,这里便是小程序数据绑定修正办法,这种办法修正可以使得 wxml(HTML)里面“{{}}”绑定的视图同步更新。
没错,this.data.x = y 可以修正但是不能同步更新,明白了?
把稳:与 React 不同,这玩意是同步的,不是 React 那种异步,以是不存在回调处理。
tapButton 便是绑定在标签上的点击事宜,与获取图片列表有关。
那么,到这里,全体标签列表就完成了。
图片列表
效果:
图片列表
干系代码:
html
<scroll-view id='main' scroll-y> <view class='476e245bafb642be img-container' wx:for=\"大众{{images}}\"大众 wx:key=\公众index\公众 wx:for-item=\公众url\"大众 data-index=\公众{{index}}\"大众 bindtap='tapImage'> <image src=\"大众{{url}}\公众 lazy-load mode=\"大众aspectFit\"大众></image> </view></scroll-view>
wx:for-item 指定循环遍历利用的 item 名,配套的有 wx:for-index 指定循环遍历利用的 index 名。是的,默认不写便是 item、index。这里为了语义清楚点,就设置成 url 了。
lazy-load 说是可以
至于 mode=\"大众aspectFit 便是个人喜好小程序的一点了,图片缩放处理已经被框架处理好,不要自己再去配置 width、height、自动缩放等等了。详细可以看官方解释:小程序组件——image
scroll-view 就不用说了,也是框架供应好的滚动视图,设置下详细宽高,在配置想方向就可以了:scroll-y 或 scroll-x。
css
#main { height: calc(100% - 64rpx);}.img-container { display: inline-block; width: 47%; height: 400rpx;}.img-container:nth-child(2n + 1) { margin-left: 2%; margin-right: 1%;}.img-container:nth-child(2n) { margin-left: 1%; margin-right: 2%}image { width: 100%; height: 100%;}
由于我们是竖直方向滚动,以是设置的 #main 的高。原来是想像 APP 一样实现瀑布流,但是创造 Grid 小程序彷佛不支持?就只能退而求其次的选择比较 low 的常规两列布局了。详细 Grid 的瀑布流,效果如下:
小程序的,哎……
中间 img-container,一样是夹层,方便往后拓展。
js
//index.js//获取运用实例const app = getApp()const AV = app.globalData.AVPage({ data: { classes: ['Asuna'], images: [], }, // 获取标签下图片列表 getImages(className) { this.setData({ images: [], title: className }) wx.showLoading({ title: \"大众获取列表数据中……\公众 }) new AV.Query(className) .find() .then(res => { wx.hideLoading() this.setData({ images: Array.from(res, item => item.get('url')) }) }) .catch(console.error) }, onLoad() { this.getImages(this.data.classes[0]) },})
把稳,默认 data 里面有一个标签,便是为了防止第一次进来没东西。
这个就相对大略不说那么详细,提一下须要把稳的优化点:
点击标签切换的时候,要先清空图片数组,否则会涌现延时或者干脆显示不匹配的问题。既然是异步交互,那还是带上菊花转吧 wx.showLoading,成功后记得关掉 wx.hideLoading。小结
this.setData 是驱动数据与视图更新的要点。记得修正数组前清空下数组。用户交互的菊花转是个好东西。小程序,大略的一塌糊涂。欢迎关注,如有须要 Web,App,小程序,请留言联系。