开发小程序项目

2020-08-14  本文已影响0人  songstar

一. 小程序特征(需要背下来的东西)

1.1 小程序没有DOM对象,一切基于组件化

1.2 小程序的四个重要的文件

1.3 储备知识

贴心小建议

学习vue后开发小程序的感觉会爽到飞起!

二. Flex布局简介

2.1 什么是flex布局?

  1. Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。

  2. 任何一个容器都可以指定为Flex布局。

  3. display: ‘flex’

伸缩盒模型.png

2.2 flex属性

1. flex-direction:

flex属性学习地址

三. 移动端适配

3.1 物理像素

3.2. 设备独立像素 & css像素

3.3 dpr比 & DPI & PPI

image.png image.png image.png

四. 小程序适配方案

  1. 以iPhone6的物理像素个数为标准: 750;

  2. 1rpx = 目标设备宽度 / 750 * px;

  3. 注意此时底层已经做了viewport适配的处理,即实现了理想视口

五. 扩展内容

*Iphone的dpr = 2; dpr=2是人类肉眼分辨的极限

六. 登录页小试牛刀

6.1 效果演示

image.png

6.2 注册程序,创建文件

image.png

6.3 应用主文件(入口文件)

6.4 主页结构: index.wxml

<!--pages/index/index.wxml-->
<view class='indexContainer'>
  <image class='avatar' src='/images/index/cart.jpg'></image>
  <text class='userName'>{{msg}}</text>
  <view class='goStudy' bindtap='handleParent'>
    <text bindtap='handleChild'>欢迎开启小程序之旅</text>
  </view>
</view>

6.5 主页样式: index.wxss

/* pages/index/index.wxss */
page {
  height: 100%;
  background-color: pink;
}
.indexContainer {

  display: flex;
  flex-direction: column;
  align-items: center;

}

.avatar {
  width: 200rpx;
  height: 200rpx;
  border-radius: 100px;
  margin: 100px 0;

}

.userName {
  font-size: 32rpx;
  font-weight: 900;/*400 相当于原来的大小*/
  margin: 100rpx 0;

}

.goStudy {
  width: 300rpx;
  height: 80rpx;
  line-height: 80rpx;
  font-size: 28rpx;
  border:1rpx solid #999;
  border-radius: 10rpx;
  text-align: center;

}

6.6 入口文件: app.json配置

{
  "pages": [
    "pages/index/index"
  ],
  "window": {
    "navigationBarBackgroundColor": "#FF00FF",
    "navigationBarTitleText": "欢迎光临",
    "navigationBarTextStyle": "black"

  }
}

七 数据绑定 & 事件

7.1 数据绑定

Page({

  /**
   * 页面的初始数据
   */
  data: {
    msg: "小帅的驿栈"
  }

})
this.setData({
msg: '我是修改之后的数据'
    })

7.2 声明生命周期钩子的函数

Page({

  /**
   * 页面的初始数据
   */
  data: {
    msg: "小帅的驿栈"
  },


  handleParent(){
    console.log("父元素");
  },

  handleChild() {
    console.log("子元素");
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
  
  },

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

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

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

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

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

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
  
  },

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

7.3 获取登录用户的数据

  1. 文档查看位置: API---> 开放接口

  2. 代码示例:


// 获取登录用户的数据

    wx.getUserInfo({

      //withCredentials: true,

      success: (res) => {

        console.log(res);

        let user = res.userInfo;

        this.setData({

          user

        })

      }

    })  

7.4 自定义事件

a) 定义:冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。
冒泡事件列表

a) 定义:当一个组件上的事件被触发后,该事件不会向父节点传递。

b) 非冒泡事件:表单事件和自定义事件通常是非冒泡事件

非冒泡事件

7.5 绑定事件

  1. bind绑定:事件绑定不会阻止冒泡事件向上冒泡

  2. catch 绑定: 事件绑定可以阻止冒泡事件向上冒泡

进程代表程序一次完成的过程,通常打开一个程序就是一个进程,
线程是程序执行的最小单元
谷歌浏览器 多进程多线程

7.6 跳转页面

  1. wx.navigateTo(OBJECT):跳转有记录,可通过回退键进行回退9
// 跳转到list页面

    wx.navigateTo({

url: '/pages/list/list',

      success(){

        console.log('跳转成功');

      }

    })    

  1. wx.redirectTo(OBJECT): 没有记录,不能进行回退

// 跳转到list页面

    wx.redirectTo({

url: '/pages/list/list',

      success(){

        console.log('跳转成功');

      }

    })    

八. 列表页:list

8.1 效果演示

[图片上传失败...(image-914c8c-1596612795519)]

[图片上传失败...(image-5d0912-1596612795519)]

8.2 注册页面

  1. list.wxml

  2. list.wxss

  3. list.js

  4. list.json

4.9组件 & 模板使用

9.1 组件

