热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信小程序极简入门(六)--豆瓣电影小程序下拉刷新和搜索功能

我们先将“pagesdoubanindex”,调为首页,因为我们已经实现了列表页的开发,那么在pagesdoubanindex.wxml中的更多已经可以指向列表页了,如图:

我们先将 “pages/douban/index”,调为首页,因为我们已经实现了列表页的开发,那么在 pages/douban/index.wxml中的更多已经可以指向列表页了,如图:
这里写图片描述

一.实现下载刷新功能

1.实际上,小程序本身已经提供了下拉更新的API,在目录树打开pages/douban/index.js,添加方法:

  onPullDownRefresh() {
    wx.showLoading({
      title: '加载中',
    })
    this.retrieveData().then(() => { wx.stopPullDownRefresh() wx.hideLoading() }) },

当retrieveData数据接收完之后,就调用 wx.stopPullDownRefresh()停止刷新,并且 wx.hideLoading()隐藏加载提示。
2.打开pages/douban/index.json文件,修改为:

{"enablePullDownRefresh": true}

就两步就完成了pages/douban/index.wxml页面的刷新功能。

二.实现搜索功能

实现首页单机搜索进入搜索页面,在搜索页面,提供即时匹配关键字的功能。

这里写图片描述

这里写图片描述

1.在目录树中打开pages/douban/index.wxml,在最下面添加如下代码:

<view class="weui-search-bar" style="position: absolute;top:0;width:100%;opacity: .8;">
  <navigator url="search" class="weui-search-bar__form">
    <view class="weui-search-bar__box">
      <icon class="weui-icon-search_in-box" type="search" size="14">icon>
      <input type="text" class="weui-search-bar__input" />
    view>
    <label class="weui-search-bar__label">
      <icon class="weui-icon-search" type="search" size="14">icon>
      <view class="weui-search-bar__text">搜索view>
    label>
  navigator>
view>

这部分wxml标签代码,在首页定义了一个八分透明的“假”搜索框,效果如上图。

2.在app.json文件中和之前一样添加

    "pages/douban/search",        

创建相关页面。

2.打开pages/douban/search.wxml页面,修改wxml标签代码为:

 <view class="weui-search-bar"> <view class="weui-search-bar__form"> <view class="weui-search-bar__box"> <icon class="weui-icon-search_in-box" type="search" size="14">icon> <input type="text" class="weui-search-bar__input" value="{{searchWords}}" focus="{{searchInputFocus}}" bindinput="onSearchInputType" />  <view class="weui-icon-clear" wx:if="{{searchWords.length > 0}}" bindtap="clearSearchInput"> <icon type="clear" size="14">icon> view> view> <label class="weui-search-bar__label" hidden="{{searchInputFocus}}" bindtap="showSearchInput"> <icon class="weui-icon-search" type="search" size="14">icon> <view class="weui-search-bar__text">搜索view> label> view> <view class="weui-search-bar__cancel-btn" hidden="{{!searchInputFocus}}" bindtap="onTapSearchBtn"> <block wx:if="{{searchWords.length == 0}}">取消block> <block wx:else>搜索block> view> view>  <view class="weui-cells searchbar-result" wx:if="{{wordsList.length > 0}}"> <navigator url="item?id={{item.id}}" wx:for="{{wordsList}}" wx:key="{{item.id}}" class="weui-cell" hover-class="weui-cell_active"> <view class="weui-cell__bd"> <view>{{item.title}}view> view> navigator> view> <import src="list-template" /> <template is="list-template" data="{{ movies,total,page }}" />

3.打开pages/douban/search.js,将代码修改为:

