本文作者:IMWeb 黎清龙 原文出处:IMWeb社区 未经同意,禁止转载
微信小程序刚出来的时候就想玩玩了,个人开发者开放了,终于可以玩玩了~
注册账号跟着文档来就好了,文档请看这里
微信的文档还是很不错的,值得学习
我把微信小程序当做一个框架来探索,因为它的基本语法还是前端,因此对我(前端)来说,并不是一门新的语言
因此,我认为把它作为一个框架更加合适
以下是我在通读微信小程序的官方文档之后的一些理解
虽然我把它当做一个框架来体验,但是对于微信小程序本来说,它还是一个新语言:
它只是用了前端语法,但是它同时又不是完全的前端语法:
因此,作为一门新语言,它该有的东西实际上都有了,比如:
实际上,开发者不需要有任何的基础,就可以上手开发微信小程序,当然,如果有前端开发经验的话,上手就会更快
注意,我说的是框架,并不是组件库,一个微信小程序包含以下内容:
可理解
的生命周期微信小程序这个框架和 Vue 实在是太像太像了,知道 Vue 的,做过微信小程序都应该会有这种感觉
同时微信小程序和 React Native 很像,那就是只能使用框架底层提供的基础组件库
这个基础组件库的底层原理应该也差不多,都是对不同 mobileOS 的底层进行抽象封装,实际上,它们俩有很多组件都是一样的,不是吗?
肯定还会有许多缺点,但是笔者还没开发过,所以肯定是不知道的了
作为腾讯课堂的前端开发一枚,举栗子当然要用自家产品啦,下面简单实现一个类目首页的小程序
内容很简单,同样的,代码也很简单
创建项目的时候,就不要勾选默认的 quick start 项目啦,我们从空项目开始,但是一些内容倒是可以借鉴的~
在根目录,新建app.js
和app.json
,内容如下:
//app.js
App({
onLaunch: function() {
console.log('hello')
}
})
app.js
内容很简单,其实注册 App 的时候根本就不需要任何内容,因为我们不需要用到 App 的生命周期方法和全局数据
我会告诉你这只是用来测试程序能不能跑起来吗?
{
"pages":[
"pages/index/index",
"pages/detail/detail"
],
"window":{
"backgroundTextStyle":"light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "腾讯课堂-公务员类目",
"navigationBarTextStyle":"black"
}
}
app.json
是从 quick start 项目 copy 过来改改的,"page" 就改了 detail 页面,就是详情页啦,"window" 就改了导航的文案
新建 pages
文件夹,然后新建 index
文件夹,然后只要在 /app.json 的 "pages" 里面,添加 "pages/index/index"
Ctrl + s
保存,编辑器就会自动帮我们生成一个页面的基本文件结构啦: index.js
、index.json
、index.wxml
、index.wxss
首先我们先写页面结构 index.wxml
:
<!--pages/index/index.wxml-->
<scroll-view scroll-y class="container">
<view class="hot">
<text class="title">{{hot_title}}</text>
<view class="course" wx:for="{{hot_list}}" wx:for-item="hot_item" wx:key="*this" bindtap="bindCourseTap" data-name="{{hot_item.name}}">
<image class="course-img" src="{{hot_item.cover_url + '220'}}" background-size="cover"></image>
<text class="course-name">{{hot_item.name}}</text>
</view>
</view>
<view class="new">
<text class="title">{{new_title}}</text>
<view class="course" wx:for="{{new_list}}" wx:for-item="new_item" wx:key="*this" bindtap="bindCourseTap" data-name="{{hot_item.name}}">
<image class="course-img" src="{{new_item.cover_url + '220'}}" background-size="cover"></image>
<text class="course-name">{{new_item.name}}</text>
</view>
</view>
</scroll-view>
页面很简单,就两个模块:热门课程模块 和 最新课程模块,都是课程页卡列表,课程页卡也很简单,就一个封面图和课程名称
实际上课程页卡这里可以使用模块语法,但是作者偷懒了,更多高级语法文档都有写,这里只是简单的栗子
然后当然是页面样式 index.wxss
/* pages/index/index.wxss */
.container {
height: 100%;
}
.title {
text-align: center;
font-weight: bold;
display: block;
font-size: 48rpx;
line-height: 60rpx;
margin: 30rpx 0 20rpx;
}
.course {
width: 375rpx;
padding: 0 10rpx;
display: inline-block;
overflow: hidden;
box-sizing: border-box;
margin-bottom: 20rpx;
}
.course-img {
width: 100%;
height: 205rpx;
border-radius: 5rpx;
}
.course-name {
margin-top: 10rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
word-wrap: normal;
width: 100%;
display: block;
}
样式没什么好说的,都是 css 语法
最后就是页面逻辑 index.js
//index.js
//获取应用实例
Page({
data: {
hot_title: '',
hot_list: [],
new_title: '',
new_list: []
},
bindCourseTap: function (e) {
wx.navigateTo({
url: '../../pages/detail/detail?name=' + e.currentTarget.dataset.name
})
},
filter: function (list) {
var ret = [];
var item;
for (var i = 0, l = list.length; i < l; ++i) {
item = list[i];
if (item.name && item.cover_url) {
ret.push(item);
}
}
return ret;
},
onLoad: function () {
var self = this;
wx.showLoading({
mask: true,
title: '课程加载中...',
success: function () {
wx.request({
url: 'https://sas.qq.com/cgi-bin/ke_official_index',
success: function (res) {
self.setData({
hot_title: '热门课程',
hot_list: self.filter(res.data.result.hotCourse),
new_title: '最新课程',
new_list: self.filter(res.data.result.newCourse)
})
},
complete: function () {
wx.hideLoading();
}
})
}
});
}
})
页面逻辑也非常简单,写过 vue 的同学都很熟悉,页面渲染过程就是:
showLoading => request data => render => hideLoading
课程页卡的点击事件就是导航到详情页,同时把课程名称带上(原因后面再说)
首页我们就搞定啦~
和首页一样,创建好目录,在 /app.json 的 "pages" 添加页面路径保存即可
然后同样的内容,直接看结果:
<!--pages/detail/detail.wxml-->
<text class="tips">欢迎,你选择学习的课程是:</text>
<text class="name">{{name}}</text>
/* pages/detail/detail.wxss */
.tips {
display: block;
}
.name {
display: block;
font-size: 40rpx;
line-height: 80rpx;
}
// pages/detail/detail.js
Page({
data: {
name: ''
},
onLoad: function (options) {
this.setData({
name: options.name
});
}
})
没错,作者又偷懒了,课程详情页就是只展示一个课程名称而已!
Ctrl + b
构建,查看调试就可以查看结果了:
就是这么简单~