微信小程序(组件开发)

微信小程序介绍及开发准备(账号,软件)

  • 小程序是什么?

    小程序是一个不需要下载安装就可使用的应用,它实现了应用触手可及的梦想,用户扫一扫或者搜一下即可打开应用。也体现了用完即走的理念,用户不用关心是否安装太多应用的问题。应用将无处不在,随时可用,但又无需安装卸载。”

  • 小程序与应用程序区别

    无需安装、不占内存、易传播

  • 微信小程序有什么优势

    1. 开发成本大大降低
    2. 维护成本低
    3. 不用安装,即开即用,用完就走。省流量,省安装时间,不占用桌面
    4. 小程序作为全新的开放平台,企业只要抓住先机,便可以在红利期占据有利地位
    5. 挥之即来,挥之即去
    6. 用户体验好可增加企业与用户之间的粘性
    7. 营销成本低
    8. 吸引新用户的新大陆
    9. 维护老客户的得力助手
    10. 有利于个性化品牌形象
    11. 提升转化率
  • 小程序能做什么

    • 内容/工具小程序
    • 零售小程序
    • 游戏/娱乐小程序
  • 小程序现状及未来趋势

    现状:小程序在上线一年的时间里日活跃用户达到1.7亿,三四线及以下城市覆盖数达50%,目前已经上线小程序数量超过58万个。

    未来趋势:今年1月9日,艾媒咨询发布的《2017年度中国微信小程序电商应用专题研究报告》称,到2020年,小程序电商的规模将扩大到3.98亿,2018年的增长率会达到157.1%。

  • 微信小程序开发准备

    • 官方文档
    • 小程序账号申请
    • 打开微信开发者工具–>扫码登录–>输入AppID–>选择建立普通快速启动模板

目录结构介绍

wxml

WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构

常用组件

view

text

scroll-view

image

input

radio

radio-group

checkbox

checkbox-group

button

navigator

WXSS 样式

