要做自定义组件,我们先定一个小目标,比如说我们在小程序中实现一下 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

让我们测试一下试试看:

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

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

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

微信小程序自定义组件的更多相关文章

  1. 微信小程序自定义组件,提示组件

    微信小程序自定义组件,这里列举了一个常用的提示自定义组件,调用自定义组件中的方法和字段.仅供参考和学习. 编写组件: 在根目录下添加“components”目录,然后像添加Page页面一样添加自定义组 ...

  2. 微信小程序自定义组件的使用以及调用自定义组件中的方法

    在写小程序的时候,有时候页面的内容过多,逻辑比较复杂,如果全部都写在一个页面的话,会比较繁杂,代码可读性比较差,也不易于后期代码维护,这时候可以把里面某部分功能抽出来,单独封装为一个组件,也就是通常说 ...

  3. 微信小程序自定义组件-下拉框

    这个是网址https://www.cnblogs.com/zjjDaily/p/9548433.html 微信小程序之自定义select下拉选项框组件 知识点:组件,animation,获取当前点击元 ...

  4. 微信小程序自定义组件实现

    官方从 1.6.3 开始对于自定义组件这一块有了比较大的变动,首先比较明显的感觉就是文档比以前全多了,有木有!,现在小程序支持简洁的组件化编程,可以将页面内的功能模块抽象成自定义组件,以便在不同的页面 ...

  5. 微信小程序自定义组件封装及父子间组件传值

    首先在我们可以直接写到需要的 page 中,然后再进行抽取组件,自定义组件建议 wxzx-xxx 命名 官网地址:https://developers.weixin.qq.com/miniprogra ...

  6. 微信小程序 自定义组件(stepper)

    项目目录: 步骤一:创建组件 声明这一组文件为自定义组件 stepper.json { "component": true, "usingComponents" ...

  7. 微信小程序 自定义组件(modal) 引入组件

    项目结构: 步骤一:创建组件 声明这一组文件为自定义组件 modal.json { "component": true, // 自定义组件声明 "usingCompone ...

  8. 微信小程序 自定义组件 多列选择器 对象数组 ObjectArray 自关联 三级联动

    使用方法 在 Page.json 注册组件 { "usingComponents": { "address-picker": "/component/ ...

  9. 微信小程序自定义组件——接受外部传入的样式类

    https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html 外部样式类 有时, ...

随机推荐

  1. WPF模板(一)详细介绍

    本次随笔来源于电子书,人家的讲解很好,我就不画蛇添足了. 图形用户界面应用程序较之控制台界面应用程序最大的好处就是界面友好.数据显示直观.CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据 ...

  2. I/O 机制的介绍(Linux 中直接 I/O 机制的介绍)

    IO连接的建立方式 1.缓存IO.流式IO: 2.映射IO.块式IO: 3.直接IO. IO的方式: 同步.异步.定时刷新: MMAP与内核空间 mmap使用共享用户空间与内核空间实现: 直接 I/O ...

  3. SQL Server 数据导入Mysql具体教程

    SQLServer2005数据导入Mysql到具体教程(測试) SQL SERVER数据导入MYSQL文件夹   1.Navicat for MySQL 版本号10.0.9 2.创建目标数据库 3.创 ...

  4. fastText文本分类算法

    1.概述 FastText 文本分类算法是有Facebook AI Research 提出的一种简单的模型.实验表明一般情况下,FastText 算法能获得和深度模型相同的精度,但是计算时间却要远远小 ...

  5. SDOI2017 R1做题笔记

    SDOI2017 R1做题笔记 梦想还是要有的,万一哪天就做完了呢? 也就是说现在还没做完. 哈哈哈我竟然做完了-2019.3.29 20:30

  6. 转://Window下安装Oracle ASM单实例数据库

    之前做的Oracle ASM实验都是基于Linux或者Unix操作系统的,最近想试试如何在Windows环境下使用Oracle ASM.本文介绍如何在windows下创建裸设备,并创建ASM磁盘组以及 ...

  7. Echarts 报错:Uncaught Error: [MODULE_MISS]"echarts/config" is not exists!

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code   问题: 报错:Uncaught Error: [MODULE_MISS]" ...

  8. ASP.Net:Javascript 通过PageMethods 调用后端WebMethod方法 + 多线程数据处理 示例

    ASP.Net:Javascript 通过PageMethods 调用后端WebMethod方法 + 多线程数据处理 示例 2012年04月27日 16:59:16 奋斗的小壁虎 阅读数:4500   ...

  9. lelnet爱一直在

    [root@elk3 ~]# telnet 192.168.122.135 22 Trying 192.168.122.135... 这意味着telnet 没有收到任何回应来建立连接.有两个可能的原因 ...

  10. 理解 vue-router的beforeEach无限循环的问题

    在理解beforeEach无限循环之前,我们先来看一下beforeEach相关的知识点,该篇文章的项目是基于 express+vue+mongodb+session实现注册登录 这篇文章项目基础之上进 ...