微信小程序-2

微信开发文档 https://developers.weixin.qq.com/miniprogram/dev/framework/

一、app.js中的生命周期函数与globalData(全局变量)

指南 - - - 小程序框架 - - - 注册小程序

删除app.js里的东西,输入App回车,调用生命周期

选项 - - - 重新打开此项目

当小程序初始化完成时,会触发 onLaunch(全局只触发一次)

当小程序启动,或从后台进入前台显示,会触发 onShow

当小程序从前台进入后台,会触发 onHide

当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息

js 复制代码
  onLaunch: function () {
    console.log('hi')
  },

  // globalData 自己添加
  globalData:{
    name:'weixin'
  }

在js文件里调用

js 复制代码
// 调用app.js里的内容
const app = getApp()
console.log(app);
// 得到name的值weixin
console.log(app.globalData.name)

得到数据如下图

在app.js里this可以拿到app对象,在onLaunch里可以修改name值

js 复制代码
  onLaunch: function () {
    this.globalData.name='微信'
  },

二、page页内的onload和data差值表达式

指南 - - - 小程序框架 - - - 注册页面

删除js文件里的所有内容,输入Page点击前面有方块的那个

小程序执行先走onLaunch再走onLoad,app.js文件优先级大于其他js文件

js文件

js 复制代码
  data: {
    name:'zhangsan',
  },

wxml文件

html 复制代码
{{name}}

zhangsan会被渲染到页面

在onLoad里使用this.setData修改data的数据

js 复制代码
  onLoad: function (options) {
    this.setData({
      name:'lisi'
    })
  },

页面中的zhangsan两秒后变为lisi
setTimeout定时器

js 复制代码
  onLoad: function (options) {
    // 设置两秒钟后再进行修改
    // 使用箭头函数,否则会出现指向问题
    setTimeout(()=>{
      this.setData({
        name:'lisi'
      })
    },2000)
  },

三、data中不同数据类型及渲染

指南 - - - 小程序框架 - - - wxml

js 复制代码
  data: {
    name:'张三',
    age:18,
    bool:true,
    number:['一','二','三'],
    user:{
      name:'李四',
      gender:'男',
      age:20
    },
    ls:[{id:1,title:'one',year:2019},{id:2,title:'two',year:2020},{id:3,title:'three',year:2021}]
  },
html 复制代码
{{name}} {{age}} {{bool}}
<view>{{number}}</view>
<view>{{user}}</view>
<view>{{user.name}}</view>
<view>{{user.name +'-'+ user.gender +'-'+ user.age}}</view>

1.条件渲染 if

条件写到{{这}}里

前面加 ! 取反 - - - eg:{{!bool}} data里的bool是true,取反后变为false

注意:if elif else 要放在一起,中间不能有其他内容,否则会报错

html 复制代码
<view wx:if="{{number == '一'}}"> 一 </view>
<view wx:elif="{{number == '一'}}"> 二 </view>
<view wx:else"> 三 </view>
<!-- <view wx:else="{{number == '一'}}"> 三 </view> -->

最后显示为三,因为number是列表['一','二','三'],都错,所以显示else里的值

2.列表渲染 for

html 复制代码
<view wx:for="{{number}}">
  {{item}}
</view>

在wxml里得到了三个包裹着view的文字

wx:for-item 元素
wx:for-index 元素索引

html 复制代码
<view wx:for="{{number}}" wx:for-item='num'>
  {{index+1}} - {{num}}
</view>
<!-- {{index+1}} - {{num}}  中间有空格,所有输出的-左右都有空格 -->
html 复制代码
<view wx:for="{{number}}" wx:for-item='num' wx:for-index='idx'>
  {{idx+1}} - {{num}}
</view>

都得到下面内容

1 - 一

2 - 二

3 - 三

调试器有报错,但不影响 可以使用**wx:key='idx'**解决

html 复制代码
<view wx:for="{{ls}}" wx:key="id">
  <view>{{item.title}} {{item.year}}</view>
</view>

四、bindtap事件绑定触发

指南 - - - 小程序框架 - - - 事件系统 介绍

绑定事件

bind:tap | bindtap

data-自己定义的参数

html 复制代码
<view class="box" data-myname='张三' bindtap='onClick' style="width: 200rpx;height: 200rpx;background: aqua;"></view>
<view class="name">姓名:{{name}}</view>

函数onClick和onLoad平级,写在onLoad之后,函数写完后记得写逗号

