好快, 1分鐘開發好一個下拉刷新,滾動加載列表

好快, 1分鐘寫好下拉刷新,滾動加載自動分頁列表

前言

歡迎關注BUI Webapp專欄 或者 bui神速微信公衆號.html

以往文章:前端

1、觀看實操視頻

bui.list

點擊觀看視頻實錄vue

安裝完如下環境後, 從0到1, 手把手教, 你也能夠作到!

2、開發準備

  • 安裝buijs cli命令行工具(須要先安裝node環境, 建議使用node 8.x);
如何安裝使用buijs?
  • 安裝bui-fast 快速編輯器插件(推薦vscode);
如何安裝使用bui-fast?
  • 打開跨域的chrome瀏覽器;
如何打開跨域的Chrome瀏覽器?

3、開發過程

使用 buijs 構建工程

建立工程

  • 1.建立Webapp工程
buijs create demo
  • 2.安裝依賴
cd demo/

npm install
windows 推薦使用淘寶的 cnpm install
  • 3.運行預覽
npm run dev

使用bui-fast編輯器插件生成控件

視頻裏使用的是vscode 能夠在安裝插件那裏找到 bui-fast.node

xxx 假設爲控件名

生成規則1:es6

  • 在html裏, 使用 ui-xxx 生成控件結構
ui-list

生成如下結構web

<div id="uiList" class="bui-scroll">
    <div class="bui-scroll-head"></div>
    <div class="bui-scroll-main">
        <ul class="bui-list">
        </ul>
    </div>
    <div class="bui-scroll-foot"></div>
</div>
  • 在js裏, 使用 bui-xxx 生成控件的初始化代碼
bui-list

生成如下初始化代碼ajax

// 列表控件 js 初始化:
var uiList = bui.list({
    id: "#uiList",
    url: "http://rap2api.taobao.org/app/mock/84605/example/getNews",
    pageSize: 5,
    data: {},
    //若是分頁的字段名不同,經過field從新定義
    field: {
        page: "page",
        size: "pageSize",
        data: "data"
    },
    callback: function(e) {},
    template: function(data) {
        var html = "";
        data.forEach(function(el, index) {

            html += `<li class="bui-btn bui-box">
                <div class="bui-thumbnail"><img src="${el.image}" alt=""></div>
                <div class="span1">
                    <h3 class="item-title">${el.name}</h3>
                    <p class="item-text">${el.address}</p>
                    <p class="item-text">${el.distance}千米</p>
                </div>
                <span class="price"><i>¥</i>${el.price}</span>
            </li>`
        });

        return html;
    }
});

保存就會自動預覽

4、從bui.list看自動分頁設計原理

bui.list

經常使用參數說明:chrome

  • id 用來跟結構綁定
  • url 數據請求的地址
  • data 數據請求須要
  • height 列表的高度
  • page 從第幾頁開始請求
  • pageSize 要返回多少條數據
  • field 字段映射
  • template 根據返回的數據, 渲染自定義模板,支持es6模板
  • callback 爲每一行添加一個點擊事件,比方點擊跳轉
  • onRefresh 下拉刷新的時候觸發回調
  • onLoad 上拉滾動到底部的時候觸發回調

1. 滾動自動分頁原理

滾動的第一要素就是高度, 當內容撐出容器的高度,纔會產生滾動條, 才能監聽id的滾動事件, 能夠知道是否已經滾動到底部, 到底部則自動發起新一頁的請求.npm

2. 爲什麼有時候會請求屢次?

這裏咱們須要解決的第一個問題,就是高度, 因此咱們能夠傳height參數,默認是0, 爲0,則會自動計算列表的頁面剩餘高度.segmentfault

有了高度之後, 咱們要計算請求返回的數據能不能撐開容器, 若是不行, 則自動請求下一頁, 直到容器被撐開, 因此你會看到pageSize 設置的值較小的時候, 頁面會發起第2次請求, 就是這個緣由.

3. 如何知道返回的數據在哪一個字段?

咱們來看一下這個接口返回的數據是什麼?

http://rap2api.taobao.org/app/mock/84605/example/getNews

