<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      Omi實戰-QQ附近用戶列表Web頁

      2017-02-23 09:58  【當耐特】  閱讀(1775)  評論(1)    收藏  舉報

      寫在前面

      Omi很適合大型復雜的Web頁面開發,例如一些Web在線工具的開發。但是制作這種簡單的QQ附近用戶列表Web頁,也不會有大炮哄蚊子的感覺。

      項目開始之前,實現選擇一個腳手架。可以使用omi-cli快速創建項目腳手架。腳手架主要基于 Gulp + Webpack + Babel + BrowserSync 進行開發和部署。

      Gulp用來串聯整個流程,Webpack + Babel讓你可以寫ES6和打包,BrowserSync用來幫你刷瀏覽器,不用F5了。

      這里需要注意的是,BrowserSync會啟動localhost:3000導致你的AJAX請求跨域而無法拿到數據。

      所以,要使用Fiddler并配置Extention:

      目錄

      目錄結構也是和Omi Github上的scaffolding一樣。
      組件全放在component目錄,公共的工具庫放在common,其他資源文件放在asset里。

      命令

      開發

      npm run dev
      

      發布

      npm run dist
      

      開始寫碼

      萬事具備,開始寫碼。先寫組件:

      import Omi from 'omi'
      
      class UserList extends Omi.Component {
          constructor(data) {
              super(data)
          }
      
          install() {
              this.data.uin_info || (this.data.uin_info = [])
              this.data.uin_info.forEach(user => {
                  this.prepareData(user)
              })
          }
          
          prepareData(user){
              user.desc_d = user.desc.split("&nbsp;")[0]
              user.desc_t = user.desc.split("&nbsp;")[1]
              user.isBoy = user.sex === "男"
              user.qlogo = user.url.replace("http://", location.protocol + "http://").replace(/&amp;/g, "&")
              if (user.profession_desc) {
                  user.hasProfession_desc = true
              }
          }
          
          appendUsers (users) {
              users.uin_info && users.uin_info.forEach(user =>{
                  this.prepareData(user)
                  this.data.uin_info.push(user)
              })
              this.update()
          }
      
          sendGift(uin, nick, qlogo) {
              //送禮物并關閉webview,此處省略
              //..
              //..
          }
      
          render() {
              return `
      <div class="user_list">
          {{#uin_info}}
          <div class="item" onclick="sendGift('{{uin}}','{{nick}}','{{qlogo}}')">
              <div class="qlogo">
                  <img style="width: 70px;" src="{{qlogo}}" />
              </div>
              <div class="main b1 bb">
                  <div class="nick">{{{nick}}}</div>
                  <div class="icons">
                      {{#isBoy}}<span class="boy_age"><img src="component/user_list/boy.png" alt="" /><span>{{age}}</span></span> {{/isBoy}}
                     {{^isBoy}}<span class="girl_age"><img src="component/user_list/girl.png" alt="" /><span>{{age}}</span></span> {{/isBoy}}
                      {{#hasProfession_desc}} <span class="profession"><span>{{profession_desc}}</span></span> {{/hasProfession_desc}}
                  </div>
                  <div class="action">{{{intro}}}</div>
              </div>
              <div class="distance_info">{{desc_d}} · {{desc_t}}</div>
          </div>
          {{/uin_info}}
          <div style="text-align:center;font-size:13px;line-height:30px;height:30px;"><span class="loading"></span> 加載中...</div>
      </div>
      `
          }
      
          style() {
              return `
      
      
      .qlogo {
          overflow: hidden;
          width: 70px;
          height: 70px;
          -webkit-border-radius: 50%;
          border-radius: 50%;
          position: absolute;
          top: 10px;
          left: 12px;
      }
      ...
      ...
      ..這里省略大量.....
      ...
      ...
      
      .distance_info {
          position: absolute;
          top: 15px;
          right: 9px;
          color: #7B7B84;
          font-size: 10px;
      }
      
              `
          }
      }
      
      export default UserList
      

      組件里面有5個方法:

      • constructor 組件的構造函數,生命周期的一部分,其實在super上面和super調用下面可以對data做一些處理。super之上不能拿到this
      • install 組件的初始化安裝,生命周期的一部分,這里也可以拿到用戶傳進的data進行處理
      • prepareData 對數據進行一些處理來滿足模板的渲染
      • appendUsers 新增數據,用來處理用戶向下滾動的load more 的行為的時候調用
      • sendGift 送禮物,點擊每一項的時候會有送禮物的行為,業務相關,可以無視..

      其他兩個方法的render和style用來生成組件的HTML和局部CSS,不再敘述。
      render里面使用了mustache.js模板引擎;
      如果使用omi.lite.js版本(不包含mustache.js模板引擎)的話,你也可以使用ES6 map去遍歷數據生成HTML,或者重寫 Omi.template去使用任意你喜歡的模板引擎,非常靈活方便。

      這里友情提醒一下,如果使用webstorm的話,可以把js version設置成JSX Harmony或者ECMAScript 6,這樣才是寫ES6+的姿勢。

      下面來看index.js:

      import Root from './config.js'
      import Omi from 'omi'
      import UserList from '../component/user_list/index.js'
      
      Omi.makeHTML('UserList', UserList)
      
      class Main extends Omi.Component {
          constructor(data) {
              super(data)
          }
      
          installed() {
              window.onscroll = () => this.loadMore()
              this.requestData(data => this.list.appendUsers(data))
          }
      
          loadMore() {
              const body = document.body,
                  html = document.documentElement,
                  height = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight),
                  vp_height = window.innerHeight
      
              if (height - document.body.scrollTop - vp_height < 200) {
                  this.requestData(data => this.list.appendUsers(data))
              }
          }
      
          requestData(callback) {
              if (Root.isDev) {
                  require.ensure([], ()=> {
                      callback(require('./mock_data.js').default)
                  })
              }else{
              	//ajax 請求數據,這里省略
              }
          }
      
          render() {
              return `
          <div class="main">
              <UserList name="list" />
          </div>`
          }
      }
      
      Omi.render(new Main(),'body')
      

      通過Omi.makeHTML('UserList', UserList)這句代碼,UserList變成了可以嵌套至render方法中的標簽。如:

       render() {
              return `
          <div class="main">
              <UserList name="list" />
          </div>`
          }
      

      下面這行代碼,是監聽滾動,快滾動到底部的時候在loadMore里面會去請求。

      window.onscroll = () => this.loadMore()
      

      通過height - document.body.scrollTop - vp_height < 200判斷用戶快要滾動底部,滾動到底部有個加載更多的行為,即:

      if (height - document.body.scrollTop - vp_height < 200) {
          this.requestData(data => this.list.appendUsers(data))
      }
      

      requestData是去服務器請求分頁的數據,請求成功,會去調用this.list.appendUsers進行數據的添加。
      慢著?this.list哪里來的?appendUsers又是哪里定義的方法?且看下面:

       <UserList name="list" />
      

      上面標記的name,讓你可以直接通過this.list訪問到UserList對象的實例,所以也就可以調用它的appendUsers方法!

      再來看下數據模擬:

      if (Root.isDev) {
              require.ensure([], ()=> {
                  callback(require('./mock_data.js').default)
              })
          }
      

      這里在dev環境下是mock數據,使用了require.ensure,這樣當你npm run dist的時候,mock的數據就不會被打包進js里了!!

      最后

      好了,就這么多,Omi讓代碼真心方便簡潔~~~

      相關地址

      招募計劃

      主站蜘蛛池模板: 欧产日产国产精品精品| 国产精品不卡区一区二| 少妇被粗大的猛烈xx动态图| 亚洲成av人片无码天堂下载| 国产色视频网站免费| 99在线精品视频观看免费| 国产精品深夜福利在线观看| 精品2020婷婷激情五月| 精品久久久久久无码不卡| 青草热在线观看精品视频| 樱花草在线社区www| 4虎四虎永久在线精品免费| 国产成人精品一区二区三| 国产精品疯狂输出jk草莓视频| 日韩精品亚洲专在线电影| 国产精品亚洲片夜色在线| 欧美激情内射喷水高潮| 国产精品香港三级国产av| 亚洲精品一区二区三区免| 人妻少妇精品无码专区二区| 精品无码国产污污污免费| 精品精品久久宅男的天堂| 久久亚洲精品人成综合网| 午夜一区二区三区视频| 国产精品午夜福利在线观看| 成人精品一区日本无码网| 精品无码人妻一区二区三区| 国产精品一区二区三区自拍| 久久精品国产一区二区三 | av无码一区二区大桥久未| 九九热在线免费视频观看| 国产人妻人伦精品1国产丝袜| 国内精品亚洲成av人片| 大地资源免费视频观看| 亚洲日韩欧洲乱码av夜夜摸| 国产午夜精品视频在线播放 | 色综合久久人妻精品日韩| 97精品伊人久久久大香线蕉| 迁西县| 久热re这里精品视频在线6| 亚洲精品人妻中文字幕|