美文网首页
自定义组件实现对话框与自定义模板实现的比较

自定义组件实现对话框与自定义模板实现的比较

作者: 吉凶以情迁 | 来源:发表于2023-01-21 22:12 被阅读0次

    自定义模板,需要导入太多配置了,并不能复用逻辑,只能复用wxml,wxss都无法复用
    控制对话框显示隐藏则是使用 display:flex/none进行切换,每一个功能都需要处理。

    最后我的强迫症让我决定改成用组件实现

    在根目录新建components文件夹

    然后新建 compnents命名为searchdialog
    新建好之后在自己的页面 json修改

        "usingComponents": {
            "searchdialog": "/components/searchdialog"
        }
    

    ,而searchdialog这个名字可以随便定义,这将决定了在wxml里面的命名。

    ···

    wxml里面写入

      <searchdialog id='dialog'>
        </searchdialog>
    

    发现正常的显示了,和模板差不多。。

    完整代码
    包含了类似slot,也就是 自定义view里面放入view,要放入哪里,哪个节点 则需要再模板的wxml里面定义slot
    多个节点也是支持的,这里不演示。
    组件wxml

    <view class="dialog-root-wrap" style="display:{{showSearchDialog?'flex':'none'}};">
        <view class="dilog-root" bindtap="dismissDialog">
            <view class="dialog-content" style="border-radius: 15rpx;min-width:60%;min-height:25%;" catchtap="_dialogAeraClick">
                <view class="vertical">
                    <view class="input_wrap_style" id="keyword">
                        <input class="myinput" password type="text" placeholder="输入关键词" bindinput="bindKeywordInput" value="{{keyword}}" />
                    </view>
                    <picker style="margin-top: 20rpx;" mode="date" value="{{startdate}}" start="{{initStartDate}}" end="{{initEndDate}}" bindchange="_changeDate" data-value="0">
                        <view class="tui-picker-detail">
                            开始时间: {{startdate}}
                        </view>
                    </picker>
                    <picker style="margin-top: 20rpx;" mode="date" value="{{enddate}}" start="{{initStartDate}}" end="{{initEndDate}}" bindchange="_changeDate" data-value="1">
                        <view class="tui-picker-detail">
                            结束时间: {{enddate}}
                        </view>
                    </picker>
                    <slot></slot>
                    <button id="search" catchtap="searchClick" type="primary" style="margin-top: 30rpx;">{{confirmSearchText}}</button>
                </view>
            </view>
        </view>
    </view>
    
    

    组件 ts

    
    // component/searchdialog.ts
    import * as datefns from 'date-fns';
    Component({
        /**
         * 组件的属性列表
         */
        properties: {
            confirmSearchText: {
                type: String,
                value: '开始搜索'
            }
        },
    
        lifetimes: {
            // 生命周期函数,可以为函数,或一个在methods段中定义的方法名
            created: function () { },// 无   在组件实例刚刚被创建时执行   1.6.3
            attached: function () { },//    无   在组件实例进入页面节点树时执行 1.6.3
            ready: function () {
                const date = new Date();
                var lastMonth: any = datefns.subMonths(date, 1);
                this.setData({
                    initStartDate: datefns.format(datefns.subYears(date, 10), "yyyy-MM-dd"),
                    initEndDate: datefns.format(date, "yyyy-MM-dd"),
                    startdate: datefns.format(lastMonth, "yyyy-MM-dd"),
                    enddate: datefns.format(date, "yyyy-MM-dd"),
    
                });
    
    
            },//    无   在组件在视图层布局完成后执行  1.6.3
            moved: function () { },//   无   在组件实例被移动到节点树另一个位置时执行    1.6.3
            detached: function () { },//    无   在组件实例被从页面节点树移除时执行   1.6.3
            error: function () { },//   Object Error    每当组件方法抛出错误时执行   2.4.1
        },
        /* 
            // 生命周期函数,可以为函数,或一个在methods段中定义的方法名
            attached: function () { }, // 此处attached的声明会被lifetimes字段中的声明覆盖
            ready: function () { }, */
    
        pageLifetimes: {
            // 组件所在页面的生命周期函数
            show: function () { },
            hide: function () { },
            resize: function () { },
        },
        /**
         * 组件的初始数据
         */
        data: {
            startdate: "",
            enddate: "",
            initStartDate: "",
            initEndDate: "",
        },
    
        /**
         * 组件的方法列表
         */
        methods: {
            _dialogAeraClick: function () {
                console.debug("用于阻止点击对话框其它内容也导致隐藏的问题");
            },
            _changeDate(e: any) {
                console.debug(e);
                if (e.currentTarget.dataset.value == "0") {
                    this.setData({ startdate: e.detail.value });
                } else {
                    this.setData({ enddate: e.detail.value });
                }
            },
            /*
            * 公有方法
            */
            dismissDialog: function () {
                this.setData({
                    showSearchDialog: false
                })
                this.triggerEvent("onDismissDialog")
                console.debug("dismissDialogclick");
            },
            showDialog: function () {
                this.setData({
                    showSearchDialog: true
                })
                this.triggerEvent("onShowDialog")
            },
            searchClick: function () {
                console.debug("onSearch");
                var that = this;
                this.triggerEvent("onSearchClick", { startdate: that.data.startdate, enddate: that.data.enddate })
            }
    
        }
    })
    
    
    

    page中的实现

    ···
    onShowDialog(e: any) {
    console.debug("收到了组件传递的onShowDialog事件 ");
    },
    onDismissDialog(e: any) {
    console.debug("收到了组件传递的onDismissDialog事件 ");
    },
    requestShowDialog() {
    var dialog = this.selectComponent("#dialog");
    dialog.showDialog();
    },
    onSearchClick(e: any) {
    console.debug("收到了组件的onSearchClick ", e, e.detail.startdate, e.detail.enddate);
    },

    ···
    page wxml的引用参数和定义事件监听

        <searchdialog id='dialog' confirmSearchText='确认搜索' bind:onDismissDialog="onDismissDialog" bind:onShowDialog="onShowDialog" bind:onSearchClick="onSearchClick">
        </searchdialog>
    

    原理就是再组件的事件里面使用this.triggerEvent("onShowDialog")分发事件,
    在page wxml使用bind即可, 对于多个参数的接受

          this.triggerEvent("onSearchClick", { startdate: that.data.startdate, enddate: that.data.enddate })
          ```
    
    page中的定义
    
    onSearchClick(e: any) {
        console.debug("收到了组件的onSearchClick ", e, e.detail.startdate, e.detail.enddate);
    },
    
    
    到这里已经实现完了对话框的弹出监听,以及搜索接受参数,已经page界面控制显示隐藏 
    
    ```properties```为对外暴露的字段,
    

    相关文章

      网友评论

          本文标题:自定义组件实现对话框与自定义模板实现的比较

          本文链接:https://www.haomeiwen.com/subject/moltsrtx.html