美文网首页
开发小程序项目

开发小程序项目

作者: songstar | 来源:发表于2020-08-14 15:57 被阅读0次

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

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

    • 什么是组件?首先我们先接触的是Js模块化(为了代码复用)-->组件化-->工程化

    • 什么叫模块
      将一个大的Js文件,按照一定规则分成小的Js文件,每个Js文件数据是私有的,相对安全,Js模块互相不干扰,如果一个项目用多模块开发,那么就是模块化开发。

    • 什么是组件(即有html+css也有js)
      具有特定功能效果代码的组合,如果一个项目用多组件开发,那么就是组件化开发。

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

    • a. *.js

    • b. *.wxml ---> view结构 ----> 相当于html

    • c. *.wxss ---> view样式 -----> 相当于css

    • d. *. json ----> view 数据 -----> json文件

    1.3 储备知识

    • a. 理解事件机制

    • b. 理解组件化

    • c. 理解数据绑定

    • d. Flex布局

    • e. 移动端适配方案

    贴心小建议

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

    二. Flex布局简介

    2.1 什么是flex布局?

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

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

    3. display: ‘flex’

    伸缩盒模型.png

    2.2 flex属性

    1. flex-direction:

    • row(默认值):主轴为水平方向,起点在左端。

    • row-reverse:主轴为水平方向,起点在右端。

    • column:主轴为垂直方向,起点在上沿。

    • column-reverse:主轴为垂直方向,起点在下沿。

    flex属性学习地址

    三. 移动端适配

    3.1 物理像素

    • 屏幕的分辨率
      能说明清新度,物理像素相当于屏幕的分辨率

    • 设备能控制显示的最小单元,可以把物理像素看成是对应的像素点

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

    • 都是虚拟像素

    • 设备独立像素(也叫密度无关像素),可以认为是计算机坐标系统中的一个点,这个点代表一个可以由程序使用并控制的虚拟像素(比如:CSS 像素,只是在android机中CSS 像素就不叫”CSS 像素”了而是叫”设备独立像素”),然后由相关系统转换为物理像素。

    3.3 dpr比 & DPI & PPI

    • dpr: 设备像素比,物理像素/设备独立像素 = dpr,( 一般以Iphon6的dpr为准 dpr = 2,记死)

    • PPI: 一英寸显示屏上的像素点个数
      750²=562500 记住!ppI值越大,像素越高

    • DPI:最早指的是打印机在单位面积上打印的墨点数,墨点越多越清晰

    image.png image.png image.png

    四. 小程序适配方案

    • 常用的适配 rem(根元素字体的大小) viewport(布局视口)

    • 视觉视口:看到视口大小

    • 布局视口:真正投放的页面,通常比视觉视口要大

    • 布局视口 = 视觉视口,好处页面完整

    • Iphon6: 1rpx(小程序计算单位) = 1物理像素 = 0.5px dpr = 物理像素/设备对立像素
      小程序已经給我们做了适配。

    • 面试的时候如果让你去说小程序适配方案,怎么样去说:
      首先小程序底层已经做了Viewport适配,有个meta标签,下面有个width =d 能让布局视口=视觉视口,一定要说上面有个计算方式,1rpx = 1 物理像素 = 0.5px

    • 微信官方提供的换算方式:

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

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

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

    五. 扩展内容

    • 视网膜屏幕是分辨率超过人眼识别极限的高分辨率屏幕,由苹果公司在2010年在iPhone 4发布会上首次推出营销术语。

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

    • 问题: Iphone6的dpr为多少?Iphone6Plus比Iphone6显示图像清晰吗?
      Iphone6Plus的dpr = 3, Iphone6Plus比Iphone6是一样的,因为肉眼有个极限,dpr再高,dpr = 3 和 dpr = 2是一样的

    六. 登录页小试牛刀

    6.1 效果演示

    image.png

    6.2 注册程序,创建文件

    image.png

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

    • A. App.wxml

    • B. App.wxss

    • C. App.js

    • D. App.json

    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 数据绑定

    • 思想: 同Vue一样数据可以初始化在当前页面的管理内存的data中,页面中使用数据会自动去data里找

    • 初始化数据: 当前页面的js文件

    • 页面的初始数据
    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 小程序设置

    备注:

      1. 小程序出于安全考虑所有的协议都是https协议,且如果没有在开发设置中配置请求的连接是无法访问指定的链接的。
      1. 一个微信小程序的并发网络请求数量被限制在最多5个

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

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

    12.3 不同页面之间通信

    • 1.a页面
    **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数据对象中      }    })  },
    
    
      1. b页面
    
    **let** ***appData*** = getApp();
    
    onLoad: **function** (options) {    **console**.log(options.**id**);    **console**.log(***appData***.**appData**.**movies**);    **this**.setData({**movie**: ***appData***.**appData**.**movies**[options.**id**]})  },
    
    

    相关文章

      网友评论

          本文标题:开发小程序项目

          本文链接:https://www.haomeiwen.com/subject/aoforktx.html