目录结构:

文件属性

  • js
    页面逻辑文件,用于创建页面对象,以及处理页面生命周期控制和逻辑处理。
  • wxml
  • json
    设置当前页面工作时的 window 的设置,此处会覆盖 app.json 中的设置,也就是说只可以设置 window 中设置的属性
  • wxss

    项目架构

    整个项目的文件构建:
    1. [pages]: // 页面文件夹
    2. [index]: // 独立的页面文件夹
    3. index.wxml
    4. index.wxss
    5. index.json
    6. index.js
    7. [otherPage]:
    8. [...page].xxx
    9. [utils]: // 工具函数文件夹
    10. utils.js // 工具函数文件
    11. [assets]: // 静态资源文件夹
    12. [images]:
    13. xxx.png
    14. app.js // required
    15. app.json // required
    16. app.wxss

    页面设置

    可以出现在两个文件:app.json 和 每个页面中的 [pageName].josn 文件

    全局配置

    // app.json
    1. {
    2. "pages": ["pages/index/index", "pages/logs/logs"],
    3. "window": {
    4. "backgroundTextStyle": "light", // 下拉刷新部分的颜色
    5. "navigationBarBackgroundColor": "#fff", // 导航条的背景颜色
    6. "navigationBarTitleText": "WeChat", // 调整导航条上的文本
    7. "navigationBarTextStyle": "black" // 导航条文字颜色
    8. },
    9. "style": "v2", // 指定使用升级后的weui样式
    10. "sitemapLocation": "sitemap.json" // 指明 sitemap.json 的位置
    11. }

    标签栏的配置

    1. // app.json
    2. "tabBar": {
    3. "color": "#c0c0c0", // 文字颜色
    4. "selectedColor": "#fff", // 选中文字颜色
    5. "backgroundColor": "#2b3b49",// 背景
    6. "borderStyle": "white",// 边框色
    7. "position":"top", // 位置,在顶部时,没有图标
    8. "list": [
    9. {
    10. "pagePath": "foo",
    11. "text": "text",
    12. "iconPath": "iconPath",
    13. "selectedIconPath": "selectedIconPath"
    14. },
    15. {
    16. "pagePath": "index",
    17. "text": "text",
    18. "iconPath": "iconPath",
    19. "selectedIconPath": "selectedIconPath"
    20. }
    21. ]
    22. }

    完整的全局配置

页面配置

// [pageName].json

  1. {
  2. "navigationBarBackgroundColor": "#ffffff",
  3. "navigationBarTextStyle": "black",
  4. "navigationBarTitleText": "微信接口功能演示",
  5. "backgroundColor": "#eeeeee",
  6. "backgroundTextStyle": "light"
  7. }

独立定义每一个页面的属性,比如顶部颜色,是否允许下拉刷新等
页面的配置只能设置 app.json 中 window 配置型的内容,页面中配置项会覆盖 app.json
的 window 中的相同的配置项。

生命周期

// app.js

  1. // app.js
  2. App({
  3. onLaunch(options) {
  4. // Do something initial when launch.
  5. },
  6. onShow(options) {
  7. // Do something when show.
  8. },
  9. onHide() {
  10. // Do something when hide.
  11. },
  12. onError(msg) {
  13. console.log(msg)
  14. },
  15. globalData: 'I am global data',
  16. })

应用的生命周期

  1. // [pageName].js
  2. Page({
  3. data: {
  4. text: 'This is page data.',
  5. },
  6. onLoad: function (options) {
  7. // 页面创建时执行
  8. },
  9. onShow: function () {
  10. // 页面出现在前台时执行
  11. },
  12. onReady: function () {
  13. // 页面首次渲染完毕时执行
  14. },
  15. onHide: function () {
  16. // 页面从前台变为后台时执行
  17. },
  18. onUnload: function () {
  19. // 页面销毁时执行
  20. },
  21. onPullDownRefresh: function () {
  22. // 触发下拉刷新时执行
  23. },
  24. onReachBottom: function () {
  25. // 页面触底时执行
  26. },
  27. onShareAppMessage: function () {
  28. // 页面被用户分享时执行
  29. },
  30. onPageScroll: function () {
  31. // 页面滚动时执行
  32. },
  33. onResize: function () {
  34. // 页面尺寸变化时执行
  35. },
  36. onTabItemTap(item) {
  37. // tab 点击时执行
  38. console.log(item.index)
  39. console.log(item.pagePath)
  40. console.log(item.text)
  41. },
  42. // 事件响应函数
  43. viewTap: function () {
  44. this.setData(
  45. {
  46. text: 'Set some data for updating view.',
  47. },
  48. function () {
  49. // this is setData callback
  50. }
  51. )
  52. },
  53. // 自由数据
  54. customData: {
  55. hi: 'MINA',
  56. },
  57. })