js 复制代码
  data: {
    name:''
  },
  
  onClick(){
    this.setData({
      name:'李四'
    })
  },

点击蓝色方块,名字出现


html 复制代码
<view class="box" data-myname='李四' bindtap='onClick' style="width: 200rpx;height: 200rpx;background: aqua;"></view>
<view class="name">姓名:{{name}}</view>
js 复制代码
  data: {
    name:'张三'
  },

  // event是接受参数的
  onClick(event){
    // console.log(event.currentTarget.dataset);
    // let obj = event.currentTarget.dataset;
    // console.log(obj);
    // 使用花括号可以直接拿到值
    let {myname}= event.currentTarget.dataset;
    // console.log(myname)
    this.setData({
      name:myname
    })
  },

使用console.log(event);查看参数

我们定义的参数在currentTarget的dataset里

使用console.log(event.currentTarget.dataset);可以在console里查看自己定义的参数

点击蓝色方块,张三会变成李四

小案例

点击方块,改变方块的大小和颜色

html 复制代码
<view bindtap='clickBox' style="width: {{size}}rpx;height: {{size}}rpx;background: {{color}};color:red;display:flex;justify-content: center;align-items: center;">
随机数:{{number}}
</view>
js 复制代码
  data: {
    color:'pink',
    size:300,
  },

  clickBox(){
    let rdm = parseInt(Math.random()*100);
    // console.log(rdm)
    // let color = 'rgb(100,200,100)';
    let r = parseInt(Math.random()*255);
    let g = parseInt(Math.random()*255);
    let b = parseInt(Math.random()*255);
    // 注意:此处的`是和~一个键
    // ${}
    let color = `rgb(${r},${g},${b})`;
    let size = parseInt(Math.random()*600);
    // 如果size的值小于200,size=200,如果大于用size本身的大小
    size = size<200?200:size
    this.setData({
      number:rdm,
      // 两个值一样可以省略
      color:color,
      size,
    })
  },

Math.random()取的是0到1之间的小数

parseInt()取整

五、表单组件

1.button

html 复制代码
<button>按钮</button>
<button size="mini" type="primary">按钮</button>
<button size="mini" type="warn">按钮</button>
<button size="default" type="default">按钮</button>
<!-- true和false必须写在{{}}里才会生效 -->
<!-- plain是否镂空,背景色透明 -->
<button size="default" type="default" plain="{{true}}">按钮</button>

2.input textarea

input 单行输入框

textarea 多行输入框

value初始值

placeholder输入框为空时占位符

html 复制代码
<input type="text" bindinput="onInput" value="请输入..." placeholder="请输入用户名" placeholder-style="color:red" style="background: aqua;"/>
<view>{{content}}</view>
js 复制代码
  onInput(e){
    // console.log(e);
    let value = e.detail.value;
    this.setData({
      content:value
    })
  },

效果如下:

value.length

value值为空时,value.length为false,!取反,!value.length为true

disable为true是进制使用该按钮

html 复制代码
<button type="primary" disabled="{{!value.length}}">按钮</button>

输入框聚焦时触发 bindfocus="onFocus"

html 复制代码
<input type="text" bindfocus="onFocus" bindinput="onInput" value="" placeholder="请输入用户名" placeholder-style="color:red" style="background: aqua;"/>
<view>{{content}}</view>
<button type="primary" disabled="{{true}}" >按钮</button>
js 复制代码
  onFocus(e){
    console.log(e);
  },

3.checkbox checkbox-group label

box-sizing:border-box; 内填充
width= calc(100% - 40rpx);

html 复制代码
<checkbox-group bindchange="clickChange">
  <view style="margin: 20rpx;">
    <label for="">
      <!-- checked默认选中项 -->
      <checkbox checked value="basketball"/>
      <text>篮球</text>
    </label>    
  </view>
  <view style="margin: 20rpx;">
    <label for="">
      <!-- color选中时对钩的颜色 -->
      <checkbox color="red" value="football"/>
      <text>足球</text>
    </label>    
  </view>
</checkbox-group>

使用label时,点击文字也可以触发选中状态

六、综合案例

指南 - - - 小程序框架 - - - 简易双向绑定

block专门做样式的布局

