小程序学习笔记

banner.jpg

1. WXML 要求标签必须是严格闭合的,没有闭合将会导致编译错误。

2. 属性值也可以动态的去改变,有所不同的是,属性值必须被包裹在双引号中

 hello world

 hello world 

3. WXML 中,使用wx:if="{{condition}}" 来判断是否需要渲染该代码块

 1 

 2 

 3 

4. 关于 .json文件

40A25BF2-10DE-4EBA-B491-69503C5A8780.png

5.样式

title:{
  overflow:hidden; /*自动隐藏文字*/

  text-overflow:ellipsis; /*文字隐藏后添加省略号*/

  white-space: nowrap; /**强制不换行*/
}

6.页面跳转动态修改导航栏标题和页面传参问题

动态修改导航栏标题,假如从A页面跳转到B页面,B页面的导航栏标题需要从A页面带过去。
页面A:



在设置bindtap的时候设置一个data-passparam;其中data-前缀是固定的,后面passparam是你要传递的参数,名字随便,但是不能出现大写字母,不然值传不过去。
在点击跳转方法中

bindMessageDetail:function(e){
    vartitle = e.currentTarget.dataset.passparam;
    wx.navigateTo({
      url: "chat/chat?name="+title,
    });
  },

通过e.currentTarget.dataset.passparam获取刚才需要传递的参数,然后拼接到url后值就传递过去了。

在B页面,如果需要获取传递过来的值,需要在生命周期方法onLoad方法中获取

onLoad: function(options) {
    let name= options.name;
  },

,但是如果是需要给导航栏设置title,官方建议在

onReady: function() { },

方法中进行设置。所以如果是动态设置导航栏标题则在onLoad方法先获取传递过来的参数保存起来,然后在onReady方法里进行设置。

