小程序教程

微信小程序(应用号)开发新闻客户端的实战课程

字号+ 作者: 来源: 2016-11-23 09:49 我要评论( )

本课程的源码请移步文章末尾

先看下效果图:

一、新建应用

1.内测阶段对于无内测号的开发者,请点无AppId。

2.然后选择一个本地目录作为工程目录。

3.项目名称任意,设置好目录,勾上当前目录创建quick start项目。如图:

4.点击添加项目,这时可以运行的效果。是自己的微信个人信息以及一HelloWorld文本框。

5.右边是调试窗口,有2个警告,是由于没有AppID导致的,可以暂时忽略,不影响开发。

6.提示一下,在app.json中设置debug:true,这样控制台看到实时的交互信息,以及将来在js文件中设置断点,类似与Chrome的调试工具以及Firefox的Firebug。

关于首页配置:

  1. {
  2.   "pages":[
  3.     "pages/index/index",
  4.     "pages/logs/logs"
  5.   ],
  6.   "window":{
  7.     "backgroundTextStyle":"light",
  8.     "navigationBarBackgroundColor": "#fff",
  9.     "navigationBarTitleText": "WeChat",
  10.     "navigationBarTextStyle":"black"
  11.   },
  12.   "debug":true
  13. }
复制代码

其中pages属性表明每一个页面的存在,其中第一条为首页,即pages/index/index

二、请求网络API接口

1.前提条件:

这里需要用到聚合数据的新闻接口,前往:https://www.juhe.cn/docs/api/id/235 注册、申请接口,拿到key,我这里已经申请到一个key:482e213ca7520ff1a8ccbb262c90320a,可以直接拿它做测试,然后就可以将它集成到自己的应用了。

2.使用微信小程序接口来访问网络:

改写index.js文件:

  1. //index.js
  2. //获取应用实例
  3. var app = getApp()
  4. Page({
  5.   data: {
  6.     motto: 'Hello World',
  7.     userInfo: {}
  8.   },
  9.   //事件处理函数
  10.   bindViewTap: function() {
  11.     wx.navigateTo({
  12.       url: '../logs/logs'
  13.     })
  14.   },
  15.   onLoad: function () {
  16.   // 访问聚合数据的网络接口
  17.   wx.request({
  18.     url: 'http://v.juhe.cn/toutiao/index',
  19.     data: {
  20.      type: '' ,
  21.      key: '482e213ca7520ff1a8ccbb262c90320a'
  22.     },
  23.     header: {
  24.         'Content-Type': 'application/json'
  25.     },
  26.     success: function(res) {
  27.       console.log(res.data)
  28.     }
  29.   })

  30.     console.log('onLoad')
  31.     var that = this
  32.     //调用应用实例的方法获取全局数据
  33.     app.getUserInfo(function(userInfo){
  34.       //更新数据
  35.       that.setData({
  36.         userInfo:userInfo
  37.       })
  38.     })
  39.   }
  40. })
复制代码

3.查看效果,检查Console控制台,得到以下信息:

说明已经成功取得到了数据。

三、将json格式的数据渲染到视图

这里要用到swipe组件实现大图轮播,文档见:https://mp.weixin.qq.com/debug/wxadoc/dev/component/swiper.html

1.清空原index.wxml内容,加入如下代码:

  1. <swiper indicator-dots="true"
  2.   autoplay="true" interval="5000" duration="1000">
  3.   <block wx:for="{{topNews}}">
  4.     <swiper-item>
  5.       <image src="{{item.thumbnail_pic_s02}}" class="slide-image" width="355" height="150"/>
  6.     </swiper-item>
  7.   </block>
  8. </swiper>
复制代码

2.相应地在index.js文件的onLoad方法中加入如下代码来获取网络数据

  1. //index.js
  2. //获取应用实例
  3. var app = getApp()
  4. Page({
  5.   data: {
  6.     topNews:[],
  7.     techNews:[]
  8.   },
  9.   onLoad: function () {
  10.     var that = this
  11.   // 访问聚合数据的网络接口-头条新闻
  12.   wx.request({
  13.     url: 'http://v.juhe.cn/toutiao/index',
  14.     data: {
  15.      type: 'topNews' ,
  16.      key: '482e213ca7520ff1a8ccbb262c90320a'
  17.     },
  18.     header: {
  19.         'Content-Type': 'application/json'
  20.     },
  21.     success: function(res) {
  22.       if (res.data.error_code == 0) {
  23.         that.setData({
  24.         topNews:res.data.result.data
  25.         })
  26.       } else {
  27.         console.log('获取失败');
  28.       }
  29.     }
  30.   })

  31.   }
  32. })
复制代码

3.看到轮播已经成功的展示出来了

4.依样画葫芦,同样操作读取列表新闻:

  1. <view class="news-list">
  2.   <block wx:for="{{techNews}}">
  3.     <text class="news-item">{{index + 1}}. {{item.title}}</text>
  4.   </block>
  5. </view>
复制代码

配合样式表,不然列表文字排版是横向的,将以下css加到index.wxss中:

  1. .news-list {
  2.   display: flex;
  3.   flex-direction: column;
  4.   padding: 40rpx;
  5. }
  6. .news-item {
  7.   margin: 10rpx;
  8. }
