zoukankan      html  css  js  c++  java
  • 微信小程序学习

    1、准备工作

    到微信小程序开发平台注册账号,并且下载开发工具获得appid,在小程序开发工具中新建项目,并且填入appid,网址: https://mp.weixin.qq.com/

    2、小程序的文件类型

    样式文件: wxss,  骨架文件: wxml, 逻辑文件:js, 配置: json  =》构成页面元素   其中 app.json  app.wxss app.js这三个文件是全局文件

    注意:json文件中是不能进行代码注释的

    3、app.json中的结构

    {
      "pages":[    //注册的页面
        "pages/index/index",
        "pages/logs/logs"
      ],
      "window":{ //导航栏的全局配置,具体参见文档
        "backgroundTextStyle":"light",
        "navigationBarBackgroundColor": "#fff",
        "navigationBarTitleText": "听风不语",
        "navigationBarTextStyle":"black"
      },
      "style": "v2",
      "sitemapLocation": "sitemap.json"
    }

     4、小程序开发的组件化注册

     小程序中的相对路径与绝对路径

      相对路径: 相对于当前文件目录进行匹配 例如 "component/like/index" 则表示当前目录下的component文件夹的文件,

      绝对路径: 如果 "/component/like/index"则会定位到根目录下的component的文件夹下

    微信小程序页面中注册组件

    相对路径进行注册

    {
      "usingComponents": {
        "love-comp": "../components/love"
      }
    }

    绝对路径进行注册

    {
      "usingComponents": {
        "love-comp": "/components/love"
      }
    }

     注意:在微信小程序页面设计的过程中,要以IPHONE6的尺寸进行设计,通常来讲iphone6的物理尺寸是 750 * 1134,在微信小程序中显示是 375 * 667 是2倍的关系,并且在写样式的时候,使用rpx是表示对应的像素会随着机型的变化进行变大或者缩小,但是如果不希望其随着机型的放大缩小而变化的话,那么就可以使用px进行设置, 如果需要对全局的样式进行配置,那么就可以按以下方法进行设置

    /**app.wxss**/
    page{
      color: red;
    }

    因为小程序在进行页面引入的时候,会自动在外围包一层page元素,此外注意flex与inline-flex的使用

    组件的生命周期函数 =》 这里的生命周期函数都放在lifetimes里面

    lifetimes: {
      created() { //在组件实例刚刚被创建时执行
        console.log('this is created')
      },
      attached() {  //在组件实例进入页面节点树时执行
        console.log('this is attached')
      },
      ready() { //在组件在视图层布局完成后执行
        console.log('this is ready')
      },
      moved() {  //在组件实例被移动到节点树另一个位置时执行
        console.log('this is move')
      },
      detached() { //在组件实例被从页面节点树移除时执行
        console.log('this is detached')
      },
      error(err) {  //每当组件方法抛出错误时执行
        console.log(err)
      }
    }

    5、事件绑定机制

    bind:tap='taphandle'
    bindtap='taphandle'
    catch:tap='taphandle'
    catchtap='taphandle'

    bind与catch的区别在于前者不会阻止冒泡事件,而后面会阻止冒泡事件

    需要在捕获阶段监听事件时,可以采用capture-bindcapture-catch关键字,后者将中断捕获阶段和取消冒泡阶段。

    在下面的代码中,点击 inner view 会先后调用handleTap2handleTap4handleTap3handleTap1

    <view id="outer" bind:touchstart="handleTap1" capture-bind:touchstart="handleTap2">
      outer view
      <view id="inner" bind:touchstart="handleTap3" capture-bind:touchstart="handleTap4">
        inner view
      </view>
    </view>

    如果将上面代码中的第一个capture-bind改为capture-catch,将只触发handleTap2

    <view id="outer" bind:touchstart="handleTap1" capture-catch:touchstart="handleTap2">
      outer view
      <view id="inner" bind:touchstart="handleTap3" capture-bind:touchstart="handleTap4">
        inner view
      </view>
    </view>

     6、组件的properties设定与值的变更

     组件内使用外部传入的值

    Component({
        properties: {   //接收使用properties对象里的值进行接收
            love: {
                type: Boolean,  //类型
                value: false    //默认值
            },
            count: {
                type: Number,
                value: 0
            }
        },
        data: {},
        methods: {
            tapHandle() {
                this.love? this.properties.count --: this.properties.count ++;
                this.love = !this.love
                this.setData({ //当需要更改properties里的值的时候,用setData,程序会先在data中寻找对应的属性,没有那么会到properties中进行查找
                    count: this.properties.count,
                    love: this.love
                })
            }
        }
    });

    注意: 当需要更改properties里的值的时候,用setData,程序会先在data中寻找对应的属性,没有那么会到properties中进行查找

    properties可以声明多个类型

    Component({
      properties: {
        lastLeaf: {
          // 这个属性可以是 Number 、 String 、 Object 三种类型中的一种
          type: Number,
          optionalTypes: [String, Object],
          value: 0
        }
      }
    })

    7、微信内置发送请求的方法 wx.request,并且接入Mock.js

     具体的文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html

     在微信小程序中,判断是否是生产环境,与非生产环境使用

    / /获取当前帐号信息
    const accountInfo = wx.getAccountInfoSync();
    // miniProgram.envVersion的合法值:develop开发版、trial体验版、release正式版

     在微信小程序中接入mock.js

     在app.js上添加代码

    const { miniProgram: { envVersion } } = wx.getAccountInfoSync()  //判断是否是生产环境,如果是生产环境,那么引入mock.js
    if(envVersion === 'develop') {
      const { mockXHR } = require('./mock/data/index')
      mockXHR()
    }

    在项目中添加文件夹mock并且引入 mock.js库文件

     在data/index.js中添加如下代码

    import Mock from '../mock-min'
    import home from './home'
    
    const mocks = [
        ...home
    ]
    
    export function param2Obj(url) {
        const search = url.split('?')[1]
        if (!search) {
            return {}
        }
        return JSON.parse(
            '{"' +
            decodeURIComponent(search)
                .replace(/"/g, '\"')
                .replace(/&/g, '","')
                .replace(/=/g, '":"')
                .replace(/+/g, ' ') +
            '"}'
        )
    }
    
    export function mockXHR() {
        //存储原有的微信小程序的方法
        let _request = wx.request;
        //进行重写wx.request的方法
        Object.defineProperty(wx, 'request', { writable: true })
        //重写微信小程序wx.request的方法,实现mock数据的调用
        wx.request = (req) => {
            let { url } = req;
            let method = req.method || 'get';
            let target = mocks.filter(val => new RegExp(val.url).test(url) && val.type.toLocaleLowerCase() === method.toLocaleLowerCase() )
            if(target.length > 0) {
                let match = target[0];
                if(match.response) {
                    let res = match.response instanceof Function? match.response.call(null, {
                            method, query: param2Obj(url)
                        }): match.response
                    req.success && req.success(Mock.mock(res)) //调用里面的成功方法
                }
            } else {
                return _request(req)   //调用原生的小程序方法,并且返回异步的逻辑
            }
        }
    }
    
    export default mocks

    便可实现mock的使用,这样就可以愉快的制作假数据了;

    export default [
        {
            url: '/classic/latest',
            type: 'get',
            response() {
                return {
                    statusCode: 200,
                    data: {
                        code: 200,
                        data: {
                            "content": "人生不能像做菜,把所有的材料准备好才下锅",
                            "fav_num": 0,
                            "id": 1,
                            "image": "",
                            "index": 7,
                            "like_status": 0,
                            "pubdate": "2018-06-22",
                            "title": "李安《饮食男女》",
                            "type": 100
                        }
                    }
                }
            }
        }
    ]

    注意:在开发阶段如果接入未在小程序中注册的域名会有报错的风险,那么可以在项目中的设置=》项目设置=》不较验合法域名(选中即可)

     二次封装wx.request方法,使用的时候可以进行再改造

    export const BASE_URL = 'http://www.yfbill.club'
    
    const statusConfig = {
        400: '请求语法有误',
        401: '访问被拒绝,您没有访问的权限',
        403: '禁止访问',
        404: '没有找到指定的资源',
        500: '服务器内部错误,请稍后再试'
    }
    
    const dealFail = (res, reject) => {
        let msg = res.statusCode && statusConfig[res.statusCode] || '未知错误,请稍后再试'
        wx.showToast({
            title: msg,
            icon: 'none',
            duration: 3000,
            success() {
                reject(res)
            }
        })
    }
    
    const dealSuccess = (res, resolve, reject) => {
        let { statusCode } = res;
        if(statusCode === 200) {
            let { data } = res
            resolve(data)
        } else {
            dealFail(res, reject)
        }
    }
    
    export const request = (params) => {
        return new Promise((resolve, reject) => {
            !params.success && (params.success = res => { dealSuccess(res, resolve, reject) })
            !params.fail && (params.fail = res => { dealFail(res, reject) })
            let { url } = params;
            !url.startsWith('http') && (params.url = BASE_URL + params.url)
            wx.request(params)
        })
    }

     8、父子组件的传值方式

    子组件

    <!--注意这里的事件不需要添加花括号,在父组件中定义loveEvent对事件进行监听-->
    <love-comp bind:loveEvent="loveEvent" love="{{classical.like_status}}" count="{{classical.fav_num}}"></love-comp>
    //子组件中通过triggerEvent进行对外发送事件
    let isLove = this.properties.love;
    this.triggerEvent('loveEvent', {
        isLove
    })

    父组件

    loveEvent() {
        console.log(arguments)
    }

    20、微信小程序常用指令

    wx.showToast()   //显示提示框,里面有接口调用成功,失败的钩子表示该组件是否调用成功的意思, 一般作为一个信息提示作用,隐藏icon

    wx.showLoading()  //显示loading提示框,关闭用 wx.hideLoading(),  一般作为请求接口时加载用

  • 相关阅读:
    nodejs安装以及配置
    java第三周学习总结
    java第二周学习总结
    java第一周学习总结
    调查问卷
    2016.2.19 学习总结
    第一周学习总结
    第一周学习总结
    假期马原学习计划
    20145335郝昊《java程序设计》第2次实验报告
  • 原文地址:https://www.cnblogs.com/rickyctbu/p/14186890.html
Copyright © 2011-2022 走看看