微信小程序零碎知识点

1、在wxml中只有用text标签包裹的文本才能在手机上长按选中

2、小程序的自适应单位是rpx,一般情况下不要使用px

3、每一个页面都是一个文件夹,下面的wxml、wxss、json、js文件最好和文件夹名称一致,这样在app.json中配置页面的时候只需一行即可

例如有一个welcome欢迎页面,那么我们如下操作:
这里写图片描述
在app.json中配置时,只需要一行即可完成这个页面的配置,同时也无需在wxml文件中引入对应的wxss样式文件

{
  "pages":[
    "pages/welcome/welcome"
  ]
}

4、每一个wxml文件实际上都隐藏了一个根节点page

5、不能在app.json中使用注释

6、text标签可以嵌套

如果我们想让一行文字显示不同的颜色,除了使用多个同级的text标签分别设置样式外,我们还可以使用text标签嵌套的方式。

<text class='user-name'><text style='color:red'>Hello</text>,轻风起自远东</text>

上面这行代码就实现了Hello为红色,轻风起自远东为黑色的效果。


7、app.json中page下的第一个页面代表了小程序启动时显示的第一个页面

8、编写wxml布局时,使用弹性盒子模型的效率是最高的

9、js文件结构与Page页面的生命周期

在js文件中调用Page方法,会智能生成js的文件结构,其中包含了Page页面的生命周期函数,我们所有的方法和变量都需要在Page方法中完成

Page({

  /**
   * 页面的初始数据
   */
  data: {

  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },

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

  },

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

  },

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

  },

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

  },

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

  },

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

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})

Page页面生命周期函数的执行顺序:onLoad(页面初始化)——onShow(页面显示)——onReady(页面渲染)——onHide(页面隐藏)——onUnload(页面关闭)


10、数据绑定

小程序没有DOM节点,也不需要获取DOM节点就可以直接进行数据绑定

1、数据单向绑定

所谓单向绑定指的是数据只能从脚本文件单向传递到wxml文件,wxml文件无法改变脚本文件data对象中的数据

在脚本文件的data对象中写入数据,并在wxml中使用双花括号{{ }}进行调用

    data: {
        date: "Sep 18 2016",
        title: "正是虾肥蟹壮时",
    },

调用如下:

<text>当前日期:{{date}}</text>

这里需要注意的是,如果是有引号的时候,不能把引号去掉,例如下面src属性是需要引号和双花括号同时存在的

<image src='{{post_img}}'></image>

2、数据动态绑定

从服务器获取数据一般在onLoad方法中实现,假设post_content1就是我们从服务器获取的数据,获取到数据之后我们需要调用this.setData(post_content1)将数据添加到data对象中

    onLoad: function (options) {
        var post_content1 = {
            date: "Sep 18 2016",
            title: "正是虾肥蟹壮时",
            post_img: "/images/post/crab.png",
            content: "啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊阿啊啊啊啊啊",
            view_num: "112",
            collect_num: "96",
            author_img: "/images/avatar/1.png",
        };
        this.setData(post_content1);
    },

在wxml调用数据的方法和单向绑定是一样的,使用双花括号即可。

3、数据分离

在项目开发中,我们是不允许将数据存放在业务脚本中的,数据就是数据,业务就是业务,混杂在一起容易造成项目维护难度提升,耦合度提高,因此我们需要将数据单独分离出来。

创建一个新的data目录,在data目录下面创建一个专门用于存放数据的脚本文件posts-data.js,并将数据导出:

var local_database = [
    {
        date: "Sep 18 2016",
        title: "正是虾肥蟹壮时",
        imgSrc: "/images/post/crab.png",
        avatar: "/images/avatar/1.png",
        content: "啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊阿啊啊啊啊啊",
        reading: "112",
        collection: "96",
    },
    {
        date: "Nov 25 2016",
        title: "比利·林恩的中场故事",
        imgSrc: "/images/post/crab.png",
        avatar: "/images/avatar/1.png",
        content: "啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊阿啊啊啊啊啊",
        reading: "112",
        collection: "96",
    },
];

/*导出数据*/
module.exports = {
    postsList: local_database,
}

之后在业务脚本中通过require获取数据

/*不能用绝对路径,只能用相对路径*/
var postData = require('../../data/posts-data.js');

在onLoad中将数据绑定到data对象里

    onLoad: function (options) {
        this.setData({
            posts_key: postData.postsList,
        });
    },

关于数组数据的循环获取可以参考13、wxml中的for循环

11、属性值为布尔值的特殊情况