WXSS(WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式

  • 尺寸单位
    rpx(responsive pixel): 可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx
  • 样式导入
    @import后跟需要导入的外联样式表的相对路径,用;表示语句结束。

注意:

静态的样式统一写到 class 中。

style 接收动态的样式,在运行时会进行解析,请尽量避免将静态的样式写进 style 中,以免影响渲染速度。

----

WXML 模板

数据绑定


<view> {{ message }} view>
Page({
  // 数据定义
  data: {
    message: 'Hello MINA!'
  }
})

合法用法:

  • 算术运算
  • 三元运算
  • 字符拼接
  • 组件属性(需要在双引号之内)
  • 控制属性(需要在双引号之内)
  • 关键字(需要在双引号之内)

列表渲染

默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item

<view wx:for="{{array}}">
  {{index}}: {{item.message}}
view>

使用 wx:for-item 可以指定数组当前元素的变量名,

使用 wx:for-index 可以指定数组当前下标的变量名:

<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName">
  {{idx}}: {{itemName.message}}
view>

block wx:for渲染包含多节点的代码块

注意: 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性

<block wx:for="{{[1, 2, 3]}}">
  <view> {{index}}: view>
  <view> {{item}} view>
block>

wx:key

wx:key 的值以两种形式提供

  • 字符串,代表在 for 循环的 array 中 item 的某个 property,该 property 的值需要是列表中唯一的字符串或数字,且不能动态改变
  • 保留关键字 *this 代表在 for 循环中的 item 本身,这种表示需要 item 本身是一个唯一的字符串或者数字。

注意:

  1. 当 wx:for 的值为字符串时,会将字符串解析成字符串数组

  2. 花括号和引号之间如果有空格,将最终被解析成为字符串

条件渲染

<view wx:if="{{length > 5}}"> 1 view>
<view wx:elif="{{length > 2}}"> 2 view>
<view wx:else> 3 view>

block wx:if

注意: 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性

<block wx:if="{{true}}">
  <view> view1 view>
  <view> view2 view>
block>

事件

  • 事件分类

    1. 冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。
    2. 非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。
  • 事件绑定

    事件绑定以bind或者catch开头。

    bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡。

  • 传参

    1. 事件对象

    2. 参数

    
    <view data-alpha-beta="1" data-alphaBeta="2" bindtap="bindViewTap"> DataSet Test view>
    
    bindViewTap:function(event){
      event.currentTarget.dataset.alphaBeta === 1 // - 会转为驼峰写法
      event.currentTarget.dataset.alphabeta === 2 // 大写会转为小写
    }
    

配置文件(app.json及页面json)

每一个小程序页面也可以使用.json文件来对本页面的窗口表现进行配置。 页面的配置比app.json全局配置简单得多,只是设置 app.json 中的 window 配置项的内容,页面中配置项会覆盖 app.json 的 window 中相同的配置项

生命周期

路由

组件

  • 新建一个components文件夹

  • 在components文件夹下面新建一个Diaog文件夹

  • 选中该文件夹,新建 --> Component --> 取名dialog

  • 在dialog.json中添加如下代码

      {
        "component": true,
        "usingComponents": {}
      }
    
  • 完成组件的静态页面部分 dialog.wxml/dialog.wxss

    <view class='dialog_container' hidden="{{!isShow}}">
        <view class='mask'>view>
        <view class='dialog'>
            <view class='dialog-title'>{{ title }}view>
            <view class='dialog-content'>{{ content }}view>
            <view class='dialog-footer'>
                <view class='dialog-btn' catchtap='_cancelEvent'>{{ cancelText }}view>
                <view class='dialog-btn' catchtap='_confirmEvent'>{{ confirmText }}view>
            view>
        view>
    view>
    
      /* components/dialog/dialog.wxss */
    
      .mask {
        position: fixed;
        z-index: 1000;
        top: 0;
        right: 0;
        left: 0;
        bottom: 0;
        background: rgba(0, 0, 0, 0.3);
      }
    
      .dialog {
        position: fixed;
        z-index: 5000;
        width: 80%;
        max-width: 600rpx;
        top: 50%;
        left: 50%;
        -webkit-transform: translate(-50%, -50%);
        transform: translate(-50%, -50%);
        background-color: #FFFFFF;
        text-align: center;
        border-radius: 3px;
        overflow: hidden;
      }
    
      .dialog-title {
        font-size: 18px;
        padding: 15px 15px 5px;
      }
    
      .dialog-content {
        padding: 15px 15px 5px;
        min-height: 40px;
        font-size: 16px;
        line-height: 1.3;
        word-wrap: break-word;
        word-break: break-all;
        color: #999999;
      }
    
      .dialog-footer {
        display: flex;
        align-items: center;
        position: relative;
        line-height: 45px;
        font-size: 17px;
      }
    
      .dialog-footer::before {
        content: '';
        position: absolute;
        left: 0;
        top: 0;
        right: 0;
        height: 1px;
        border-top: 1px solid #D5D5D6;
        color: #D5D5D6;
        -webkit-transform-origin: 0 0;
        transform-origin: 0 0;
        -webkit-transform: scaleY(0.5);
        transform: scaleY(0.5);
      }
    
      .dialog-btn {
        display: block;
        -webkit-flex: 1;
        flex: 1;
        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
        position: relative;
      }
    
      .dialog-footer .dialog-btn:nth-of-type(1) {
        color: #353535;
      }
    
      .dialog-footer .dialog-btn:nth-of-type(2) {
        color: #3CC51F;
      }
    
      .dialog-footer .dialog-btn:nth-of-type(2):after {
        content: " ";
        position: absolute;
        left: 0;
        top: 0;
        width: 1px;
        bottom: 0;
        border-left: 1px solid #D5D5D6;
        color: #D5D5D6;
        -webkit-transform-origin: 0 0;
        transform-origin: 0 0;
        -webkit-transform: scaleX(0.5);
        transform: scaleX(0.5);
      }
    
  • 完成组件逻辑部分 dialog.js

    // components/dialog/dialog.js
    Component({
      options: {
        multipleSlots: true // 在组件定义时的选项中启用多slot支持
      },
      /**
       * 组件的属性列表
       * 用于组件自定义设置
       */
      properties: {
        // 弹窗标题
        title: {
          type: String,
          value: '标题'
        },
        // 弹窗内容
        content: {
          type: String,
          value: '弹窗内容'
        },
        // 弹窗取消按钮文字
        cancelText: {
          type: String,
          value: '取消'
        },
        // 弹窗确认按钮文字
        confirmText: {
          type: String,
          value: '确定'
        }
      },
    
      /**
       * 私有数据,组件的初始数据
       * 可用于模版渲染
       */
      data: {
        // 弹窗显示控制
        isShow: false
      },
    
      /**
       * 组件的方法列表
       * 更新属性和数据的方法与更新页面数据的方法类似
       */
      methods: {
        /*
        * 公有方法
        */
    
        //隐藏弹框
        hideDialog() {
          this.setData({
            isShow: !this.data.isShow
          })
        },
        //展示弹框
        showDialog() {
          this.setData({
            isShow: !this.data.isShow
          })
        },
        /*
        * 内部私有方法建议以下划线开头
        * triggerEvent 用于触发事件
        */
        _cancelEvent() {
          //触发取消回调
          this.triggerEvent("cancelEvent")
        },
        _confirmEvent() {
          //触发成功回调
          this.triggerEvent("confirmEvent");
        }
      }
    }) 
    
  • 在需要使用的page的json文件中,添加如下代码,引入组件

      {
        "usingComponents": {
          "dialog": "/components/Dialog/dialog"
        }
      }
    
  • 在需要的页面使用组件

      <dialog id='dialog' 
        title='CSDN博客' 
        content='小程序组件' 
        cancelText='取消' 
        confirmText='确定'
        bind:cancelEvent="_cancelEvent"  
        bind:confirmEvent="_confirmEvent">
      dialog>
    
      <button type="primary" bindtap="showDialog"> ClickMe! button>
    
    	onReady: function () {
        //获得dialog组件
        this.dialog = this.selectComponent("#dialog");
      },
      showDialog() {
        this.dialog.showDialog();
      },
    
      //取消事件
      _cancelEvent() {
        console.log('你点击了取消');
        this.dialog.hideDialog();
      },
      //确认事件
      _confirmEvent() {
        console.log('你点击了确定');
        this.dialog.hideDialog();
      }
    

你可能感兴趣的:(微信小程序)