zoukankan      html  css  js  c++  java
  • 小程序开发之组件的使用

    在小程序开发的第30天,整个版本的项目可以说是差不多手工,但是总体的项目大小已经非常接近限度,所以说项目的优化势在必行,所以我给大家分享关于我在项目实战中总结的小程序组件的使用:
    我给大家分享的是一个底部弹框的一个组件,点击头部切换效果如图:
     
    因为在很多页面都需要这样的一个切换,底部弹框效果,所以说我们需要进行一个封装。这里大家跟紧我
     
    第一步:先创建components文件夹,防止整个项目的所有的组件。
     
    第二步:在component文件夹中右键创建组件,名称为dialog。
     
    目录如下:
     
    接下来我们就需要对我们的弹出框组件进行设置了。
     
    第三步:在dialog.wxml中写入弹出框代码:
    <!-- 下拉列表弹出框 -->
    <view wx:if="{{state}}" class='drop-bot' bindtap='closer'>
        <view scroll-y="true" class="box {{first_click?'show':'hide'}} {{state?'open':'close'}}">
            <view style='height: 100%;' class="item_list">
                <scroll-view class='scroll' scroll-y="true" style='height: 275rpx'>
                    <view wx:for="{{account}}" wx:key="{{index}}" class=' li {{style}}' data-index="{{index}}" catchtap='select'>{{item.name}} </view>
                </scroll-view>
                <view class='li' catchtap='closer'>取消</view>
            </view>
        </view>
    </view>
    

      

     
    第四步:在dialog.wxss中写入样式代码:
    /* 下拉框的实现 */
    .drop-bot {
         100%;
        height: 100%;
        position: fixed;
        bottom: 0;
        left: 0;
        background: rgba(0, 0, 0, .4);
        z-index: 1000;
    }
    .drop-bot .box{
         100%;
        border-top: 1px solid #ddd;
        overflow: hidden;
        height: 0;
        animation-fill-mode: forwards;
        position: fixed;
        bottom: 0;
        left: 0;
         font-family: Monaco;">#fff;
    }
    .item_list .li.style {
         font-family: Monaco;">#f1f1f1;
    }
    .item_list .li{
         100%;
        height: 90rpx;
        line-height: 90rpx;
        overflow: auto;
        white-space: nowrap;
        display: flex;
        justify-content: center;
        align-items: center;
        border-bottom: 1rpx solid #ebebeb;
    }
    @keyframes slidedown{
        from {
            height: 0;
        }
        to {
            height: 365rpx;
        }
    }
    @keyframes slideup{
        from {
            height: 365rpx;
        }
        to {
            height: 0;
        }
    }
    .open{
        animation: slidedown .5s;
    }
    .close{
        animation: slideup .5s;
    }
    .hide{
        display: none;
    }
    .show{
        display: block;
    }
    

      

    注:弹出框的出现是从底部划出所以实现思路是:
        通过css3动画实现高度从0=》某一高度的变化,通过添加不同类名引用不同的动画,0-365为出现,365-0为消失,当然我们也可以通过定位,改变其top值也是可以的。
     
    第五步:为组件配置json,默认不用配置如下:
    {
        "component": true,
        "usingComponents": {}
    }
    

      

     
    第六步:配置组件的业务逻辑:
    // 弹出框组件
    Component({
    /**
    * 组件的属性列表
    */
    properties: {
        account: {
            type: Array,
            value: []
        },
        accountName: {
            type: String,
            value: ""
        }
    },//存放公共数据的地方,可以供调用方传递数据
     
    /**
    * 组件的初始数据
    */
    data: {
        state: false,
        first_click: false,
    },//私有属性的地方,data中的数据只有组件可以访问,外部无法访问
     
    /**
    * 组件的方法列表
    */
    methods: {
        closer: function (e) {
            this.setData({
                state: false,
            })
        },//点击遮罩层消失
        select: function (e) {
            var oIndex = e.currentTarget.dataset.index;
            var oAccount = this.data.account[oIndex].name;//这里需要的数据有调用方传递到properties
            this.setData({
                state: false,
            })
            this.triggerEvent("action",oAccount);//将该方法抛出
        },//选择下拉的用户名称
        toggle: function () {
            var list_state = this.data.state,
            first_state = this.data.first_click;
            if (!first_state) {
                this.setData({
                first_click: true
                });
            }
            if (list_state) {
                this.setData({
                state: false
                });
            } else {
                this.setData({
                state: true
                });
            }
        },//调出弹出框事件
    }//存放事件的地方
    })
    

      

     
     
    至此组件的配置也就结束了,下来我们需要进行调用方文件的配置:
     
    第七步在pages中创建右键创建index目录,在该目录中创建page命名为index
     
    第八步:配置index.wxml:
    <!-- 触发下拉事件的按钮 -->
    <view class='header' bindtap="toggle"><text>{{accouontName}}</text><text>切换</text></view>
    <!-- 组件:下拉弹出框 -->
    <template-dialog id="dialog" account="{{account}}" accountName="{{accountName}}" bind:action="switchAccount"></template-dialog>
     
    注:
        给头部添加点击事件toggle(toggle为dialog组件内方法)
        在需要调用的页面中添加摸板,摸板的标签就是我们在json中配置的template-dialog名称,
        模板中id是在该页面中给调用的摸板起一个名称,用于在js中调用(只能用id) 
        account和accountName是我们将index中的数据传输到组件中,以供事件的正常执行。
        bind:action="selected"是调用组件抛出的方法
     
    为什么说toggle和action同为组件的方法我们却只在这里生命action呢?
        因为toggle虽是组件的方法,但我们只需要对他进行调用就可以,不需要进行任何的数据的传输,而action所代表的select事件则是需要我们在调用的时候进行 的数据的传输。
     
    第九步:配置index.wxss:
    .header {
         100%;
        height: 90rpx;
        padding: 0 24rpx;
        box-sizing: border-box;
         font-family: Monaco; font-size: 11pt;">#16cc80;
        display: flex;
        justify-content: space-around;
        align-items: center;
    }
    

      

     
    第十步:我们配置他的json文件:
    {
        "usingComponents": {
            "template-dialog": "/components/dialog/dialog"
        }
    }
    

      

     
    注:
        "template-dialog"是我们在调用摸板时给摸板所起的名称,后面为其路径
     
    十一:下来就是我们的业务逻辑:
    Page({
        data: {
            accountName: "",
            account: [
                { "name": "李小冉" },
                { "name": "李冰" },
                { "name": "李浩然" },
                { "name": "李宗盛" },
            ],
        },
        onReady: function (e) {
            this.dialog = this.selectComponent("#dialog");//通过给组件所起的id调用组件
        },
        toggle: function (e) {
            this.dialog.toggle()
        },    //给头部添加的调出下拉框的事件
        switchAccount: function (options) {
            this.setData({
                accountName: options.detail
           })
        }, //组件内部的方法将options传递过来的数据使用上
    })
     
    下来我们的一个弹出框组件的编写,调用就算完成了,实现并不复杂,关键时对组件的各个属性的了解。
    各位同路人,记得看思路哦。
  • 相关阅读:
    算法探究-2.retinaNet(Focal Loss)
    C++基础-枚举体 enum class
    C++基础-TypeTraits(进行类型的属性判断) 1.is_lvalue_reference(左值引用判断) 2.is_integral(整形判断) 3.is_class(基本类型判段) 4.is_same(判断类型一致) 5.enable_if(条件判断)
    C++基础-auto(自动分配属性)和decltype(指定分配属性)
    C++基础-正则实战(日期拆分regex_match ,符号拆分sregex_token_iterator, 邮箱的查找 regex_search)
    C++基础-正则表达式 regex_match(匹配) regex_search(查找) regex_replace(替换)
    Shell 入门(三):sed,awk,grep
    Shell 入门(二):数组与函数
    Shell 入门(一):变量和流程控制
    ArcSDE 版本差异提取
  • 原文地址:https://www.cnblogs.com/bgwhite/p/9272796.html
Copyright © 2011-2022 走看看