我们有如下一个swiper组件,我们想令其水平滑动,因此需要将vertical设置为false

<swiper vertical='false' indicator-dots='true' autoplay='true' interval='5000'>

但是我们直接设置为false是无效的!因为小程序在解析字符串的时候会将其转换为布尔值,字符串“false”不为空,因此会被解析为true,如果我们想使用false的话需要使用到双花括号:

<swiper vertical='{{false}}' indicator-dots='true' autoplay='true' interval='5000'>

12、控制节点的显示和隐藏

控制节点的显示和隐藏我们需要使用微信小程序里的一个特殊属性wx:if

<!--隐藏-->
<image wx:if='{{false}}' class='post-author' src='/images/avatar/1.png'></image>
<!--显示-->
<image wx:if='{{true}}' class='post-author' src='/images/avatar/1.png'></image>

当然了,小程序中还有其他的写法例如:

<image wx:if='{{i===1}}' class='post-author' src='/images/avatar/1.png'></image>
<image wx:elif='{{i===2}}' class='post-author' src='/images/avatar/2.png'></image>
<image wx:else class='post-author' src='/images/avatar/3.png'></image>

这样写的意思就是如果i为1就显示1.png如果i为2就显示2.png否则就显示3.png


13、wxml中的for循环

有时我们需要将一个节点根据从服务器获取的数据多次显示,这时我们就需要用到wxml中的for循环来实现,我们从服务器获取的数据如下posts_content:

    onLoad: function (options) {
        //从服务器获取的以数组形式存放的数据
        var posts_content = [
            {
                date: "Sep 18 2016",
                title: "正是虾肥蟹壮时",
                post_img: "/images/post/crab.png",
                author_img: "/images/avatar/1.png",
                content: "啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊阿啊啊啊啊啊",
                view_num: "112",
                collect_num: "96",
            },
            {
                date: "Nov 25 2016",
                title: "比利·林恩的中场故事",
                post_img: "/images/post/crab.png",
                author_img: "/images/avatar/1.png",
                content: "啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊阿啊啊啊啊啊",
                view_num: "112",
                collect_num: "96",                
            }
        ];
        this.setData({
            posts_key: posts_content,
        });
    },

注意这里不能直接使用this.setData(posts_content)来将服务器获取的数组形式的数据放到data对象中,因为小程序会默认将posts_content的值直接复制粘贴到data中,如果我们这样做,实际上data对象会是如下形式:

    data: {
            {
                date: "Sep 18 2016",
                title: "正是虾肥蟹壮时",
                post_img: "/images/post/crab.png",
                author_img: "/images/avatar/1.png",
                content: "啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊阿啊啊啊啊啊",
                view_num: "112",
                collect_num: "96",
            },
            {
                date: "Nov 25 2016",
                title: "比利·林恩的中场故事",
                post_img: "/images/post/crab.png",
                author_img: "/images/avatar/1.png",
                content: "啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊阿啊啊啊啊啊",
                view_num: "112",
                collect_num: "96",                
            }
    },

这样就不再是一个数组的形式,也就无从在wxml中调用这些数据,因此我们需要使用下面这种形式,将posts_content数组存放在变量posts_key中

        this.setData({
            posts_key: posts_content,
        });

这样data对象就会是如下形式,这样我们就能在wxml文档中调用数组中的数据了。

    data: {
        posts_key:[
            {
                date: "Sep 18 2016",
                title: "正是虾肥蟹壮时",
                post_img: "/images/post/crab.png",
                author_img: "/images/avatar/1.png",
                content: "啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊阿啊啊啊啊啊",
                view_num: "112",
                collect_num: "96",
            },
            {
                date: "Nov 25 2016",
                title: "比利·林恩的中场故事",
                post_img: "/images/post/crab.png",
                author_img: "/images/avatar/1.png",
                content: "啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊阿啊啊啊啊啊",
                view_num: "112",
                collect_num: "96",                
            }
        ]
    },

