Введения в мини-программы WeChat достаточно Douban Movies Top 250

внешний интерфейс JavaScript Апплет WeChat

Я занимаюсь Android-разработкой, и недавно компания неожиданно попросила меня изучить мини-программы WeChat. Спрос на мини-программы WeChat сейчас растет, и компании всех размеров теперь приходят, чтобы сделать мини-программу для меня.Мини-программы WeChat пользуются популярностью у все большего числа пользователей благодаря своим супер-удобным функциям the-fly». Благо, ведь иногда не хочется тратить время или трафик на загрузку приложения, апплет можно отобразить перед пользователем в очень легкой форме, и, наконец, завершить определенный бизнес-процесс. При этом функции и UI текущего апплета не намного хуже родного приложения. Я думаю, что мини-программы должны быть будущим направлением развития (это подтверждено развитием последних нескольких лет). Что ж, без лишних слов, давайте начнем прямо сейчас.

Базовая структура мини-программ WeChat

скачать первыминструменты разработчикаСоздайте новый проект, выберите пустой каталог в качестве пути к проекту и используйте тестовый номер, если приложение отсутствует.

Структура проекта после создания проекта выглядит следующим образом

Глобальный файл приложения

1. app.js — это логика апплета, здесь апплет может зарегистрировать только одно приложение

App({//生命周期
  onLaunch: function() { },//监听初始化
  onShow: function() {  },//监听显示(进入前台)
  onHide: function() {  },//监听隐藏(进入后台:按home离开微信)
  onError: function(msg) {  },//监听错误
  //自定义的全局方法和全局变量  
  globalFun:function(){},
  globalData: 'I am global data'
})

2. app.json — это глобальная конфигурация текущего апплета, включая все пути к страницам, производительность интерфейса, тайм-аут сети, нижняя вкладка и т. д. page.json может переопределять свойства app.json, устанавливая отдельную страницу для стоимости страницы

{
  "pages":[
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "WeChat",
    "navigationBarTextStyle":"black"
  }
}

3. app.wxss — это глобальный стиль апплета, а wxss соответствует css в сети.

.container {
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-between;
  padding: 200rpx 0;
  box-sizing: border-box;
} 

Страница содержит файлы

Страницы — это страницы, содержащиеся в апплете.Создайте пустой каталог в папке страниц, щелкните правой кнопкой мыши и выберите «Создать страницу», чтобы сгенерировать необходимые файлы для страницы, а именно: page.js, page.json, page.wxss, page.wxml. , page.json и page.wxss необязательны

1. page.js Одна страница, одна страница, используется для управления жизненным циклом страницы, пользовательскими методами и параметрами.

Page({
  data: {text: "This is page data."},//页面数据,用来维护视图,json格式
  onLoad: function(options) {  },//监听加载
  onReady: function() {  },//监听初次渲染完成
  onShow: function() {  },//监听显示
  onHide: function() {  },//监听隐藏
  onUnload: function() {  },//监听卸载
  onPullDownRefresh: function() {  },//监听下拉
  onReachBottom: function() {  },//监听上拉触底
  onShareAppMessage: function () {  },//监听右上角分享
  //如下为自定义的事件处理函数(视图中绑定的)
  viewTap: function() {//setData设置data值,同时将更新视图
    this.setData({text: 'Set some data for updating view.'})
  }
})

2. page.wxml - вид страницы для отображения данных. Вид соответствует div нашего html, а текст соответствует span. Автоматически сгенерированный index.wxml выглядит следующим образом, реализуя вход по клику функция

<view class="container">
  <view class="userinfo">
    <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
    <block wx:else>
      <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
    </block>
  </view>
  <view class="usermotto">
    <text class="user-motto">{{motto}}</text>
  </view>
</view>

3. Привязка данных в сочетании с официальными примерами, напишите простую демо-страницу

page.wxml

<!-- 简单绑定 -->
<view> {{ message }} </view>
<!-- 组件属性 -->
<view id="item-{{id}}">{{id}}</view>
<!-- 控制属性 -->
<view wx:if="{{condition}}"> condition</view>

<!--关键字(需要在双引号之内)
true:boolean 类型的 true,代表真值。
false: boolean 类型的 false,代表假值。-->
<checkbox checked="{{false}}"> </checkbox>

<!-- 字符串运算 -->
<view>{{"hello" + name}}</view>

<!-- 数据路径运算 -->
<view>{{object.key}} {{array[0]}}</view>

<!-- 循环遍历 -->
<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName">
  {{idx}}: {{itemName.message}}
</view>

<!-- 模板 -->
<template name="msgItem">
  <view>
    <text> {{index}}: {{msg}} </text>
    <text> Time: {{time}} </text>
  </view>
</template>
<template is="msgItem" data="{{...item}}"/>

<!-- 点击事件 -->
<view id="tapTest" data-hi="WeChat" bindtap="tapName"> Click me! </view>

page.js

Page({
  data: {
    message: 'Hello MINA!',
    id: 0,
    condition: true,
    name: 'MINA',
    object: {
      key: 'Hello '
    },
    array: ['MINA'],
    array: [{
      message: 'foo',
    }, {
      message: 'bar'
    }],
    item: {
      index: 0,
      msg: 'this is a template',
      time: '2016-09-15'
    }
  },

  tapName: function (event) {
    console.log(event)
  }
})

Дубан Топ250

