微信小程序

微信小程序

一、微信模板语言WXML

? 微信模板语言:文件后缀是.wxml.和HTML类似,主要作用:内容展示,数据渲染

<!--WXML非常类似于HTML-->
<!-- <view><image src="/img/1.jpg"></image></view> -->
<view>
 <checkbox checked></checkbox>
</view>

二、数据绑定

<!-- 动态数据渲染   
 1、内容渲染:尖括号中间  
 2、属性值的数据渲染  
 3、数据来自于配套的.js文件中page的data属性的值
 4、如果获取data里面的值,使用{{}}插值表达式
 5、可以直接获取配套js数据
尖括号中间内容渲染-->
?
?
<!-- 1、内容渲染:尖括号中间 -->
<view>
 <view>我叫:{{name}}</view>
 <view>今年:{{age}}</view>
 <view>月薪:{{salary}}</view>
 <view>爱好:{{likes}}</view>
 <view>婚否:{{isMarry==false? "大龄青年":"有对象"}}</view>
 <view>女朋友标准:</view>
 <view>{{girl.name}}</view>
 <view>{{girl.sala}}</view>
</view>
?
<!-- 2、属性值的数据渲染  
       A、常规属性:class、id、name、checked
       B、自定义属性:-->
<!-- 1、直接写值 -->
<view id="123"></view>
?
<!-- 2、渲染data里面的参数作为属性值   注意:切记使用插值表达式{{}}获取data参数-->
<view id="{{salary}}">动态参数值</view>
?
<!-- 3、自定义数字属性 -->
<view data-num="123"></view>
<view data-str="{{name}}"></view>
?
<!-- 4、直接写值会默认为字符串类型   如果要使用boolean,使用写法:{{布尔值}} ""和{}之间不能有空格-->
<checkbox checked="{{false}}">复选框</checkbox>
<checkbox checked="false">不写插值</checkbox>
?

三、逻辑语法

? 逻辑运算:取值渲染还是逻辑运算都要写在插值表达是中 数字运算 字符串拼接 三元表达式

<!-- 数字运算 -->
<view>每月总收入:{{salary + girl.sala}}</view>
?
<!-- 字符串拼接 -->
<view>{{name + "===" + girl.name}}</view>
?
<!-- 三元表达式 -->
<view>{{isMarry == false ? "大龄青年":"有对象"}}</view>

四、列表渲染


<!--
 for(var i=0;i<10;i++){
   只能拿到i下标
 }
?
 for(value of arr){
   value是数组的值
 }
?
 for(key in arr)
?
 wx:for
 1、语法:wx:for="{{数组|对象}}"
 2、下标:默认名叫index 使用加{{}}
 3、循环项:默认名叫item 使用加{{}}
 4、修改下标和循环项的默认名
    修改下标:wx:for-index="名"
    修改默认循环项:wx:for-item="名"
 5、wx:key
    A、即使不写也不会出现任何问题,只是调错方便
    B、为数组制定一个唯一标识,提升遍历效率
    C、写法: wx:key="index"对于普通数组
             wx:key="唯一值的属性" 对于对象
             wx:key="*this" 一般加给数组,this指代数组中遍历出的唯一的item
-->

for循环


<view>
 <!-- 1、写数字:效果是循环n次   index === item 循环出都是下标值-->
 <view wx:for="{{10}}">{{index}} ==== {{item}}</view>
 <!-- 循环普通数组 index下标 item是循环项-->
 <view wx:for="{{arr}}" wx:key="index">{{index}} ==== {{item}}</view>
?
 <view>=====循环对象=====</view>
 <!-- 2、循环对象 index属性名   item属性值  
    修改下标:wx:for-index="名"
    修改默认循环项:wx:for-item="名"
    建议:循环对象时一定改index和item
 -->
 <view wx:for="{{girl}}" wx:for-index="key" wx:for-item="value">
  {{key}} ==== {{value}}
 </view>
?
 <!-- 3、循环对象数组 先循环数组,再循环对象 -->
 <!-- 外层循环数组 -->
 <view>======循环对象数组======</view>
 <view wx:for="{{girls}}" wx:for-item="obj">
   <!-- 内层循环对象 -->
   <view wx:for="{{obj}}" wx:for-index="key" wx:for-item="value">{{key}} === {{value}}</view>
 </view>
?
 <!-- 4、block:写的时候存在,编译的时候不存在 -->
 <block wx:for="{{girls}}" wx:for-item="obj" wx:key="*this">
   <!-- 内层循环对象 -->
   <view wx:for="{{obj}}" wx:for-index="key" wx:for-item="value" wx:key="age">{{key}} === {{value}}</view>
 </block>
</view>

五、共有属性: wx:if|hidden