下面我们在wxml中使用for循环,我们首先需要将需要循环显示的模块用block标签包裹起来,接着在block标签中设置对应的属性:
wx:for属性需要赋与其一个存放数据的数组;而wx:for-item属性的值指代每个数组中的数据项,也可以不写,默认是item指代;wx:for-index的值指的是每个数据项在数组中的序号,从0开始,需要使用双花括号指代,也可以不写,默认是idx

    <!--新闻列表-->
    <block wx:for='{{posts_key}}' wx:for-item="item" wx:for-index="idx">
        <view class='post-container'>
            <view class='post-author-date'>
                <image class='post-author' src='{{item.author_img}}'></image>
                <text class='post-date'>{{item.date}}</text>
            </view>
            <text class='post-title'>{{item.title}}</text>
            <image class='post-image' src='{{item.post_img}}'></image>
            <text class='post-content'>{{item.content}}</text>
            <view class='post-like'>
                <image class='post-like-image' src='../../images/icon/chat.png'></image>
                <text class='post-like-font'>{{item.collect_num}}</text>
                <image class='post-like-image' src='../../images/icon/view.png'></image>
                <text class='post-like-font'>{{item.view_num}}</text>
            </view>
        </view>
    </block>

14、页面跳转

页面跳转我们通常使用三种方法:

  1. wx.navigateTo()
  2. wx.redirectTo()
  3. wx.switchTab()

下面我们来详细了解一下三种方法的不同之处

  1. wx.navigateTo指的是从父级页面跳转到子级页面,即跳转后的页面左上角有返回键
  2. wx.redirectTo指的是平行跳转,即跳转后的页面左上角没有返回键
  3. wx.switchTo指的是跳转到有tabbar的页面,上面两种方法无法跳转到有tabbar的页面
    onTap: function () {
        /*从父级页面跳转到子级页面,即跳转后的页面左上角有返回键*/
        wx.navigateTo({
             url: '../posts/post',
        });

        /*平行跳转,即跳转后的页面左上角没有返回键*/
        wx.redirectTo({
            url: '../posts/post',
        });

        wx.switchTab({
            url: "../posts/post"
        });
    },

15、事件机制

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

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

wxml中的冒泡事件列表:

  1. touchstart:手指触摸动作开始
  2. touchmove:手指触摸后移动
  3. touchcancel:手指触摸动作被打断,如来电提醒,弹窗
  4. touchend:手指触摸动作结束
  5. tap:手指触摸后马上离开
  6. longpress:手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发
  7. longtap:手指触摸后,超过350ms再离开(推荐使用longpress事件代替)
  8. transitionend:会在 WXSS transition 或 wx.createAnimation 动画结束后触发
  9. animationstart:会在一个 WXSS animation 动画开始时触发
  10. animationiteration:会在一个 WXSS animation 一次迭代结束时触发
  11. animationend:会在一个 WXSS animation 动画完成时触发

需要绑定事件的元素需要使用bind或者catch+事件名这样的属性:

    <view class='moto-container' bindtap='onTap'>
        <text class='moto'>开启小程序之旅</text>
    </view>

上面这串代码我们使用了bind+tap这样的属性来定义了一个手指点击触发onTap方法的事件

    onTap: function (event) {
        ......
    },

此外我们还需要了解一下bind和catch的区别,其实这两个的区别主要是在于冒泡事件和非冒泡事件。

首先我们将一个父节点及其子节点都使用bind绑定一个tap事件,父元素绑定onContainerTap(),子元素绑定onSubTap()

    <view class='moto-container' bindtap='onContainerTap'>
        <text class='moto' bindtap='onSubTap'>开启小程序之旅</text>
    </view>
    onContainerTap:function (event) {
        console.log("excute onContainerTap");
    },

    onSubTap:function (event) {
        console.log("excute onSubTap");
    },

这时我们点击子元素,查看控制台输出:

excute onSubTap
excute onContainerTap

我们发现不仅子元素的事件被执行了,其父元素的事件也被执行了。

那我们此时再将bind改为catch,点击子元素,查看控制台输出:

excute onSubTap

这时就只执行了子元素的事件,这就是bind和catch的区别,catch能阻止冒泡事件的冒泡。


16、template模板

template模板帮助我们实现了复用的思想,以13、wxml中的for循环为例,我们可以发现for循环中是一个新闻项的整体wxml代码,我们可以将这部分抽离成为一个独立的template模板,这样以后我们可以在任何地方直接调用这个template模板就能完成一个新闻项,而不需要将整个新闻项的wxml代码复制粘贴。

首先在页面文件夹下posts创建一个新文件夹posts-item用来存放模板文件,再在新文件夹下新建一个wxml和wxss文件,分别用来存放wxml模板和wxss模板。
这里写图片描述
接着将for循环中的新闻项wxml代码剪切到模板wxml文件中,注意需要使用template标签包裹,并且需要为其name属性赋值,name属性关系到之后选择调用哪一个模板。