// pages/douban/search.js
Page({
  data: {
    searchInputFocus: true,
    searchWords: "",
    wordsList: [],
    size: 20,
    page: 1,
    movies: [],
    requestInternal: -1,
  },
  onTapSearchBtn() {
    console.log("words", this.data.searchWords)
    if (this.data.searchWords != "") {
      this.retrieve()
    }
    this.setData({
      searchInputFocus: false,
      searchWords: "",
      wordsList: []
    });
  },
  retrieve() {
    let app = getApp()
    let start = (this.data.page - 1) * this.data.size
    wx.showLoading({ title: '加载中' })

    return app.request(`https://api.douban.com/v2/movie/search?q=${this.data.searchWords}&start=${start}&count=${this.data.size}`)
      .then(res => {
        console.log("res", res)
        if (res.subjects.length) {
          let movies = this.data.movies.concat(res.subjects)
          let total = Math.floor(res.total / this.data.size)
          this.setData({ movies: movies, total: total, page: this.data.page, wordsList: [] })
          wx.setNavigationBarTitle({ title: res.title })
        }
      }).catch(err => {
        console.error(err)
      }).finally(() => { wx.hideLoading() }) }, showSearchInput() { this.setData({ searchInputFocus: true }); }, // 清空输入框内容 clearSearchInput() { this.setData({ searchWords: "" }); }, // 当在搜索框键入内容 onSearchInputType(e) { let app = getApp() let words = e.detail.value this.setData({ searchWords: words }); clearTimeout(this.data.requestInternal) this.data.requestInternal = setTimeout(() => { app.request(`https://api.douban.com/v2/movie/search?q=${words}&start=0&count=6`).then(d => { console.log(d) if (d.subjects.length) { this.setData({ wordsList: d.subjects }); } }) }, 2000) } })

这里再次复用了模版组件list-template,这就是定义模版组件的好处。
当单击输入框表象UI时,触发showSearchInput函数,在这个函数中仅设置焦点变量searchInputFocus为true.
当单机取消符号“x”时,触发clearSearchInput函数,设置searchWords为空。当searchWords为空时,“x”不再显示。

  <view class="weui-icon-clear" wx:if="{{searchWords.length > 0}}" bindtap="clearSearchInput"> <icon type="clear" size="14">icon> view>

当searchWords的字符串长度不为0时,显示取消,否则显示搜索,这里绑定onTapSearchBtn函数,在onTapSearchBtn函数中先请除搜索变量,如果搜索词不为空,则调用retrieve函数:

<view class="weui-search-bar__cancel-btn" hidden="{{!searchInputFocus}}" bindtap="onTapSearchBtn"> <block wx:if="{{searchWords.length == 0}}">取消block> <block wx:else>搜索block> view>

修改为上述文件代码后,点击模拟器就可以查看相应效果了。
github代码地址:https://github.com/lightTrace/xiaochengxu/tree/master/douban-v5
至此,一个实时查询最新电影的小程序就完成了。

如何将我们完成的小程序打包上传呢?我们只需要将app.json中的navigationBarTitleText字段更改为我们小程序的名字,然后按照:微信小程序官方文档,一步一步的去提交审核就可以了。


推荐阅读
  • 微信小程序地图实现展示线路的方法
    这篇文章将为大家详细讲解有关微信小程序地图实现展示线路的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所 ... [详细]
  • 微信小程序新手教程wx.request(object) API
    微信小程序新手教程wx.request(object)API,本篇默认已经成功安装微信小程序工具,来和小编一起看看吧wx.request(object)API这里通过干活集中营的A ... [详细]
  • 微信小程序中如何实现轮播图
    这篇文章主要介绍了微信小程序中如何实现轮播图,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 微信小程序详解:概念、功能与优势
    微信公众平台近期向200位开发者发送了小程序的内测邀请。许多人对微信小程序的概念还不是很清楚。本文将详细介绍微信小程序的定义、功能及其独特优势。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 在探讨如何在Android的TextView中实现多彩文字与多样化字体效果时,本文提供了一种不依赖HTML技术的解决方案。通过使用SpannableString和相关的Span类,开发者可以轻松地为文本添加丰富的样式和颜色,从而提升用户体验。文章详细介绍了实现过程中的关键步骤和技术细节,帮助开发者快速掌握这一技巧。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在微信小程序中,页面的加载机制与传统应用类似,每次打开新页面时都会创建一个新的视图对象并进行叠加。当用户点击返回按钮时,当前页面会被关闭并从堆栈中移除。这一过程涉及页面管理与资源释放,确保了用户体验的流畅性和系统的稳定性。微信小程序支持同时打开的页面数量有限制,最多可同时保持10个页面的打开状态,以避免内存溢出和性能下降。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • android RadioButton放大或者缩小
    RadioButtonandroid并没有提供方法来控制按钮的大小,我自己在网 ... [详细]
  • MathJax.Hub.Config({showMathMenu:false}); ... [详细]
  • 微信小程序开发如何实现地图功能
    这篇文章主要讲解了“微信小程序开发如何实现地图功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研 ... [详细]
author-avatar
鄢都浪子_562
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有