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>
~~~
- 前期準備
- 軟件安裝配置
- 語法 以及 功能 的實現
- 小程序中的 輪播
- 翻轉輪播
- 實現 跳轉 頁面
- 詳談 跳轉頁面
- for 循環 渲染 頁面(重點)
- 點擊 改變 元素內容
- 功能 封裝(創建、使用 模板)(重點)
- js模塊化(重點)
- if-else實現 三目運算
- 底部導航欄tabBar 實現
- 小程序中的 函數調用 方法
- 小程序中的 block 包裹元素
- 小程序中的 hover事件
- import 標簽(重點)
- 其他
- 在本地模擬接口取數據
- 點擊跳轉 并將該元素的id一起傳遞給跳轉的頁面
- 點擊詳情頁顯示
- 點擊事件(bindtap/catchtap)
- 圖片的mode屬性
- 跳轉頁面時實現頂部顯示頁面標題
- hello world
- 將豆瓣服務器接口設置在本地
- 組件
- 地圖
- 下拉刷新
- 數據加載 loading...
- 動態設置導航(title設置)
- 實現js代碼的模塊化
- 傳參
- 組件中的生命周期函數
- 實戰
- 發送http請求
- 可用的豆瓣接口
- 處理豆瓣列表頁的數據
- 從接口上取數據渲染到頁面上1
- 從接口上取數據渲染頁面實現瀑布流2
- 瀑布流
- 音樂播放
- 文章詳情頁
- 音樂播放組件
- 音樂播放 最終版
- 電影(封裝取數據渲染)
- 分享與收藏
- 搜索框
- 將電影列表數據放緩存
- 零碎知識點
- 談組件
- 請求封裝 (重點)
- 實現簡單需求的請求失敗的封裝
- 使用class實現顯示各種錯誤信息
- 再次封裝帶class的請求實現改變里面給的url
- 使用promise 封裝http
- promise
- generator
- 01.介紹
- 02. 基本
- 03. 實例
- 04.yield
- asyns
- 01. 介紹
- 02. 使用
- 03. 取豆瓣
- 子組件(模板文件)接收父組件傳來的參數并改變其值
- 模塊化
- 在模板中提取相同的部分behavior
- 字符串與數組之間的轉換
- 子組件向父組件傳參
- 談 triggerEvent
- 整體展示
- 父組件向子組件傳wxml (在兩個組件比較相似的情況 定義卡 槽傳 wxml)
- 傳css (在父組件中定義子組件的樣式)
- 使用wxs給wxml傳js
- 點贊
- 小程序中的正則
- 組件中實現下拉刷新
- 用戶授權
- 組件點擊圖片獲取信息
- 說明
- 小程序上下滑動