<!--post-item-template.wxml-->
<template name="postItem">
    <view class='post-container'>
        <view class='post-author-date'>
            <image class='post-author' src='{{item.avatar}}'></image>
            <text class='post-date'>{{item.date}}</text>
        </view>
        <text class='post-title'>{{item.title}}</text>
        <image class='post-image' src='{{item.imgSrc}}'></image>
        <text class='post-content'>{{item.content}}</text>
        <view class='post-like'>
            <image class='post-like-image' src='../../images/icon/chat.png'></image>
            <text class='post-like-font'>{{item.collection}}</text>
            <image class='post-like-image' src='../../images/icon/view.png'></image>
            <text class='post-like-font'>{{item.reading}}</text>
        </view>
    </view>
</template>

接着将这个新闻项对应的wxss样式代码也剪切到模板wxss文件中,这里就不需要再使用template标签包裹

/*post-item-template.wxss*/

/*新闻列表-作者头像和日期-容器*/
.post-author-date{
    margin: 10rpx 0 20rpx 10rpx;
}

/*新闻列表-作者头像和日期-作者头像*/
.post-author{
    width: 60rpx;
    height: 60rpx;
    /*垂直居中*/
    vertical-align: middle;
}

/*新闻列表-作者头像和日期-日期*/
.post-date{
    margin-left: 20rpx;
    /*垂直居中*/
    vertical-align: middle;
    margin-bottom: 5px;
    font-size: 26rpx;
}

/*新闻列表-新闻标题*/
.post-title{
    font-size: 34rpx;
    font-weight: 600;
    color: #333;
    margin-bottom: 10px;
    margin-left: 10px;
}

/*新闻列表-文章导图*/
.post-image{
    margin-left: 16px;
    width: 100%;
    height: 340rpx;
    margin: auto 0;
    margin-bottom: 15px;
}

/*新闻列表-文章内容*/
.post-content{
    color: #666;
    font-size: 28rpx;
    margin-bottom: 20rpx;
    margin-left: 20rpx;
    /*文本间距*/
    letter-spacing: 2rpx;
    line-height: 40rpx; 
}

/*新闻列表-喜欢和收藏-容器*/
.post-like{
    font-size: 13rpx;
    /*横向排列*/
    flex-direction: row;
    line-height: 16px; 
    margin-left: 10px;
}

/*新闻列表-喜欢和收藏-图片*/
.post-like-image{
    height: 16px;
    width: 16px;
    margin-right: 8px;
    vertical-align: middle;
}

/*新闻列表-喜欢和收藏-收藏和喜欢数*/
.post-like-font{
    vertical-align: middle;
    margin-right: 20px;
}

回到需要使用新闻项模板的wxml页面,在for循环中调用新闻项模板文件,is对应的就是template的name属性值,data属性对应的就是for循环数组的每一个子项,这样数组中的数据就能传递到模板文件中了。

注意不要忘了在开头引入模板文件

<import src="post-item/post-item-template.wxml"/>   
    ......
    ......
    <!--新闻列表-->
    <block wx:for='{{posts_key}}' wx:for-item="item" wx:for-index="idx">
        <!--template-->
        <template is="postItem" data="{{item}}"/>
    </block>

同样的,在新闻项wxml对应的wxss文件中引入wxss模板:

@import "post-item/post-item-template.wxss";

这样我们就完成了template模板的生成和使用。

这里我们还需要学习一个知识,我们看下面两个地方

<!--post.wxml-->
    <block wx:for='{{posts_key}}' wx:for-item="item" wx:for-index="idx">
        <!--template-->
        <template is="postItem" data="{{item}}"/>
    </block>
<!--post-item-template.wxml-->
<template name="postItem">
    <view class='post-container'>
        <view class='post-author-date'>
            <image class='post-author' src='{{item.avatar}}'></image>
            <text class='post-date'>{{item.date}}</text>
        </view>
        <text class='post-title'>{{item.title}}</text>
        <image class='post-image' src='{{item.imgSrc}}'></image>
        <text class='post-content'>{{item.content}}</text>
        <view class='post-like'>
            <image class='post-like-image' src='../../images/icon/chat.png'></image>
            <text class='post-like-font'>{{item.collection}}</text>
            <image class='post-like-image' src='../../images/icon/view.png'></image>
            <text class='post-like-font'>{{item.reading}}</text>
        </view>
    </view>
</template>

我们会发现在template的wxml文件中我们使用item.来调用数据,如果我们不想要item.,而想直接输入变量名来调用数据的话,我们可以在调用模板的wxml文件中这样改:

<!--post.wxml-->
    <block wx:for='{{posts_key}}' wx:for-item="item" wx:for-index="idx">
        <!--template-->
        <template is="postItem" data="{{...item}}"/>
    </block>

在data属性的值前面加上… 这样的话就可以在模板文件中将item.去掉。

template模板是不能绑定事件的,因为template模板只是一个占位符,在编译的时候许会全部替换成模板里面的内容,如果我们要让template模板能响应事件,我们需要用一个容器view将其包裹,并在容器上绑定事件。


17、标签自定义属性

小程序中的自定义属性全部需要以data-开头,例如我要为下面的view标签增加一个自定义的postId属性:

    <!--新闻列表-->
    <block wx:for='{{posts_key}}' wx:for-item="item" wx:for-index="idx">
        <!--template-->
        <view catchtap="onPostTap" data-postId="{{item.postId}}">
            <template is="postItem" data="{{...item}}"/>
        </view>
    </block>

并且小程序中的自定义属性在js中调用时会全部默认转换为小写字符!我们根据上面这串代码举个例子,首先在上面我们为view标签绑定了tap事件,我们现在实现点击view标签就输出其postId属性的值,完成对应的js代码:

    onPostTap: function (event) {
        var postId = event.currentTarget.dataset.postid;
        console.log(postId);
    },

我们发现在事件回调函数中调用自定义属性的值时我们用的是postid而不是postId!用postId是错误的!


18、页面之间的数据传递

如果从一个页面跳转到另一个页面的同时也想传递一个数据过去,那么实现方法如下:

在跳转的页面url后加上?[要传递的变量]=[值]

示例代码如下:点击绑定了这个tap事件的标签后,从当前页面跳转到post-detail页面时携带一个名为postid的变量传递过去。

    onPostTap: function (event) {
        var postId = event.currentTarget.dataset.postid;
        //跳转到新闻详情页面
        wx.navigateTo({
            url: 'post-detail/post-detail?postid=' + postId,
        })
    },

那么在post-detail页面中获取这个变量的方式则是:

    onLoad:function (option) {
        var postId = option.postid;
    }

19、缓存

小程序中的缓存共有八种方法

  1. wx.setStorageSync(key, value)——同步缓存
  2. wx.setStorage(object)——异步缓存
  3. wx.getStorageSync(key)——同步取缓存
  4. wx.getStorage(object)——异步取缓存
  5. wx.removeStorageSync(key)——同步清除缓存
  6. wx.removeStorage(object)——异步清除缓存
  7. wx.clearStorageSync()——同步清除所有缓存
  8. wx.clearStorage()——异步清除所有缓存

示例代码:

wx.setStorageSync('key', 'value')

wx.setStorage({
  key:"key",
  data:"value"
})

var value = wx.getStorageSync('key')

wx.getStorage({
  key: 'key',
  success: function(res) {
      console.log(res.data)
  } 
})

wx.removeStorageSync('key')

wx.removeStorage({
  key: 'key',
  success: function(res) {
    console.log(res.data)
  } 
})

wx.clearStorageSync()

wx.clearStorage()

小程序中的缓存若不手动清除将永久存在,但是缓存最大上限为10MB。


20、界面交互反馈

小程序里的吐司的API:

wx.showToast(OBJECT)

//示例代码:
wx.showToast({
  title: '成功',
  icon: 'success',
  duration: 2000
});

相当于Android中的Toast。

显示​模态弹窗的API:

wx.showModal(OBJECT)

//示例代码
wx.showModal({
  title: '提示',
  content: '这是一个模态弹窗',
  success: function(res) {
    if (res.confirm) {
      console.log('用户点击确定')
    } else if (res.cancel) {
      console.log('用户点击取消')
    }
  }
})

​显示操作菜单的API:

wx.showActionSheet(OBJECT)

//示例代码
wx.showActionSheet({
  itemList: ['第一项', '第二项', '第三项'],
  success: function(res) {
    console.log(res.tapIndex)
  },
  fail: function(res) {
    console.log(res.errMsg)
  }
})

21、动态图片的两种方式

(1)、使用wx:if标签

<!--根据当前文章的收藏情况collected显示不同的收藏图标-->
<image wx:if="{{collected}}" catchtap='onCollectionTap' src='/images/icon/collection.png'></image>
<image wx:else catchtap='onCollectionTap' src='/images/icon/collection-anti.png'></image>

上面的代码实现了根据data对象中collected的值来判断应该显示哪一张图片,具体对于collected值的操作在js脚本中完成,这里不赘述。