Page({
  /**
   * 页面的初始数据
   */
  data: {
navTitle:''
  },
/**
   * 生命周期函数--监听页面加载
   */
  onLoad: function(options) {
    this.data.navTitle = options.name;
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function() {
    wx.setNavigationBarTitle({
      title: this.data.navTitle    // 其他页面传过来的标题名
    })
  },

7.列表渲染

1.在组件上使用wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。默认数组的当前项的下标变量名默认为index,数组当前项的变量名默认为item

   {{index}}: {{item.message}} 

2.使用wx:for-item 指定数组当前元素的变量名,使用wx:for-index 指定数组当前下标的变量名:

   {{idx}}: {{itemName.message}} 

3.类似 block wx:if ,也可以将 wx:for 用在 标签上,以渲染一个包含多节点的结构块。

    {{index}}:     {{item}}  

8.Toast使用和Modal的使用

  1. Toast使用方式一:(不推荐)

在.wxml文件中定义组件

请稍后重试

在js文件data中定义一个变量isShowToast用于控制是否显示Toast,在js文件需要显示Toast的地方

bindTapSearch:function(){
this.setData({isShowToast:true})
}

同时需要实现toastChange方法,不然Toast不会消失

toastChange:function(){
   this.setData({ isShowToast: false })
 },

2.Toast使用方式二:(推荐)
直接调用API控制Toast的显示和隐藏

  • 显示Toast(显示完Toast后过了duration时间会自动隐藏)
wx.showToast({ 
      title: '已发送',
      icon: 'none',  //此处(有success、loading、none三种样式可选)
      duration: 1500
});
  • 隐藏Toast
wx.hideToast();

3.Modal的使用方式一

//官方Modal(使用方式和Toast的方式一一样)
  wx.showModal({
      title: '标题',
      content: '告知当前状态,信息和解决方法',
      confirmText: '主操作',
      cancelText: '次要操作',
      success: function(res) {
        if(res.confirm) {
          console.log('用户点击主操作')
        } elseif(res.cancel) {
          console.log('用户点击次要操作')
        }
      }
})
Modal方式一

4.Modal的使用方式二


//no-cancel:是否隐藏cancel按钮

Modal方式二
  1. 自定义Modal

参见:https://blog.csdn.net/solocoder/article/details/80696752

注意:官方已有组件,所以自定义Modal的时候不能取名为modal,不然调用的会是系统的modal

9.小程序中的slot(插槽)

有时候在自定义组件时,有一部分在某处是不需要显示的,而其他地方需要显示,这时候,可以用slot来控制隐藏的部分;
slot 标签可用在自定义组件中,根据外部传进来的标签,来显示和隐藏 如果需要显示就传递标签进来,如果不需要显示,就不传,这样,可以动态的设置自定义组件的样式,提高了组件的复用性

自定义组件,添加插槽,插槽的name一定要设置,使用时name要相同
   
 {{text}}   
  
  

使用组件,组件名为,name 要和添加时候一直(after)       {{item.nums}}   里面的标签就是传递给插槽的,
注意:最重要的是激活插槽,在自定义组件的JS中,添加一下代码/**    * 启用插槽    */   options:{     multipleSlots: true   }

在组件的wxml中可以包含 slot 节点,用于承载组件使用者提供的wxml结构。
默认情况下,一个组件的wxml中只能有一个slot。需要使用多slot时,可以在组件js中声明启用。

A.js
Component({  
 options: {    
 multipleSlots: true // 在组件定义时的选项中启用多slot支持 
 },  
 properties: { /* ... */ },   methods: { /* ... */ } })

10.事件分类

事件分为冒泡事件和非冒泡事件:

  1. 冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。
  2. 非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。事件绑定的写法同组件的属性,以key、value的形式。

· key以bind或catch开头,然后跟上事件的类型,如bindtap、catchtouchstart。自基础库版本 1.5.0 起,在非原生组件中,bind和catch后可以紧跟一个冒号,其含义不变,如bind:tap、catch:touchstart。
· value 是一个字符串,需要在对应的Page 中定义同名的函数。不然当触发事件的时候会报错。

bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡。
如在下边这个例子中,点击inner view 会先后调用handleTap3和handleTap2(因为tap事件会冒泡到middle view,而middle view 阻止了tap 事件冒泡,不再向父节点传递),点击middle view 会触发handleTap2,点击outer view 会触发handleTap1。

  
 outer view 
    
  middle view   
      
  inner view   
   
 
  
组件间通信与事件(https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)

自定义组件触发事件时,需要使用 triggerEvent 方法,指定事件名、detail对象和事件选项

 

 

Component({  
 properties: {},   
methods: {   
  onTap: function(){     
  varmyEventDetail ={} // detail对象,提供给事件监听函数    
  varmyEventOption ={} // 触发事件的选项     
  this.triggerEvent('myevent', myEventDetail, myEventOption)     }   } })
具体使用参见自定义modal文章对cancel和comfirm事件的处理(https://blog.csdn.net/solocoder/article/details/80696752)

11.如果当前处于登录界面(看不到tab),当用户登录成功后才能进入有tabBar的主页面,使用方法

wx.switchTab({
   url:'/pages/home/index/index'
});

此处url需要使用绝对路径
相对路径:../../此类
绝对路径:类似’/page/’形式,绝对路径以“/”开头,表示根目录

12;微信小程序App()方法与getApp()方法

App()注册一个小程序,小程序的入口方法

App({
 onLaunch: function(options) {
   console.log("onLaunch");
  },
 onShow: function(options) {
     console.log("onShow");
     // Do something when show.
  },
 onHide: function() {
     console.log("onHide");
     // Do something when hide.
  },
 onError: function(msg) {
     console.log(msg)
  },
 test:function() {
   console.log("I am func from App.js");
  },
 globalData: {
   userInfo:null,
   helloFromApp:'Hello,I am From App.js'
  }
})

在其他子页面如何使用test方法呢?
通过getApp获取全局对象,然后进行全局变量和全局方法的使用。

var app = getApp();
console.log(app.globalData.helloFromApp); // 调用全局变量

app.test(); // 调用全局方法

注意:
· App() 必须在 app.js 中注册,且不能注册多个。
· 不要在定义于 App() 内的函数中调用 getApp() ,使用 this 就可以拿到app 实例。
· 不要在onLaunch 的时候调用 getCurrentPages(),此时page 还没有生成

13: 关于:before ::before 和:after ::after的使用

::before用法:view::before,表示在该view组件的前面加入内容 ::after用法:view::after,表示在该view组件的后面加入内容 这里是双冒号,不是单冒号。单冒号是CSS2的内容,双冒号是CSS3的内容。当然微信小程序也是兼容CSS2的写法的
用法

          wxml
               
                {{price}}
                
         wxss
          .container {
                 width: auto;
                 margin: 30rpx;
                 background-color: #fff;
                 text-align: center;
                 }
                .price {
                position: relative;
                display: inline-block;
                font-size: 78rpx;
                color: red;
                }
            .price::before {
                content: "金额:¥";
               position: absolute;
               font-size: 40rpx;
               top: 30rpx;
               left: -160rpx;
               color: black;
            }
           .price::after {
               content: ".00 元";
               font-size: 30rpx;
               top: 40rpx;
               position: absolute;
               right: -90rpx;
               color: black;
               }
       js
           Page({
              onLoad: function() {
              this.setData({
              price: 100
               })
           })
       })
Snip20200325_3.png

14.tips:

如果在app.wxss文件里有样式.styleA{…},那么这个样式A就是一个全局的样式,在其他页面B的wxss样式里,如果有同名的样式styleA,那么在B的样式里会拥有app.wxss文件样式styleA的全部设置。需要注意。

15.修改一个页面默认背景颜色

直接在该页面的page.wxss文件里设置page{background-color:red;},

.banner_container{
width:10vw;
height:230vw;
background-color:#13b5f5
}
page{background-color:red}

16.padding ****就是内边距

padding: 5px; 带一个参数,表示上下左右都是5px距离
padding: 5px 0; 带两个参数,表示什么呢?表示上下都是5px,左右都是0px,就是这里容易出错,切记切记!
padding: 5px 4px 3px 2px; 带四个参数,表示上5px,右4px,下3px,左2px

17.text文本中使用空格符

必须设置属性decode="{{true}}",然后在需要使用的地方加 

{{'申请时间 '+item.applyTime}}

18:设置一个椭圆形按钮

自带的button设置高度一般的圆角显示会有问题,设置view可以解决想要一个椭圆形按钮的问题

.rejectBtn{
   display: flex;
   border: 0.2rpx solid #e4e4e4;
   width: 150rpx;
   height: 64rpx;
   line-height: 32px;
   border-radius: 32px;
   text-align: center;
   justify-content: center;
   align-items: center;
   font-size: 29rpx;
   margin-right: 21rpx;
   color: #666666;
}

19.需求:当用户名和密码都输入的情况下登录按钮才显示可点击,不然是灰色的


        登录
 

20.关于js中的扩展运算符… 的使用

作用:将一个数组转为用逗号分隔的参数序列

  1. 函数调用
l   function add(x, y) {
    return x + y;
   }
   var numbers = [4, 38];
   add(...numbers) // 42

2.通过push函数,将一个数组添加到另一个数组的尾部

   var arr1 = [0, 1, 2];
   var arr2 = [3, 4, 5];
   arr1.push(...arr2);

3.合并数组

var moreArr = [‘3’];
ES5写法:[‘1’,‘2’].concat(moreArr)
ES6写法:[‘1’,‘2’,...moreArr];

4.扩展运算符将字符串转为真正的数组

    [...'hello'] => [“h”,”e”,”l”,”l”,”o”]

21.路由

1.wx.switchTab(Object object): 跳转到tabBar 页面,并关闭其他所有非tabBar 页面
url:需要跳转的tabBar 页面的路径(需在app.json 的 tabBar 字段定义的页面),路径后不能带参数。
success : function 接口调用成功的回调函数
fail : function 接口调用失败的回调函数
complete : function 接口调用结束的回调函数(调用成功、失败都会执行)

2wx.reLaunch(Object object) : 关闭所有页面,打开到应用内的某个页面
url:需要跳转的应用内页面路径,路径后可以带参数。参数与路径之间使用?分隔,参数键与参数值用=相连,不同参数用&分隔;如'path?key=value&key2=value2
success : function 接口调用成功的回调函数
fail : function 接口调用失败的回调函数
complete : function 接口调用结束的回调函数(调用成功、失败都会执行)

3.wx.redirectTo(Object object):关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到tabbar 页面
url:同2
success : function 接口调用成功的回调函数
fail : function 接口调用失败的回调函数
complete : function 接口调用结束的回调函数(调用成功、失败都会执行)

4.wx.navigateTo(Object object) :保留当前页面,跳转到应用内的某个页面。但是不能跳到tabbar 页面。使用 wx.navigateBack 可以返回到原页面。小程序中页面栈最多十层。
url:同2
success : function 接口调用成功的回调函数
fail : function 接口调用失败的回调函数
complete : function 接口调用结束的回调函数(调用成功、失败都会执行)

5.wx.navigateBack(Object object) :关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages 获取当前的页面栈,决定需要返回几层。

参数

delta :number ,返回的页面数,如果delta 大于现有页面数,则返回到首页。
success : function 接口调用成功的回调函数
fail : function 接口调用失败的回调函数
complete : function 接口调用结束的回调函数(调用成功、失败都会执行)

eg:

wx.navigateBack({   delta: 2})

Note:getCurrentPages()

获取当前页面栈。数组中第一个元素为首页,最后一个元素为当前页面。
· 不要尝试修改页面栈,会导致路由以及页面状态错误。
不要在 App.onLaunch 的时候调用 getCurrentPages(),此时 page 还没有生成。
let pages = getCurrentPages(); //当前页面栈集合
使用场景:

  1. 获取当前页面相关信息

l 获取方式一

let pages = getCurrentPages();
let cutentPage = pages[pages.length - 1];

l 获取方式二
注:pop()方法用于删除并返回数组的最后一个元素

let pages = getCurrentPages();
let cutentPage = pages.pop();

2.跨页面赋值

let pages = getCurrentPages();
let prevPage = pages[pages.length - 2]; //上个页面
prevPage.setData({
//直接给上个页面赋值
})

3.页面跳转后自动刷新

wx.switchTab({ 
        url: '../index/index', 
        success: function (e) { 
           var page = getCurrentPages().pop(); //当前页面
            if (page == undefined || page == null) return; 
           page.onLoad(); //或者其它操作
        } 
})

22.注意点:

1.****并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。
2.wx:if 有更高的切换消耗而 hidden 有更高的初始渲染消耗。因此,如果需要频繁切换的情景下,用 hidden 更好,如果在运行时条件不大可能改变则 wx:if 较好。

  1. 有时,组件希望接受外部传入的样式类。此时可以在 Component 中用 externalClasses 定义段定义若干个外部样式类。
/* 组件custom-component.js */
 Component({  
 externalClasses: ['my-class'] 
})


 
 
  

  1. flex布局

flex-shrink属性
当项目在主轴方向上溢出时,通过设置项目收缩因子来压缩项目适应容器。属性值为项目的收缩因子,属性值取非负数,默认1
flex-grow属性
当项目在主轴方向上还有剩余空间时,通过设置项目扩张因子进行剩余空间的分配。属性值为项目的扩张因子,属性值取非负数。默认0
align-self属性
设置项目在行中交叉轴方向上的对齐方式,用于覆盖容器的align-items,这么做可以对项目的对齐方式做特殊处理。默认属性值为auto,继承容器的align-items值,当容器没有设置align-items时,属性值为stretch。

23:模板(template)

WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用。

a.   定义模板
 

b.   使用模板
使用is 属性,声明需要的使用的模板,然后将模板所需要的data 传入,
Page({  data: {   
  item: {   
   index: 0,   
   msg: 'this is a template',    
  time: '2016-09-15'   
 }   } })