這個是淘寶的mock模擬接口,隨機返回數據, 返回一個 {data:[],info:"",status:""} 結構的數據.
{
  data: [{
    uid: 6801,
    name: "和再團之較",
    image: "http://dummyimage.com/200x134/4A7BF7&text=Thumbnail",
    phone: "17612327699",
    location: "惠城區",
    price: "65",
    distance: "52",
    status: 1,
    date: "2003-06-28",
    url: "gopher://brcce.cq/svku",
    email: "v.dmdtjgv@rwldcexzt.bi",
    time: "20:39:53",
    address: "海南省 三沙市 西沙羣島",
    detail: "式始衆組月他政例了部自革每往子。但本活又己交給音長爭標識我。八說前它特用達圓是路看江才。開次他爭從點軍容給油很出。成育料技所心並精北酸間辦元。除現七團一歷積動兩水礦花始線黨黨她。"
  }],
  info: "獲取成功",
  status: 0
}

那麼問題來了? 無論接口的規則是後端仍是前端定的, 控件並不事先知道接口的規則, 若是把規則限定死了, 那不少先開發接口再來學習移動端開發的還會選擇bui框架嗎?

咱們來看看有沒有漏了什麼參數?

  • field 字段配置

這個就是用來作數據請求的字段映射, 比方, 我請求的接口地址是http://rap2api.taobao.org/app/mock/84605/example/getNews, 請求第幾頁是用的大寫 PAGES 請求每頁的大小 是用的 PAGESIZES; 那麼 field 的配置應該爲:

{
  page: 2,
  pageSize: 20,
  field: {
    page: "PAGES",
    size: "PAGESIZES"
  }
}

那麼接口就會請求爲 http://rap2api.taobao.org/app/mock/84605/example/getNews?PAGES=2&PAGESIZES=20; 這樣接口就能正常請求到對應的數據了, 那請求到之後的數據返回回來, 怎麼知道數據在什麼字段呢? 一樣也是在fielddata 參數裏面配置;

{
  page: 2,
  pageSize: 20,
  field: {
    page: "PAGES",
    size: "PAGESIZES",
    data: "data"
  }
}

若是返回的數據是嵌套多個層級呢? 好比返回

{
  result: {
      data: [{
        uid: 6801,
        name: "和再團之較",
        image: "http://dummyimage.com/200x134/4A7BF7&text=Thumbnail",
        phone: "17612327699",
        location: "惠城區",
        price: "65",
        distance: "52",
        status: 1,
        date: "2003-06-28",
        url: "gopher://brcce.cq/svku",
        email: "v.dmdtjgv@rwldcexzt.bi",
        time: "20:39:53",
        address: "海南省 三沙市 西沙羣島",
        detail: "式始衆組月他政例了部自革每往子。但本活又己交給音長爭標識我。八說前它特用達圓是路看江才。開次他爭從點軍容給油很出。成育料技所心並精北酸間辦元。除現七團一歷積動兩水礦花始線黨黨她。"
    }],
  },
  info: "獲取成功",
  status: 0
}

那麼咱們就要找到該數據返回的數組字段在哪裏? 你能夠這樣配置.

{
  page: 2,
  pageSize: 20,
  field: {
    page: "PAGES",
    size: "PAGESIZES",
    data: "result.data"
  }
}

4. 如何知道已經到最後一頁了?

最後一頁

咱們操做一下剛剛生成的控件, 會看到底部有沒有更多內容字樣, 那怎麼知道是不是最後一頁了呢? 經過返回的數組大小, 跟你請求的每頁大小作比對, 若是小余pageSize設置的值, 則認爲已是最後一頁了.

實際上就是把 bui.ajax+bui.scroll+bui.pullrefresh幾個控件的通用需求整合在一塊, 這樣咱們就能夠解決數據接口+控件整合, 又能抽離業務的一個控件. 經過簡單配置,咱們能夠知足不少開發需求.

5、注意事項

  • 對於接口的請求必須返回數組才能操做, 非數組請使用 bui.scroll 控件;
  • 若是高度自動計算不許確, 須要自行計算好告訴它;
  • 若是是restful接口, 須要在接口設置容許這種問號傳參的形式;
相關文章
相關標籤/搜索