(2)、三目运算符

<image catchtap='onCollectionTap' src='{{collected?"/images/icon/collection.png":"/images/icon/collection-anti.png"}}'></image>

上面的代码实现了根据data对象中collected的值来判断应该显示哪一张图片,具体对于collected值的操作在js脚本中完成,但是使用的是三目运算符的方式,需要注意的是src的值外面如果是单引号,那么里面需要用双引号,如果外面是双引号,那么里面就得用单引号。


22、在小程序里若要动态改变前端显示,一般是通过js代码动态修改data对象里的数据,前端通过data对象的数据来进行不同的显示。

23、小程序应用的生命周期

在app.js文件中输入App,智能感知生成如下代码,其中含有整个小程序应用的生命周期函数:

App({
    /**
     * 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)
     */
    onLaunch: function () {

    },

    /**
     * 当小程序启动,或从后台进入前台显示,会触发 onShow
     */
    onShow: function (options) {

    },

    /**
     * 当小程序从前台进入后台,会触发 onHide
     */
    onHide: function () {

    },

    /**
     * 当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息
     */
    onError: function (msg) {

    },
});

24、全局变量

在app.js中调用App方法,传入一个对象,这个对象就是在整个小程序中都能调用的全局对象,我们为这个对象增加一个属性。

//app.js
App({
    globalData: {
        //全局变量,用来标示音乐是否在播放
        g_isPlayingMusic: false,
    },
});

那么如果我们要在其他的js文件中调用这个属性,我们首先需要在Page方法之前,获取到这个全局对象

//从app.json中获取全局对象
var app = getApp();

Page({
    ......
    //调用全局对象中的属性
    var isPlayingMusic = app.globalData.g_isPlayingMusic;
});

25、target和currentTarget

target指的是当前点击的组件,currentTarget指的是事件捕获的组件。

现在有下面这样一个Swiper轮播图组件,现在我想实现点击轮播图后获取到对应的轮播图的自定义属性postId,可是此时我们发现catchTap是绑定在Swiper上而不是image组件上,我们无法通过event.currentTarget.dataset.postid在响应事件函数onSwiperTap中获取到,这是因为currentTarget指的是Swiper这个事件捕获的组件而不是image,我们要想获得postId这个自定义属性的值,我们需要使用event.target.dataset.postid。

    <!--滑块视图容器——轮播组件-->
    <swiper catchtap='onSwiperTap' class='swiper' indicator-dots='true' autoplay='true' interval='5000'>
        <!--轮播子项-->
        <swiper-item>
            <image src='/images/post/xiaolong.jpg' data-postId="3"></image>
        </swiper-item>
        <swiper-item>
            <image src='/images/post/vr.png' data-postId="4"></image>  
        </swiper-item>
        <swiper-item>
            <image src='/images/post/crab.png' data-postId='5'></image>  
        </swiper-item>
    </swiper>
    onSwiperTap:function (event) {
        var postId = event.target.dataset.postid;
    },

26、动态设置导航栏标题

微信小程序提供了一组api动态设置导航栏标题:

wx.setNavigationBarTitle(OBJECT)
//示例代码
wx.setNavigationBarTitle({
  title: '当前页面'
})

需要注意的是,onLoad方法里是不允许对界面UI进行操作的,因为只有运行到onReady()才表示界面UI渲染完成,因此如果我们要动态设置导航栏标题,需要在onReady或其后面的生命周期函数中调用这个api,否则不会生效。


27、上滑加载更多的两种方式

1、利用组件scroll-view

scroll-view组件有一个bindscrolltolower属性,绑定一个回调函数即可,当上滑到底部时就会自动触发这个函数。注意要想实现上滑下载更多的功能,需要为scroll-view设置高度,否则无效。

    <scroll-view scroll-y="true" scroll-x="false" bindscrolltolower = "onScrollLower">
    ....
    </scroll-view>
    onScrollLower: function (event) {
        ...
    }

2、利用函数onReachBottom

MINA在Page里还提供了一个onReachBottom事件,使用这个事件来监听页面上滑到底。

  onReachBottom: function (event) {
    ...
  },

28、获取input组件中输入的内容

小程序中没有DOM的概念,无法通过获取到input组件实例来获取其内容,因此需要利用事件的机制来获取。

//onBindConfirm:用户点击确认后回调的方法
<input type='text' bindconfirm='onBindConfirm'></input>
    onBindConfirm: function (event) {
        //获取input搜索框输入的内容
        var text = event.detail.value;
    },
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值