多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
1. ~~~ //使用页面 data: { /* 是否加载更多数据 */ more:0 }, //当到达底部时随机生成一个随机数 然后将随机数传给子组件 在子组件中有一个observed属性表示只用值发生改变就会触发该函数 (监听传来的值改变) ~~~ properties: { more: { type: Number, observer: '_loadMore' } }, ~~~ onReachBottom(){ this.setData({ more:Math.random() }) } <v-search wx:if="{{isSearch}}" bind:cancel="onCancel" more="{{more}}"></v-search> ~~~ ~~~ //组件中的js // components/search/index.js import { KeywordModel } from "../../models/keyword"; import { BookModel } from "../../models/book"; import { paginationBev } from "../behaviors/pagination"; const keywordModel = new KeywordModel(); const bookModel = new BookModel(); Component({ /** * 组件的属性列表 */ properties: { more: { type: Number, observer: '_loadMore' } }, behaviors: [paginationBev], /** * 组件的初始数据 */ data: { history_words: [], hot_words: [], clear: false, value: null, /* 是否显示搜索结构 */ isSearch: false, /* 表示是否向服务器在发送请求 */ loading: false, }, /** * 组件的方法列表 */ attached() { this.setData({ history_words: keywordModel.getHistory() }) keywordModel.getHot().then(res => { this.setData({ hot_words: res.hot }) }) }, methods: { _loadMore() { let length = this.getCurrentStart(); /* 在开始请求之前loading设置为true */ /* 只有有关键词的情况下,才触发搜索 */ if (this.data.value && this.hasMore()) { /* 自定义下拉滚动 */ /* 下拉出现 */ this._showLoading(); bookModel.search(length, this.data.value).then(res => { this.setMoreData(res.books); /* 数据加载完成隐藏 */ this._hideLoading(); },err=>{ this._hideLoading(); }) } }, onConfirm(e) { // this.initialize(); wx.showLoading(); this._showResult(); const value = e.detail.value || e.detail.text; bookModel.search(0, value).then(res => { this.setMoreData(res.books); this.setTotal(res.total); if(res.total == 0){ this.setData({ noneResult:true }) } /* 只有在服务器中能够被搜索到的关键词才放入缓存中 */ keywordModel.addToHistory(value); this.setData({ value, history_words:keywordModel.getHistory() }) wx.hideLoading(); }) }, _showLoading(){ this.setData({ loading:true }) }, _hideLoading(){ this.setData({ loading:false }) }, _showResult(){ this.setData({ isSearch:true }) }, onCancel(e) { this.triggerEvent('cancel', {}) }, onFocus() { this.setData({ clear: true }) }, onBlur() { this.setData({ clear: false }) }, onClear() { this.setData({ value: "", isSearch:false }) this.initialize(); } } }) ~~~ ~~~ //组件中公共的 behaviors const paginationBev = Behavior({ data:{ books:[], /* 服务器返回数据的总记录数 */ total:0, noneResult:false }, methods:{ setMoreData(dataArray){ const tempArray = this.data.books.concat(dataArray); this.setData({ books:tempArray }) }, getCurrentStart(){ return this.data.books.length; }, hasMore(){ if(this.data.books.length>=this.data.total){ return false }else{ return true } }, setTotal(total){ this.data.total = total; if(total==0){ this.setData({ noneResult:true }) } }, initialize(){ this.setData({ books:[], noneResult:false }) this.data.total = null; } } }) export {paginationBev}; <v-loading wx:if="{{loading}}"></v-loading> <view class="noneResult" wx:if="{{noneResult}}">没有搜索到任何结果</view> ~~~