app.js 文件
  1. // app.js
  2. # 每一个js文件都有单独的作用域
  3. # const app = getApp() 全局注册的app实例对象
  4. App({ // App 用于创建一个应用的实例对象
  5. onLanch: function(){
  6. # 在整个应用启动时触发
  7. # 只会触发一次
  8. const app = getApp()
  9. console.log(app.bar)
  10. },
  11. onShow: function (){
  12. # 应用程序显示到屏幕上触发
  13. # 每次成为焦点状态会触发
  14. console.log(options)
  15. },
  16. onHide: function (){
  17. // 隐藏程序到后台
  18. },
  19. onError: function(msg){
  20. # msg 是一个字符串,不是一个错误对象
  21. # 程序中代码出现异常会出错,之后触发
  22. // 只能捕获运行阶段的异常
  23. console.log(msg)
  24. },
  25. # 除了生命周期里面约定的钩子函数,还可以定义任何成员
  26. # 定义在这里的成员可以在后续的每一页面中共享
  27. otherFun: function (){
  28. # 任何业务处理成员函数
  29. //
  30. },
  31. otherVar: 'foo',
  32. globalData: {
  33. userInfo: null
  34. }
  35. })

页面的生命周期

  1. // pages/foo/foo.js
  2. # 注册一个 page 实例对象
  3. Page({
  4. /**
  5. * 页面的初始数据
  6. */
  7. data: {
  8. # 暴露数据到页面上
  9. },
  10. /**
  11. * 生命周期函数--监听页面加载
  12. */
  13. onLoad: function (options) {
  14. # 适合去做数据的初始化
  15. },
  16. /**
  17. * 生命周期函数--监听页面初次渲染完成
  18. */
  19. onReady: function () {
  20. # 当页面准备好了 => 数据渲染完了,页面渲染完成。 == window.onload
  21. # 只有页面加载才可以 设置标题
  22. },
  23. /**
  24. * 生命周期函数--监听页面显示
  25. */
  26. onShow: function () {
  27. # 页面进入到焦点状态 =>在前台展示了
  28. },
  29. /**
  30. * 生命周期函数--监听页面隐藏
  31. */
  32. onHide: function () {
  33. # 页面进入到后台状态
  34. },
  35. /**
  36. * 生命周期函数--监听页面卸载
  37. */
  38. onUnload: function () {
  39. # 可以用于在页面卸载之前保存页面状态
  40. },
  41. /**
  42. * 页面相关事件处理函数--监听用户下拉动作
  43. */
  44. onPullDownRefresh: function () {
  45. },
  46. /**
  47. * 页面上拉触底事件的处理函数
  48. */
  49. onReachBottom: function () {
  50. },
  51. /**
  52. * 用户点击右上角分享
  53. */
  54. onShareAppMessage: function () {
  55. }
  56. })

模板语法

数据绑定

{{ msg }}

