Home >WeChat Applet >Mini Program Development >Detailed explanation of a customized WeChat applet component (modal pop-up component)
I don’t know when mini programs became popular. Many people have fallen into the trap. For those who are engaged in development, whether it is android, ios, or the very popular WeChat mini program,
Everyone will find that the native controls provided by the official can no longer fully meet our development needs, so this article introduces a customized WeChat applet component (modal pop-up component),
Let’s take a picture first .
# Now that you have seen this, the renderings are still a bit attractive to you, haha, let’s stop talking nonsense and start coding. . .
There are a total of four files js, json, xml, and wxss. If you are still unclear about this, please turn left when you go out and think about it for 5 minutes.
First upload the layout dialog.xml file
<!--mask dialog--> <view class="drawer_screen" bindtap="hideDialog" wx:if="{{isShow}}" catchtouchmove="myCatchTouch"></view> <!--content--> <!--使用animation属性指定需要执行的动画--> <view animation="{{animationData}}" class="drawer_box" wx:if="{{isShow}}"> <!--drawer content--> <view class='row'> <view class="drawer_title" style='width:100%;padding-left:60rpx'>{{title}}</view> <icon type="clear" style='margin-top:40rpx;margin-right:20rpx;' bindtap="hideDialog"></icon> </view> <form bindsubmit="_formSubmit"> <scroll-view scroll-y> <view class="drawer_content"> <view wx:for="{{dataObject}}" wx:key="{{id}}"> <view class="top grid"> <label class="title col-0" style="color:red" wx:if="{{item.must}}">*</label> <label class="title col-0" wx:else> </label> <input class="input_base input_h30 col-1" placeholder='{{item.placeholder}}' wx:if="{{item.type === type_input}}" name="{{item.id}}" value="{{bean[item.id]}}"></input> <view class="input_base input_h30 col-1" wx:elif="{{item.id === id_sex}}" hover-class='btn_ok_hover' bindtap='{{item.event}}'>{{sexDefault}}</view> <view class="input_base input_h30 col-1" wx:elif="{{item.id === id_group}}" hover-class='btn_ok_hover' bindtap='{{item.event}}'>{{groupDefault}}</view> </view> </view> </view> </scroll-view> <button class="btn_ok" hover-class='btn_ok_hover' formType="submit">确定</button> </form> </view>
Then the dialog.wxss file
/*mask dialog start*/ .drawer_screen { width: 100%; height: 100%; position: fixed; top: 0; left: 0; right:0; bottom:0; z-index: 1000; background: #000; opacity: 0.5; overflow: hidden; } /*content*/ .drawer_box { width: 650rpx; overflow: hidden; position: fixed; top: 50%; left: 0; z-index: 1001; background: #fafafa; margin: -480rpx 50rpx 0 50rpx; border-radius: 6px; } .drawer_title { padding: 15px; font: 20px "microsoft yahei"; text-align: center; } .drawer_content { height: 720rpx; /*overflow-y: scroll; 超出父盒子高度可滚动*/ } .btn_ok { padding: 10px; font: 20px "microsoft yahei"; text-align: center; border-top: 1rpx solid #e8e8ea; color: #3cc51f; } .btn_ok_hover { color: #aaa; background: #d9d9d9; } .top { padding-top: 8px; } .input_base { border: 2rpx solid #ccc; border-radius: 20rpx; padding-left: 20rpx; margin-right: 20rpx; } .input_h30 { height: 30px; line-height: 30px; } .title { height: 30px; line-height: 30px; width: 40rpx; text-align: center; display: inline-block; font: 300 28rpx/30px "microsoft yahei"; } .grid { display: -webkit-box; display: box; } .col-0 { -webkit-box-flex: 0; box-flex: 0; } .col-1 { -webkit-box-flex: 1; box-flex: 1; } /*mask dialog end*/ .row { display: flex; flex-direction: row; }
Then the dialog.js file
// components/Dialog/dialog.js Component({ options: { multipleSlots: true // 在组件定义时的选项中启用多slot支持 }, /** * 组件的属性列表 */ properties: { title: { // 属性名 type: String, // 类型(必填),目前接受的类型包括:String, Number, Boolean, Object, Array, null(表示任意类型) value: '标题' // 属性初始值(可选),如果未指定则会根据类型选择一个 } }, /** * 组件的初始数据 */ data: { // 弹窗显示控制 isShow: false, type_input: "input", type_btn: "button", id_sex: "sex", id_group: "group", dataObject: [], sexDefault: "男", groupDefault: "组织", sexArray: ['男', '女'], groupArray: ['组织', '群众'], bean: {}, }, /** * 组件的方法列表 */ methods: { /* * 公有方法 */ setDataObj(dataObj,beanObj) { this.setData({ dataObject: dataObj, bean: beanObj }) if (beanObj.hasOwnProperty("sex") && beanObj.sex != ""){ this.setData({ sexDefault: beanObj.sex }) } if (beanObj.hasOwnProperty("group") && beanObj.group != "") { this.setData({ groupDefault: beanObj.group }) } }, //隐藏弹框 hideDialog() { this._showOrCloseDialog("close") }, //展示弹框 showDialog() { this._showOrCloseDialog("open") }, /* * 内部私有方法建议以下划线开头 * triggerEvent 用于触发事件 */ _formSubmit(e) { if ("" === e.detail.value.name) { wx.showToast({ title: '请填写姓名', icon: 'none' }) return } if ("" === e.detail.value.phone) { wx.showToast({ title: '请填写电话', icon: 'none' }) return } this._showOrCloseDialog("close") //触发成功回调 this.triggerEvent("confirmEvent", { e: e }); }, sexButton: function() { var that = this; wx.showActionSheet({ itemList: this.data.sexArray, success: function(res) { console.log(res.tapIndex) that.setData({ sexDefault: that.data.sexArray[res.tapIndex] }) }, fail: function(res) { console.log(res.errMsg) } }) }, groupButton: function() { var that = this; wx.showActionSheet({ itemList: this.data.groupArray, success: function(res) { console.log(res.tapIndex) that.setData({ groupDefault: that.data.groupArray[res.tapIndex] }) }, fail: function(res) { console.log(res.errMsg) } }) }, _showOrCloseDialog: function(currentStatu) { var that = this; /* 动画部分 */ // 第1步:创建动画实例 var animation = wx.createAnimation({ duration: 200, //动画时长 timingFunction: "linear", //线性 delay: 0 //0则不延迟 }); // 第2步:这个动画实例赋给当前的动画实例 this.animation = animation; // 第3步:执行第一组动画 animation.opacity(0).rotateX(-100).step(); // 第4步:导出动画对象赋给数据对象储存 that.setData({ animationData: animation.export() }) // 第5步:设置定时器到指定时候后,执行第二组动画 setTimeout(function() { // 执行第二组动画 animation.opacity(1).rotateX(0).step(); // 给数据对象储存的第一组动画,更替为执行完第二组动画的动画对象 that.setData({ animationData: animation }) //关闭 if (currentStatu == "close") { that.setData({ isShow: false }); } }.bind(this), 200) // 显示 if (currentStatu == "open") { that.setData({ isShow: true }); } } }, //解决滚动穿透问题 myCatchTouch: function () { return } })
See here Some friends may have asked, you are a parallel importer, why is the js file structure different from mine, are you here to fool us? Don't worry, sir, please listen to me: In fact, for the convenience of calling, I have encapsulated this dialog into a component. You ask me how to encapsulate components? Please move to the official tutorial:
https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/
After the packaging is completed, the project structure is as follows:
The misunderstanding has been clearly explained here, please give me some face and continue reading. .
The three King Kongs have been shown, and there is a dialog.json file that is not shown. This file is very simple
{ "component": true,//作为组件 "usingComponents": {}//引用别的组件 }
This file is also different from the general json file, mainly because it is configured as The component is for others to reference, so at this point, the component has been encapsulated
Perhaps at this time many children can’t wait to copy and paste and then put the code into the project to see the real content, and found the running results and renderings It’s different. Then some people may say: Niang Xipi is indeed a parallel importer and a liar! ! ! At this point, I can only say: Dear fellow villagers, Danding, Danding. . . , because there are no dataObjects and beans in js, so the rendering is different from what I showed at the beginning of the article. So, let me tell you how to call it and achieve the same effect as me.
Add the following code in the referenced xml
<image src="../../img/add.png" class="buttom" bindtap="bindAdd"></image> <dialog id='dialog' title='新增' bind:confirmEvent="_confirmEvent"></dialog>
buttom This is a floating button, wxss also gives it to you
.buttom{ width: 100rpx; height: 100rpx; display: flex; flex-direction: row; position: fixed; bottom:60rpx; right: 60rpx; }
Then reference the js file of the page
onReady: function() { //获得dialog组件 this.dialog = this.selectComponent("#dialog"); } //响应button弹框 bindAdd: function(e) { this.dialog.setDataObj(addObject, {}) this.dialog.showDialog(); }
At this point, you can basically click the floating button to realize the pop-up box. Some busty dei said again: Hey, hey, wait, addObject, and that add.png haven't been given yet. Okay, give it, give it to you
const addObject = [{ id: "name", must: true, placeholder: "姓名", type: "input", event: "nameInput" }, { id: "sex", must: true, placeholder: "男", type: "button", event: "sexButton" }, { id: "group", must: true, placeholder: "组织", type: "button", event: "groupButton" }, { id: "phone", must: true, placeholder: "电话号码", type: "input", event: "phoneInput" }, { id: "shortNum", must: false, placeholder: "集团短号", type: "input", event: "shortNumInput" }, { id: "mail", must: false, placeholder: "电子邮箱", type: "input", event: "mailInput" }, { id: "unit", must: false, placeholder: "单位名称", type: "input", event: "unitInput" }, { id: "department", must: false, placeholder: "部门名称", type: "input", event: "departmentInput" }, { id: "job", must: false, placeholder: "职务", type: "input", event: "jobInput" }, { id: "function", must: false, placeholder: "涉及工作内容", type: "input", event: "functionInput" }, { id: "comPhone", must: false, placeholder: "办公电话", type: "input", event: "comPhoneInput" }, { id: "fax", must: false, placeholder: "传真", type: "input", event: "faxInput" }, { id: "homePhone", must: false, placeholder: "家庭电话", type: "input", event: "homePhoneInput" }, { id: "showOrder", must: false, placeholder: "显示顺序", type: "input", event: "showOrderInput" }, { id: "departOrder", must: false, placeholder: "部门顺序", type: "input", event: "departOrderInput" }, { id: "remark", must: false, placeholder: "备注", type: "input", event: "remarkInput" } ]
Picture
At this point you should be able to achieve the same effect as me, go ahead and play with it. .
Related articles:
Detailed explanation of custom modal pop-up window examples of WeChat Mini Program
WeChat Mini Program - Self Definition and creation
Related videos:
WeChat mini program development from entry to mastery video tutorial
The above is the detailed content of Detailed explanation of a customized WeChat applet component (modal pop-up component). For more information, please follow other related articles on the PHP Chinese website!