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(),  一般作为请求接口时加载用

  • 相关阅读:
    Web API 强势入门指南
    毫秒必争,前端网页性能最佳实践
    Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的数据 Managed Heap
    Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍
    Windbg Extension NetExt 使用指南 【1】 ---- NetExt 介绍
    WCF : 修复 Security settings for this service require Windows Authentication but it is not enabled for the IIS application that hosts this service 问题
    透过WinDBG的视角看String
    Microsoft Azure Web Sites应用与实践【4】—— Microsoft Azure网站的“后门”
    企业IT管理员IE11升级指南【17】—— F12 开发者工具
    WCF : 如何将NetTcpBinding寄宿在IIS7上
  • 原文地址:https://www.cnblogs.com/rickyctbu/p/14186890.html
Copyright © 2011-2022 走看看