html 复制代码
<view class="title">经典语录</view>
<view class="out">
  <block wx:if="{{listArr.length}}">
    <view class="list">
      <view class="row" wx:for="{{listArr}}" wx:key="id">
        <view class="text">{{index + 1}}.{{item.title}}</view>
        <view class="close" bindtap='clickClose' data-index="{{index}}">
          <icon type="clear" size="26"/>
        </view>
      </view>
    </view>
    <view class="count">共{{listArr.length}}条语录</view>
  </block>
  <view wx:else style="text-align: center;font-size: 30rpx;padding: 20rpx 0;color:#555;">暂无语录,请添加</view>
  <view class="comment">
    <!-- model双向绑定 -->
    <!-- bindconfirm 点击完成按钮时触发,event.detail = { value } -->
    <!-- 此处敲回车可将内容发布上去 -->
    <input bindconfirm="onSubmit" model:value="{{iptValue}}" type="text" placeholder="请输入文字..." placeholder-style="color:#aaa;font-size:28rpx"/>
    <button bindtap="onSubmit" size="mini" type="primary" disabled="{{!iptValue.length}}">发布</button>
  </view>
</view>
<!-- 在输入框输入内容,下面的内容可以跟着改变 -->
{{iptValue}}
css 复制代码
.title{
  font-size: 50rpx;
  text-align: center;
  color: #3c3c3c;
  padding: 60rpx 0 30rpx;
}
.out{
  width: 690rpx;
  margin: 30rpx;
  box-shadow: 0 15rpx 40rpx rgba(0,0,0,0.1);
  border-radius: 10rpx;
  padding: 30rpx;
  box-sizing: border-box;
}
.out .list .row{
  padding: 15rpx 0;
  border-bottom: 1rpx solid #e8e8e8;
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 34rpx;
  color:#333;
}
.out .list .row .text{
  padding-right: 10rpx;
  box-sizing: border-box;
}
.out .count{
  padding: 20rpx 0;
  text-align: center;
  font-size: 30rpx;
  color: #888;
}
.out .comment{
  display: flex;
  margin-top: 20rpx;
}
.out .comment input{
  flex: 4;
  background: #f4f4f4;
  margin-right: 10rpx;
  height: 100%;
  height: 64rpx;
  border-radius: 10rpx;
  color: #333;
  padding:0 20rpx;
}
.out .comment button{
  flex:1;
}
js 复制代码
Page({

  /**
   * 页面的初始数据
   */
  data: {
    iptValue:'',
    listArr:[
      {id:123123123,title:'啊啊啊啊啊啊啊啊啊'},
      {id:456456456,title:'哈哈哈哈哈哈哈哈哈'},
      {id:789789789,title:'红红火火恍恍惚惚'},
    ]
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    
  },
  // 点击按钮发布
  onSubmit(){
    // console.log(this.data.iptValue);
    let value = this.data.iptValue;
    let arr = this.data.listArr;
    // Appends new elements to an array, and returns the new length of the array.
    // 数组添加内容
    arr.push({
      // id 时间戳
      id:Date.now(),
      title:value,
    })
    this.setData({
      listArr:arr,
      iptValue:'',
    })
  },
  // 点击删除该行内容
  clickClose(e){
    // console.log(e)
    // e.currentTarget.dataset.index  // 得到该行的索引
    let {index} = e.currentTarget.dataset;
    let arr = this.data.listArr;
    // splice删除 Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.
    arr.splice(index,1);
    // console.log(arr);
    this.setData({
      listArr:arr,
    })
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
    
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
    
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
    
  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
    
  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
    
  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {
    
  }
})
相关推荐
chaosama42 分钟前
禁止uni小程序ios端上下拉伸(橡皮筋效果)
ios·小程序
瑶琴AI前端1 小时前
uniapp实现H5和微信小程序获取当前位置(腾讯地图)
微信小程序·小程序·uni-app
丁总学Java6 小时前
页面、组件、应用、生命周期(微信小程序)
微信小程序·小程序·生命周期
编程千纸鹤11 小时前
高校宿舍信息管理系统小程序
小程序·宿舍管理小程序
说私域11 小时前
基于开源 AI 智能名片 S2B2C 商城小程序的视频号交易小程序优化研究
人工智能·小程序·零售
丁总学Java1 天前
微信小程序,点击bindtap事件后,没有跳转到详情页,有可能是app.json中没有正确配置页面路径
微信小程序·小程序·json
说私域1 天前
基于开源 AI 智能名片、S2B2C 商城小程序的用户获取成本优化分析
人工智能·小程序
mosen8681 天前
Uniapp去除顶部导航栏-小程序、H5、APP适用
vue.js·微信小程序·小程序·uni-app·uniapp
qq22951165021 天前
微信小程序的汽车维修预约管理系统
微信小程序·小程序·汽车
尚梦1 天前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app