Мне всегда нравилось использовать интерфейс Douban Movie для изучения новых технологий, ха-ха

Посмотрите мою предыдущую статью,Python3 сканирует фильмы Douban Top250

Интерфейс Douban ограничивает доступ к апплету WeChat и использует другой интерфейс, а возвращаемые данные согласуются.Douban.u IEEE.com/V2/movie/to…

Кроме того, при разработке IDE не забудьте поставить галочку Не проверять доменное имя.После официального запуска вы должны присвоить доменное имя легальному доменному имени.

Код непосредственно ниже

app.json

{
  "pages": [
    "pages/list/list",
    "pages/detail/detail"
  ],
  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#072",
    "navigationBarTitleText": "豆瓣电影",
    "navigationBarTextStyle": "light"
  }
}

list.wxml

<!--pages/list/list.wxml-->
<wxs module="filters" src="./list.wxs"></wxs>

<view wx:for="{{movies}}" wx:key="{{item.id}}" data-index="{{index}}" class ="movie_item" bindtap="goDetail">
  <image class="image" src="{{item.images.small}}"></image>
  <view class="movie_info">
    <text class="title">{{item.title}}</text>
    <view class="star">
      <text class="{{filters.getRating(item.rating.average)}}"></text>
      <text class="rating_num">{{filters.toFix(item.rating.average)}}</text>
    </view>
  </view>
</view>

list.js

var start = 0;
Page({

  start: 0,
  /**
   * 页面的初始数据
   */
  data: {
    movies: []
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
   
    var that = this;

    this.loadMore(that);
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
  
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
   
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
  
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
   
  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
    start = 0;

    var that = this;

    this.loadMore(that);

    wx.stopPullDownRefresh();
  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
    var that = this;

    this.loadMore(that);
  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {
  
  },

  loadMore:function(that){
      that.getMovie(function (d) {//回调函数,根据数据设置页面data,更新到视图
      wx.hideToast();//隐藏加载框
      var list = that.data.movies;
      for(var i=0;i<d.length;i++){
        list.push(d[i]);
      }
      that.setData({ movies: list })//更新数据,视图将同步更新
    })
  },
  getMovie:function(fn) {
    wx.showToast({ title: '加载中', icon: 'loading', duration: 10000 })
    wx.request({//请求服务器,类似ajax
      url: 'https://douban.uieee.com/v2/movie/top250?start='+start,
      header: { 'content-type': 'json' },
      success: function (res) { 
        start=start+20;
        console.log(res)
        fn(res.data.subjects) }//成功后将数据传给回调函数执行
    })
  },
  goDetail:function(e) {
    var that = this
    //拿到点击的index下标
    var index = e.currentTarget.dataset.index
    var movie = JSON.stringify(that.data.movies[index])
     wx.navigateTo({
       url: '../detail/detail?movie='+movie,
     })
  }
})

list.wxss

.movie_item {
    margin: 8px;
    border-radius: 5px;
    background-color: #fff;
    box-shadow: 1px 1px 1px #cccccc;
    position: relative;
    display: block;
    padding: 8px;
    overflow: hidden;
    box-sizing: border-box;
}

.image {
    width: 64px;
    height: 100px;
    margin-right: 15px;
    background-color: #eeeeee;
    float: left;
}

.movie_info {
  float: left
}

.title {
  font: 12px Arial, Helvetica, sans-serif;
  line-height: 150%;
  color: #669;
}

.rating10-t, .rating15-t, .rating20-t, .rating25-t, .rating30-t, .rating35-t, .rating40-t, .rating45-t, .rating50-t, .rating-t{
      display: inline-block;
    zoom: 1;
    background: url(https://img3.doubanio.com/f/shire/b8f4c3672ef81106701071831e22422a745d3b74/pics/rating_icons/ic_rating_s.png) no-repeat;
   
    width: 55px;
    height: 11px;
    margin: 0 3px 0 0;
    overflow: hidden;
}

.rating50-t {
    background-position: 0 0px;
}

.rating45-t {
    background-position: 0 -11px;
}

.rating40-t{
    background-position: 0 -22px;
}

.rating_num {
    color: #e09015;
    padding: 0 5px 0 0;
    font-size: 12px;
}

list.wxs

var filters = {
  getRating:function(value){
    return "rating"+Math.round(value)*5+"-t";
  },
   toFix: function (value) {
    return value.toFixed(1)//此处2为保留两位小数
  }
}

module.exports = {
  getRating: filters.getRating,
  toFix: filters.toFix
}

Несколько заметок

1. Измените данные в js страницы

setData({ movies: list })

2. При отображении звёздного рейтинга Дубана звёздный класс фильмов с разным баллом разный.Нам нужно получить класс по баллу, а метод расчёта прописан в файле wxs. Представьте метод в wxml следующим образом

<text class="{{filters.getRating(item.rating.average)}}"></text>

3. Переход на страницу и передача данных могут быть выполнены по запросу.

 var movie = JSON.stringify(that.data.movies[index])
     wx.navigateTo({
       url: '../detail/detail?movie='+movie,
     })

Данные могут быть извлечены в методе onload следующей страницы

onLoad: function (options) {
    var that = this
    var movie = JSON.parse(options.movie)
    console.log(movie.images.small)
    that.setData({
      movie: movie
    })
  },

Схема эффекта выглядит следующим образом

гитхаб-адрес