<!-- 逻辑判断: wx:if|hidden
if(条件表达式){
  语句
}else if(条件表达式){
  语句
}else{
?
}
?
1、条件表达式的结果是true|false
2、条件表达式之间要有顺序
3、if一定是只执行某一个
4、wxif语法: wx:if="{{条件表达式}}" wx:elif="{{条件表达式}}"   wx:else
5、w:if非常类似于vue的if
  原理是根据条件表达式的结果进行创建渲染,(通过|true)或 销毁页面(失败|false)元素
6、弊端:消耗过大
 可以实现组合判断
?
>=10000 换一个
>=8000 卖一个
>=5000 不吃饭
>=3000 再买一车
-->
?
<view>
 <view wx:if="{{sum >= 10000}}">换一个</view>
 <view wx:elif="{{sum >= 8000}}">卖一个</view>
 <view wx:elif="{{sum >= 5000}}">不吃饭</view>
 <view wx:else>再买一车</view>
</view>

hidden:


<!-- hidden 隐藏 1、类似于vue的v-show,通过表达式的结果,来设置指定元素的display:none|block
2、基本语法:hidden="{{条件表达式}}" true隐藏 false显示
3、默认写法:只写hidden代表隐藏当前元素
  false 不隐藏要显示 display:block;
  true 要隐藏不显示 display:none;
-->
<view hidden="{{false}}">hidden隐藏测试</view>

两者区别


<!-- wx:if 和 hidden区别
1、wx:if根据条件表达式的结果进行创建渲染,(通过|true)或 销毁页面(失败|false)元素
  hidden通过表达式的结果,来设置指定元素的display:none|block 结果是false设置display:block显示
2、wx:if创建和销毁,销毁过大,hidden是设置display,销毁小
  频繁切换用hidden,切换次数少用wx:if
-->

六、微信样式语法WXSS:

? 微信样式语法WXSS和css基本一致,例如选择器,样式设置,微信样式语法的文件后缀是.wxss

选择器

注意:‘通配选择器无法在微信小程序中使用,可以使用’

 

 

小程序组件与事件处理

? 组件是在 WXML 模板文件声明中使用的,WXML 的语法和 HTML 语法相似,小程序使用标签名来引用一个组件, 通常包含开始标签和结束标签,该标签的属性用来描述该组件

? 组件是来构造WXML页面结构。组件类似HTML标签,但组件是HTML标签封装版,增加了很多的属性和方法

? 组件分类:1、基础组件(微信小程序自带组件) 2、自定义组件

<image mode="scaleToFill" src="img.png"></image>

? 对于一些容器组件,其内容可以声明在其开始标签和结束标签之间,也就是我们常说的组件嵌套

<view> 
  <image mode="scaleToFill" src="img.png"></image>
  <view>
       <view>1</view>
       <view>2</view>
       <view>3</view>
   </view>
</view>

注意:所有组件名和属性都是小写,多个单词会以英文横杠 "-" 进行连接。

一、基础组件

基础组件分为以下八大类:

(1)、视图容器(View Container)

(2)、基础内容(Basic Content)

(3)、表单(Form)

(4)、导航(Navigation)

(5)、多媒体(Media)

(6)、地图(Map)

(7)、画布(Canvas)

(8)、客服会话

 

1、 view:代替原来的div标签,块级容器

<view hover-class="h_class">点我试试</view>

2、text:

 (1)文本标签

? (2)只能嵌套text

? (3)长按文字可以复制(只有该标签有这个功能)

? (4)可以对空格 回车进行编码

 

? space合法性

<!-- 1、长按文字复制selectable 
    2、对文本内容 进行 解码decode
-->
<text selectable decode>
    text &nbsp; 123 &lt; &gt;
</text>

<!--1、view 块级容器,类似于div标签   内部嵌套其他组件的
   2、hove-class 当按下是给view增加一个样式类 增加一个class值  
      具体的样式类的wxss效果还需要设置
   3、hover-stay-time 效果持续时间 默认400毫秒
   4、hover-start-time 点击多久出现效果,默认50毫秒
   5、hover-stop-propagation 阻止hover-class 冒泡   阻止当前组件向上进行hover-class冒泡
-->
<!-- text 1、类似于span行级容器
          2、text只能嵌套自身,不能嵌套其他组件
          3、user-select 设置文字选择功能 默认false
             用法:1、user-select="{{true}}"   2、user-select
          4、space 显示连续空格
             space="ensp|emsp|nbsp"
          5、decode 开启解码转义功能 默认false
-->

3、image:mode、lazy-load 与 bindload 属性 都是十分便捷的实现,可以说经过小程序的改造后,这个标签的功能大大超过了 img 标签。

A、图片标签,image组件默认宽度320px,高度240px

B、支持懒加载

