首页 技术 正文
技术 2022年11月14日
0 收藏 752 点赞 4,393 浏览 4626 个字

要做自定义组件,我们先定一个小目标,比如说我们在小程序中实现一下 WEUI 中的弹窗组件,基本效果图如下。

微信小程序自定义组件

Step1

我们初始化一个小程序(本示例基础版本库为 1.7 ),删掉里面的示例代码,并新建一个 components 文件夹,用于存放我们以后开发中的所用组件,今天我们的目的是实现一个 弹框 组件,因此,我们在 components 组件中新建一个 Dialog 文件夹来存放我们的弹窗组件,在 Dialog 下右击新建 Component 并命名为 dialog 后,会生成对应的 json wxml wxss js 4个文件,也就是一个自定义组件的组成部分,此时你的项目结构应该如下图所示:

微信小程序自定义组件

Step2

组件初始化工作准备完成,接下来就是组件的相关配置,首先我们需要声明自定义组件,也就是将 dialog.json 中 component 字段设为 true :

{
"component": true, // 自定义组件声明
"usingComponents": {} // 可选项,用于引用别的组件
}

其次,我们需要在 dialog.wxml 文件中编写弹窗组件模版,在 dialog.wxss 文件中加入弹窗组件样式,它们的写法与页面的写法类似,我就不赘述,直接贴代码啦~

dialog.wxml 文件如下:

<!--components/Dialog/dialog.wxml-->
<view class='wx_dialog_container' hidden="{{!isShow}}">
<view class='wx-mask'></view>
<view class='wx-dialog'>
<view class='wx-dialog-title'>{{ title }}</view>
<view class='wx-dialog-content'>{{ content }}</view>
<view class='wx-dialog-footer'>
<view class='wx-dialog-btn' catchtap='_cancelEvent'>{{ cancelText }}</view>
<view class='wx-dialog-btn' catchtap='_confirmEvent'>{{ confirmText }}</view>
</view>
</view>
</view>

dialog.wxss 文件如下:

  1.  /* components/Dialog/dialog.wxss */
  2.  .wx-mask{
  3.  position: fixed;
  4.  z-index: 1000;
  5.  top: 0;
  6.  right: 0;
  7.  left: 0;
  8.  bottom: 0;
  9.  background: rgba(0, 0, 0, 0.3);
  10.  }
  11.  .wx-dialog{
  12.  position: fixed;
  13.  z-index: 5000;
  14.  width: 80%;
  15.  max-width: 600rpx;
  16.  top: 50%;
  17.  left: 50%;
  18.  -webkit-transform: translate(-50%, -50%);
  19.  transform: translate(-50%, -50%);
  20.  background-color: #FFFFFF;
  21.  text-align: center;
  22.  border-radius: 3px;
  23.  overflow: hidden;
  24.  }
  25.  .wx-dialog-title{
  26.  font-size: 18px;
  27.  padding: 15px 15px 5px;
  28.  }
  29.  .wx-dialog-content{
  30.  padding: 15px 15px 5px;
  31.  min-height: 40px;
  32.  font-size: 16px;
  33.  line-height: 1.3;
  34.  word-wrap: break-word;
  35.  word-break: break-all;
  36.  color: #999999;
  37.  }
  38.  .wx-dialog-footer{
  39.  display: flex;
  40.  align-items: center;
  41.  position: relative;
  42.  line-height: 45px;
  43.  font-size: 17px;
  44.  }
  45.  .wx-dialog-footer::before{
  46.  content: ”;
  47.  position: absolute;
  48.  left: 0;
  49.  top: 0;
  50.  right: 0;
  51.  height: 1px;
  52.  border-top: 1px solid #D5D5D6;
  53.  color: #D5D5D6;
  54.  -webkit-transform-origin: 0 0;
  55.  transform-origin: 0 0;
  56.  -webkit-transform: scaleY(0.5);
  57.  transform: scaleY(0.5);
  58.  }
  59.  .wx-dialog-btn{
  60.  display: block;
  61.  -webkit-flex: 1;
  62.  flex: 1;
  63.  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
  64.  position: relative;
  65.  }
  66.  .wx-dialog-footer .wx-dialog-btn:nth-of-type(1){
  67.  color: #353535;
  68.  }
  69.  .wx-dialog-footer .wx-dialog-btn:nth-of-type(2){
  70.  color: #3CC51F;
  71.  }
  72.  .wx-dialog-footer .wx-dialog-btn:nth-of-type(2):after{
  73.  content: ” “;
  74.  position: absolute;
  75.  left: 0;
  76.  top: 0;
  77.  width: 1px;
  78.  bottom: 0;
  79.  border-left: 1px solid #D5D5D6;
  80.  color: #D5D5D6;
  81.  -webkit-transform-origin: 0 0;
  82.  transform-origin: 0 0;
  83.  -webkit-transform: scaleX(0.5);
  84.  transform: scaleX(0.5);
  85.  }