列表渲染

  • 条件渲染

    1. <!-- wx:if wx:elif wx:else hidden -->
    2. <text wx:if="{{ isLoading }}">loading....</text>
    3. <view wx:else>
    4. <text>page was loading done</text>
    5. </view>
    6. // hidden 类似 wx:if 频繁切换用 hidden,不常使用用 wx:if
    7. <text hidden="{{ !isLoading }}">loading...</text>
    8. <text hidden="{{ isLoading }}">loading done!!!</text>
  • 列表渲染

    1. <view wx:for="{{ list }}" wx:for-item="person" wx:key="id">
    2. <text>{{ person.id }}:</text>
    3. <text>{{ person.name }}</text>
    4. </view>
    5. // block 渲染一个包含多节点的结构块 block 最终不会变成真正的 dom 元素
    6. <block wx:for="{{[1,2,3,4]}}" wx:key="*this">
    7. <view>{{index}}:</view>
    8. <view>{{item}}</view>
    9. </block>

    事件处理

    bind 关键字实现,bindtap、bindinput、bindchange

    1. <input bindinput="handleInput" />
    1. Page({
    2. handleInput(e) {
    3. console.log(e)
    4. console.log('值被改变了!')
    5. },
    6. })

    注意
    绑定事件不能带参数,不能带括号,下面是错误写法

    1. // 错误 <input bindinput="handleInput(100)" />

    事件传值:通过标签自定义属性的方式 和 value

    1. <input bindInput="handleInput" data-item="100" />

    事件触发时,获取数据

    1. handleInput(e){
    2. console.log(e.currentTarget.dataset)
    3. console.log(e.detail.value)
    4. }

    样式 WXSS

    尺寸单位: rpx

    小程序中使用 less

    原生小程序不支持 less,其他基于小程序的框架大都支持。如: wepy、mpvue、taro 等。
    在小程序中实现支持:

  1. 使用 vscode 编辑
  2. 安装插件 easy less
  3. 在 vscode 的配置下加入配置:

    1. "less.compile":{
    2. "outExt": ".wxss"
    3. }
  4. 在要编写样式的地方,新建 less 文件,如 index.less,然后正常编辑即可。

    常见组件

    常见的布局组件

  • view
    替代原来的 div 标签
  • text
    文本标签;
    只能嵌套 text
    长按文字可以复制
    可以对空格回车进行编码
  • rich-text
    富文本标签
  • button
  • image
    图片标签;
    image 组件默认宽度 320 高度 240
    mode:图片裁剪、缩放的模式。
    lazy-laod:图片懒加载
    支持懒加载
  • navigator
    导航组件,类似超链接标签
  • icon
  • swiper
    微信内置轮播图组件
  • radio
  • checkbook

    创建自定义组件

    类似于页面,新建文件夹 page/ components/ myHeader,由 json、wxml、wxss、js 文件组成
  1. 声明组件
    需要在组建的 json 文件中

    1. {
    2. "component": true
    3. }
  2. 编辑组件
    在 wxml 文件中编辑组件模板,在 wxss 文件中加入组件样式
    slot 插槽 类似 vue 中的 slot

    1. <view>
    2. {{innerText}}
    3. <slot></slot>
    4. </view>
    1. .inner {
    2. color: red;
    3. }
  3. 注册组件
    在组件的 js 文件中,需要使用 Component() 来注册组件,并提供组件的属性定义、内部数据和自定义方法

    1. // myHeader.js
    2. Component({
    3. properties: {
    4. innerText: {
    5. type: string,
    6. value: 'default value',
    7. },
    8. data: {
    9. somaData: {},
    10. },
    11. methods: {
    12. customMethod: function () {},
    13. },
    14. },
    15. })
  4. 声明引入 自定义组件
    在页面的 json 文件中进行引用声明,还要提供对应的组件名和组件路径。

    1. // index.json
    2. "usingComponents":{
    3. "my-header": "/components/myHeader/myHeader"
    4. }
  5. 页面中使用自定义组件

    1. <view>
    2. <my-header inner-text="some text">
    3. <view>用来替代 slot 的内容</view>
    4. </my-header>
    5. </view>

    自定义组件传参

  6. 父组件通过属性的方式给子组件传参

  7. 子组件通过事件的方式向父组件传参

父组件代码:

  1. <tabs tabItem="{{tabs}" bindmytap="onMytab" />
  1. // page.js
  2. data: {
  3. tabs: [
  4. { name: 'aaa', age: 12 },
  5. { name: 'bbb', age: 13 },
  6. ]
  7. },
  8. onMyTab(e){
  9. console.log(e.detail)
  10. }

子组件代码

  1. <view>
  2. <view class="tab_title">
  3. <block wx:for="{{tabItems}}" wx:key="{{item}}">
  4. <view bindtap="handleItemActive" data-index="{{index}}"
  5. >{{item.name}}</view
  6. >
  7. </block>
  8. </view>
  9. <view class="tab_content">
  10. <slot></slot>
  11. </view>
  12. </view>
  1. // com.js
  2. Component({
  3. properties: {
  4. tabItems: {
  5. type: Array,
  6. value: [],
  7. },
  8. },
  9. /**
  10. * 组件的初始数据
  11. */ data: {},
  12. /**
  13. * 组件的方法列表
  14. */ methods: {
  15. handleItemActive(e) {
  16. this.triggerEvent('mytap', 'haha')
  17. },
  18. },
  19. })