复制代码

  • 继续美化,文字列表也采用缩略图+大标题+出处+日期的形式

样式表与布局文件 index.wxss

  1. /**index.wxss**/
  2. .news-list {
  3.   display: flex;
  4.   flex-direction: column;
  5.   padding: 40rpx;
  6. }

  7. .news-item {
  8.   display: flex;
  9.   flex-direction: row;
  10.   height:200rpx;
  11.   /*width属性解决标题文字太短而导航缩略偏移*/
  12.   width:100%;
  13. }

  14. .news-text {
  15.   display: flex;
  16.   flex-direction: column;
  17. }

  18. .news-stamp {
  19.     font-size: 25rpx;
  20.     color:darkgray;
  21.     padding: 0 20rpx;
  22.     display: flex;
  23.     flex-direction: row;
  24.     justify-content:space-between;
  25. }

  26. .news-title {
  27.   margin: 10rpx;
  28.   font-size: 30rpx;
  29. }


  30. .container {
  31.   height: 5000rpx;
  32.   display: flex;
  33.   flex-direction: column;
  34.   align-items: center;
  35.   justify-content: space-between;
  36.   /*padding: 200rpx 0;*/
  37.   box-sizing: border-box;
  38. }

  39. .list-image {
  40.   width:150rpx;
  41.   height:100rpx;
  42. }

  43. .swiper-image {
  44.     width: 100%;
  45. }
复制代码

index.wxml

  1. <!--index.wxml-->
  2. <!--index.wxml-->
  3. <swiper indicator-dots="true"
  4.   autoplay="true" interval="5000" duration="1000">
  5.   <block wx:for="{{topNews}}">
  6.     <swiper-item>
  7.       <image src="{{item.thumbnail_pic_s02}}" mode="aspectFill" class="swiper-image"/>
  8.     </swiper-item>
  9.   </block>
  10. </swiper>

  11. <view class="container news-list">
  12.   <block wx:for="{{techNews}}">
  13.     <view class="news-item" data-title="{{item.title}}" data-url="{{item.url}}" bindtap="bindViewTap">
  14.         <view>
  15.           <image class="list-image" src="{{item.thumbnail_pic_s}}" mode="aspectFill"/>
  16.         </view>
  17.       <view class="news-text">
  18.         <text class="news-title">{{item.title}}</text>
  19.         <view class="news-stamp">
  20.           <text>{{item.author_name}}</text>
  21.           <text>{{item.date}}</text>
  22.         </view>
  23.       </view>
  24.     </view>
  25.   </block>
  26. </view>
复制代码

四、跳转详情页与传值

保存当前点击的新闻条目信息中的title,参见官方文档:https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html

传值到详情页

  1. <!--logs.wxml-->
  2. <view class="container">
  3.   <text class="news-title">{{title}}</text>
  4.   <text class="news-info">暂时找不到WebView的组件接口,于是不能加载网页数据</text>
  5. </view>
  6.   //事件处理函数
  7.   bindViewTap: function(event) {
  8.     wx.navigateTo({
  9.       url: '../detail/detail?title='+event.currentTarget.dataset.newsTitle
  10.     })
  11.   }

  12. //index.js
  13.    //事件处理函数
  14.   bindViewTap: function(event) {
  15.     wx.navigateTo({
  16.       url: '../detail/detail?title='+event.currentTarget.dataset.newsTitle
  17.     })
  18.   }
  19. <!--index.wxml-->
  20. //加入data-xxx元素来传值
  21. <view class="container news-list">
  22.   <block wx:for="{{techNews}}">
  23.     <view class="news-item" data-news-title="{{item.title}}" bindtap="bindViewTap">
  24.       <image src="{{item.thumbnail_pic_s}}" mode="aspectFill" class="list-image"/>
  25.       <view class="news-text">
  26.         <text class="news-title">{{item.title}}</text>
  27.         <view class="news-stamp">
  28.           <text>{{item.author_name}}</text>
  29.           <text>{{item.date}}</text>
  30.         </view>
  31.       </view>
  32.     </view>
  33.   </block>
  34. </view>
复制代码

当然也可以通过获取全局的变量的方式传值,这里场景是由一个页面与子页面是一对一传值关系,所以不推荐,可参考quickStart项目中微信个人信息的传值方式来做。 app.js末尾加上

  1.   globalData:{
  2.     userInfo:null,
  3.     newsItem:null
  4.   }
  5. })
复制代码

由于未在官方文档中找到WebView的组件,所以详情的网页正文暂时无法实现。

结语

整体开发过程还是比较舒适的,上手难度不高,过程中用到一定的CSS语法,本质上还是体现了一个H5开发模式,WXML实质上一种模板标签语言。


 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 微信小程序 轮播图 swiper图片组件

    微信小程序 轮播图 swiper图片组件

    2016-11-23 09:49

  • 微信小程序 开发 微信开发者工具 快捷键

    微信小程序 开发 微信开发者工具 快捷键

    2016-11-23 09:49

  • 微信小程序 页面跳转 传递参数

    微信小程序 页面跳转 传递参数

    2016-11-23 09:49

  • 微信小程序 如何获取时间

    微信小程序 如何获取时间

    2016-11-23 09:49

网友点评