<!-- image
    1、封装了img图片的组件
    2、src图片路径   建议来自于网络 服务器 oss 七牛云 默认会对图片进行缩放
    3、image 无法直接设置高度的 图片本身的高度就是最根本的
    4、mode 进行图片的缩放和裁剪
       scaleToFill默认值
       aspectFit 保持纵横比缩放 长边完全显示 短边自适应
       widthFix 缩放模式,宽度不变,高度自动变化   保持原来宽高比不变
-->
<image  src="https://img.alicdn.com/imgextra/i1/6000000006807/O1CN01LUYFBI209eeYxvibd_!!6000000006807-0-octopus.jpg" mode="widthFix"></image>
?

4、swiper:微信内置轮播图组件,其中只可放置 swiper-item 组件

<!--  swiper
     1、轮播图组件容器
     2、内部能且仅能嵌套swiper-item 组件
     3、autoplay 是否自动切换 默认false
     4、interval 自动切换时间间隔 默认5000毫秒
     5、circular 是否采衔接滑动 默认false
     6、swiper容器高度不能通过内部的容器给撑起来,只能自己设置   默认宽高:100% 150px
        设置高度公式: calc(750rpx * 图片高度 / 图片宽度)   750rpx是屏幕宽度
-->
<swiper autoplay interval="5000" circular>
 <swiper-item>
   <image src="https://img.alicdn.com/imgextra/i1/6000000006807/O1CN01LUYFBI209eeYxvibd_!!6000000006807-0-octopus.jpg"></image>
 </swiper-item>
 <swiper-item>
   <image src="https://img.alicdn.com/imgextra/i1/6000000001477/O1CN01YK3KnA1MmVcmKVGAC_!!6000000001477-2-octopus.png"></image>
 </swiper-item>
 <swiper-item>
   <image src="https://aecpm.alicdn.com/simba/img/TB183NQapLM8KJjSZFBSutJHVXa.jpg"></image>
 </swiper-item>
</swiper>

5、swiper-item: 仅可放置在 swiper 组件中,宽高自动设置为 100%。

6、 navigator: 导航组件类似超链接标签。

<!-- navigator 
    1、导航组件类超链接
    2、target 跳转目标:self(默认)跳转当前项目   miniProgram跳转其他小程序
    3、url 地址
    4、open-type 跳转方式 默认navigate
       navigate保留当前页面,跳转到应用的某个页面,到不能跳转tabBar页面,保留页面回退
       redirect 关闭当前页面,跳转到应用内的某个页面,但是不允许跳转到 tabBar 页面。保留页面回退
       switchTab 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
-->
<navigator url="/pages/demo1/demo1" >跳转轮播图</navigator>
<navigator url="/pages/demo1/demo1" open-type="redirect">跳转轮播图1(redirect)</navigator>
<navigator url="/pages/omments/comments" open-type="switchTab">跳转轮播图2(switchTab)</navigator>

7、 button: 按钮组件。

8、 icon:图标组件。组件属性的长度单位默认为 px,2.4.0 起支持传入单位(rpx/px)。

9、radio 单选组件,可以通过 color 属性来修改颜色。

? radion-group 组件为单项选择器,内部由多个 radio 组成。

10、checkbox 为多选组件,可以通过 color 属性来修改颜色

?        checkbox-group 为多项选择器,checkbox 需要搭配 checkbox-group ?起使?,

二、小程序事件

? 事件机制是一种非常典型的通讯方式。可以令代码中的不同对象互相传递信息,也可以在应用的,不同层面进行沟通协作。

? 什么是事件?

? (1)事件是视图层到逻辑层的通讯方式;

? (2)事件可以将用户的行为反馈到逻辑层进行处理;

? (3)事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数;

? (4)事件对象可以携带额外信息,如 id, dataset, touches。

1、小程序事件绑定

? A、我们为一个组件绑定一个事件处理函数,通过 bind 关键字来实现。如 bindtap、bindinput、bindchange 等,不同的组件?持不同的事件

<!--事件绑定bind-->
<!-- 1、需要给input标签绑定input事件 绑定关键字bindinput
    2、如何获取 输入框的值: 通过事件源来获取的   e.detail.value
    3、把输入框的值 赋值给data当中  
         不能直接 1、this.data.num =e.detail.value
                 2、this.num =e.detail.value
         正确写法:this.setData({num:e.detail.value})
    4、需要加入一个点击事件  
       1、bindtap
       2、无法在小程序当中 事件中 直接传参
       3、通过自定义属性的方式来传递参数
       4、事件源中获取 自定义属性
-->
<input type="text" bindinput="handInput"/>
<button bindtap="handletap" data-operation="{{1}}">+</button>
<button bindtap="handletap" data-operation="{{-1}}">-</button>
<view>{{num}}</view>