step3

组件的结构和样式都有了,还缺少什么呢,没错,还缺 js , 眼睛比较犀利的同学,可能已经发现了我们在 dialog.wxml 文件中的会有一些比如 {{ isShow }} 、 {{ title }} 这样的模版变量,还定义了 _cancelEvent 和 _confirmEvent 两个方法,其具体实现就是在 dialog.js 中。

dialog.js 是自定义组件的构造器,是使用小程序中 Component 构造器生成的,调用 Component 构造器时可以用来指定自定义组件的属性、数据、方法等,具体的细节可以参考一下官方的文档

下面我通过代码注释解释一下构造器中的一些属性的使用:

// components/Dialog/dialog.js
Component({
options: {
multipleSlots: true // 在组件定义时的选项中启用多slot支持
},
/**
* 组件的属性列表
* 用于组件自定义设置
*/
properties: {
// 弹窗标题
title: { // 属性名
type: String, // 类型(必填),目前接受的类型包括:String, Number, Boolean, Object, Array, null(表示任意类型)
value: '标题' // 属性初始值(可选),如果未指定则会根据类型选择一个
},
// 弹窗内容
content :{
type : String ,
value : '弹窗内容'
},
// 弹窗取消按钮文字
cancelText :{
type : String ,
value : '取消'
},
// 弹窗确认按钮文字
confirmText :{
type : String ,
value : '确定'
}
}, /**
* 私有数据,组件的初始数据
* 可用于模版渲染
*/
data: {
// 弹窗显示控制
isShow:false
}, /**
* 组件的方法列表
* 更新属性和数据的方法与更新页面数据的方法类似
*/
methods: {
/*
* 公有方法
*/ //隐藏弹框
hideDialog(){
this.setData({
isShow: !this.data.isShow
})
},
//展示弹框
showDialog(){
this.setData({
isShow: !this.data.isShow
})
},
/*
* 内部私有方法建议以下划线开头
* triggerEvent 用于触发事件
*/
_cancelEvent(){
//触发取消回调
this.triggerEvent("cancelEvent")
},
_confirmEvent(){
//触发成功回调
this.triggerEvent("confirmEvent");
}
}
})

step4

截至目前为止,你应该完成了一个自定义弹窗组件的大部分,可是你保存后并没有发现任何变化,因为我们还需要在 index.wxml 文件中引入它!

首先需要在 index.json 中引入组件:

{
"usingComponents": {
"dialog": "/components/Dialog/dialog"
}
}

然后我们在 index.wxml 中引入它,并增加我们自定义的一些值,如下

<!--index.wxml-->
<view class="container">
<dialog id='dialog'
title='我是标题'
content='恭喜你,学会了小程序组件'
cancelText='知道了'
confirm='谢谢你'
bind:cancelEvent="_cancelEvent"
bind:confirmEvent="_confirmEvent">
</dialog> <button type="primary" bindtap="showDialog"> ClickMe! </button>
</view>

嗯哪,还差最后一步, index.js 配置,没错,这个也很简单,我就复制粘贴了

  1.  //index.js
  2.  //获取应用实例
  3.  const app = getApp()
  4.   
  5.  Page({
  6.   
  7.  /**
  8.  * 生命周期函数–监听页面初次渲染完成
  9.  */
  10.  onReady: function () {
  11.  //获得dialog组件
  12.  this.dialog = this.selectComponent(“#dialog”);
  13.  },
  14.   
  15.  showDialog(){
  16.  this.dialog.showDialog();
  17.  },
  18.   
  19.  //取消事件
  20.  _cancelEvent(){
  21.  console.log(‘你点击了取消’);
  22.  this.dialog.hideDialog();
  23.  },
  24.  //确认事件
  25.  _confirmEvent(){
  26.  console.log(‘你点击了确定’);
  27.  this.dialog.hideDialog();
  28.  }
  29.   
  30.  })

到此!大功告成!

step5

让我们测试一下试试看:

微信小程序自定义组件

点击按钮之后呢,会出现如下效果:

微信小程序自定义组件

点击取消或者确定按钮的话,我们在事件中设置了弹窗会关闭,并会打印出相应的信息,具体点击完应该怎么做,就看你们自己发挥了,我只能帮你到这里了~

微信小程序自定义组件

原文地址:手把手教你实现微信小程序中的自定义组件-教程-小程序社区-微信小程序-微信小程序开发社区-小程序开发论坛-微信小程序联盟

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,497
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,910
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,744
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,498
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,135
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,298