<view>

  <swiper indicator-dots='true' indicator-color='deepPink'>

    <swiper-item>

      <image src='/images/detail/carousel/iqiyi.png'></image>

    </swiper-item>

    <swiper-item>

      <image src='/images/detail/carousel/vr.png'></image>

    </swiper-item >

    <swiper-item>

      <image src='/images/detail/carousel/wx.png'></image>

    </swiper-item >

  </swiper>

</view>

9.2 模板

  1. 定义模板: name=‘模板名字’
<template name='listTemplate'>

  <view>

    <text>tempalte content</text>

  </view>

</template>

  1. 使用模板

<**import** **src=****"/detail_template/detail_item_template.wxml"** />


  1. 使用模板样式

@import '../templates/list-template.wxss';

4.10 数据存储

  1. 存数据:setStorage, 同步: setStorageSync

// 数据存储

    wx.setStorage({

key: 'isCollected',

      data: oldCollectFlag

    })

  1. 获取数据:getStorage 同步: getStorageSync
let oldCollectFlag = wx.getStorageSync('isCollected');

十 音乐播放控制

10.1 音乐播放

  1. API: wx.playBackgroundAudio

  2. 示例:


wx.playBackgroundAudio({

        dataUrl: detailObj.music.dataUrl,

        title: detailObj.music.title,

        success() {

          console.log('音乐播放成功');

        }

      });

10.2 音乐暂停

  1. API: wx.pauseBackgroundAudio

  2. 示例:


wx.pauseBackgroundAudio

10.3 监听音乐播放暂停

  1. 监听播放API: wx.onBackgroundAudioPlay

  2. 监听暂停API: wx.onBackgroundAudioPause

  3. 示例:


wx.onBackgroundAudioPlay(() => {

      console.log('音乐播放'); // 注意真机上音乐播放监听只能执行一次。

      this.setData({

isMusicPlay: true

      })

      // 修改app数据记录是否播放和播放页面的下标

appDatas.appData.isPlay = true;

appDatas.appData.playPageIndex = this.data.index;

})

 // 监听音乐是否暂停

    wx.onBackgroundAudioPause(() => {

      console.log('音乐暂停');

      this.setData({

isMusicPlay: false

      })

appDatas.appData.isPlay = false;

appDatas.appData.playPageIndex = this.data.index;

    })

10.4 app应用存储公共数据

  1. 存取数据

App({   **data**: {     **isPlay**: **false**,      **playPageIndex**: **null**,      **movies**: {}    }  })

  1. 读取数据

**let** ***app*** = getApp();

app.data.isPlay = false;

备注:app方法配置对象中的属性和方法均为app应用实例的属性和方法

十一 事件委托 & 事件数据传递

11.1 轮播图片点击跳转

  1. 事件委托给父元素:swiper

  <swiper catchtap='imgToDetail' indicator-dots='true' indicator-color='deepPink'>

    <swiper-item>

      <image data-detailId='{{4}}' src='/images/detail/carousel/01.jpg'></image>

    </swiper-item>

    <swiper-item>

      <image data-detailId='{{5}}' src='/images/detail/carousel/02.jpg'></image>

    </swiper-item >

    <swiper-item>

      <image data-detailId='{{6}}' src='/images/detail/carousel/03.jpg'></image>

    </swiper-item >

  </swiper>

11.2 传递事件数据

  1. data-’传递数据key’ = value

11.3 currentTarget 和target的区别

  1. target指向的是触发事件的元素

  2. currentTarget指向的是捕获事件的元素

十二. 数据交互

12.1 发送请求


wx.request({ // 发送请求    **url**: ***API_URL***, // 请求的url    **header**: { // 设置请求头      **'Content-type'**: **'json'**,    },    success: (res) => {  // 请求成功的回调函数      *//* *隐藏提示加载信息*wx.hideToast();      **console**.log(res);  // 请求的成功的数据对象,注意是封装后的对象      **this**.setData({**movies**: res.**data**.subjects})    }  })

12.2 小程序设置

备注:

[图片上传失败...(image-e34a4b-1596612795518)]

[图片上传失败...(image-9157ed-1596612795518)]

12.3 不同页面之间通信

**let** ***appData*** = getApp();  // 获取app中的数据对象

onLoad (options) {    *//* *加载到数据之前给用户显示**‘**正在加载的提示信息**’*wx.showToast({      **title**: **"****加载中****..."**,      **icon**: **"loading"**,      **duration**: 3000    });    wx.request({      **url**: ***API_URL***,      **header**: {        **'Content-type'**: **'json'**,      },      success: (res) => {        *//* *隐藏提示加载信息*wx.hideToast();        **console**.log(res);        **this**.setData({**movies**: res.**data**.subjects})        ***appData***.**appData**.**movies** = res.**data**.subjects; // 将数据更新至公共的app数据对象中      }    })  },


**let** ***appData*** = getApp();

onLoad: **function** (options) {    **console**.log(options.**id**);    **console**.log(***appData***.**appData**.**movies**);    **this**.setData({**movie**: ***appData***.**appData**.**movies**[options.**id**]})  },

上一篇下一篇

猜你喜欢

热点阅读