注意:1、handleinput 是自定义的 index.js 里自定义的函数,通过属性 bindinput 绑定了该函数

?           2、handleinput 函数和 data 是平级的;

?           3、事件绑定函数可以是一个数据绑定,如:<input bindinput="{{}}" placeholder="请输入姓名:"/>

?           4、在大多数组件和自定义组件中,bind 后可以紧跟一个冒号,其含义不变,如: bind:input

?           5、绑定事件时不能带参数,不能带括号

?           6、事件传值通过标签?定义属性的?式和 value:<input bindinput="handleInput" data-item="100" />

?           7、事件触发时获取数据,

? 案例:

==================================wxml==========================================================
<view>小程序事件</view>
?
<!-- 1、数据绑定
       通过事件触发对应的函数来绑定函数
    2、bindinput当输入框输入内容时会触发
       事件="处理函数" 处理函数:1、不能写() 2、不传参
    3、普通页面的事件处理函数要写在.js文件中,和data同级
       默认参数event事件对象
    4、输入框的值在value存着
       使用event去获取 event.datail.value
    5、修改data中的属性值
       this.setData({要修改的属性 : 值})
    6、在小程序中没有class事件 替代是tap事件
    7、对于事件传参,可以通过自定义属性来传参
    8、event.currentTarget.dataset 获取所有自定义属性的键值对的对象
    9、在js中使用data的参数 this.data.参数
-->
<input type="text" bindinput="getNum"/>
<view>输入框的值:{{num}}</view>
<button bindtap="add" data-add="{{1}}">+</button>
<button bindtap="sub" data-sub="{{-1}}">-</button>
?
?
========================================js==========================================
// pages/demo3/demo3.js
Page({
?
/**
  * 页面的初始数据
  */
data: {
  num:0
},
//event事件对象
getNum(event){
  const value = event.detail.value;
  // const {value} = event.detail;
  // console.log(event.detail);
  // console.log(event.detail.value);
  // 设置data的num值等于value
  // wx修改data的属性值
  this.setData({
    num : value
  })
},
?
add(event){
  //自定义属性传参还有使用event获取
  console.log(event);
  // const add = event.currentTarget.dataset
  let {add} =event.currentTarget.dataset;
  this.setData({
    //*1字符串转数字
    num : this.data.num * 1 + add
  })
},
sub(event){
  console.log(event);
  let {sub} =event.currentTarget.dataset;
  this.setData({
    //*1字符串转数字
    num : this.data.num * 1 + sub
  })
}
})

2、事件冒泡

? WXML 中分别提供了两种方式,用来绑定事件处理函数:

? A、使用 bind 开头的事件绑定,这种绑定不会阻止冒泡事件向上冒泡;

? B、使用 catch 开头的事件绑定,这种绑定可以阻止冒泡事件向上冒泡

3、事件分类

? 事件主要分为这两类:

? A、冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。

? B、非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。

注意:子级元素触发的非冒泡事件是不能向父级元素逐层向上传递

4、事件对象

5、小程序生命周期

? 生命周期就是指一个对象的生老病死。 从软件的角度来看,生命周期指程序从创建、到开始、暂停、唤起、停止、卸载的过程,这个过程主要是由小程序生命周期函数来完成的。

 应用生命周期 :首先我们的应用生命周期是在App.js里面的一系列函数

 页面生命周期

 组件生命周期

 

 

 

 

 

自定义组件和周期

微信小程序组件分类:

? 组件分类:(1)、基础组件(微信小程序自带组件view|text|icon|image)

? (2)、自定义组件(重用)

1、创建组件

? 创建步骤: 1、新建components文件夹

? 2、新建自定义组件的文件夹(tabs)

? 3、选中自定义组件文件右键新建components(tabs)

解析自定义组件结构

1、由四个部分:.js|.json|.wxml|.wxss 页面就是一个大的组件或者自定义组件就是一个页面

2、自定义组件的.js文件

? App.js 构造方法:App

? 页面.js 构造方法:Page

? 自定义组件的.Js 构造方法:Component

3、自定义组件的.json文件


{
//用于声明当前文件是组件
//对于创建自定义组件是必须的
"component": true,
//用于引用其他自定义组件
"usingComponents": {
      "自定义组件":"路径"
}
}

1.1.2、引入并使用自定义组件


<tabs tabsArr="{{tabsArr}}" binditemChange="itemChange">
<view>slot插槽就是一个占位符,父组件调用子组件的时候再传递标签过来最终这些被传递的标签</view>
</tabs>

 

微信小程序

上一篇:菜谱分享网站微信小程序开发说明(2)-数据库


下一篇:微信公众号Makrdown编辑器,语法你懂吗?