微信小程序自定义组件


Posted in Javascript onAugust 16, 2017

前言

最近接触微信小程序,再次之前公司用的前端框架是vue ,然后对比发现,开发小程序是各种限制,对于开发者非常不友好。各种槽点太多,完全吐槽不过来,所以在此不多说,打算下次专门写一篇文章吐槽一下。本次主要分享下小程序自定义组件的一点思路,小程序官方提供的框架比较简陋,原始,可复用较差,没有实现自定义组件的功能,这让很多使用vue ,react前端开发非常难受。网上存在各种吐槽,也有分享实现自定义组件的方法,但是要么过于复杂,要么是微信小程序升级之后就不兼容,反正是各种坑你没商量。在这分享下本人在项目中是如何实现的,欢迎指正批评,互相学习。

toast自定义组件实现

  • 这里用最简单的toast组件为例子
  • 官方框架只提供了 页面模板功能 : WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用。
  • 但是这个功能不 支持js,样式封装,需要在对应的页面做处理,且模板还有自己的作用域,需要使用data传入。
  • 把功能封装成独立的组件,需要和页面独立,在使用时将组件挂载到对应的页面,所以组件需要传入页面this(Page)对象 ,实现代码如下

目录结构

|------components
        |------toast
                |------toast.js
                |------toast.wxml
                |------toast.wxss

代码

toast.wxml

<template name='toast'>
  <view class="s-toast" wx:if="{{msg}}">
    <view class="s-toast-content">{{msg}}</view>
  </view>
</template>

toast.js

/**
 * toastMsg 必传 提示内容
 * showTime 非必传 显示时间秒
*/
function toast(page, toastMsg, showTime) {
  let timer
  page.setData({ toastMsg })
  showTime = showTime || toastMsg.length / 4
  console.log(showTime)
  clearTimeout(timer)
  timer = setTimeout(() => {
    page.setData({ toastMsg: '' })
    clearTimeout(timer)
  }, showTime * 1000)
}

module.exports = {
  toast: toast,
}
toast.wxss
.s-toast-content {
  position: fixed;
  left: 50%;
  color: #fff;
  width: 500rpx;
  bottom: 120rpx;
  background: hsla(0,0%,7%,.7);
  padding: 15rpx;
  text-align: center;
  -webkit-transform: translateX(-50%);
  transform: translateX(-50%);
  border-radius: 4rpx;
  z-index: 6999;
}

使用方法

1、wxml引用页面模板

2、js 文件引用 toast.js

import { toast } from '../../../project/component/toast/toast.js'

3、调用

toast(this, '填写详细信息')

改进及更多扩展

实际项目中会有toast confirm loading ···等多个通用组件 ,还有大量的业务组件,我们可以把js都引入到一个js文件中,然后在页面加载的时候(onLoad方法)中注册this(page),这样只需要注册一次便可以使用所有的组件,如

toast(this,'填写详细信息'')

变成

toast('填写详细信息'')

同样的思路,我们可以实现类似vue中混合(mixin)的功能,在业务复杂的项目中,大大提高代码的可复用 性和可维护性。

公司小程序只有我一个人开发,不存在多人协作开发小程序的情况,在这方面下的功夫不多。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript将相对地址转换为绝对地址示例代码
Jul 19 Javascript
jquery ajax 局部无刷新更新数据的实现案例
Feb 08 Javascript
node.js中的http.response.removeHeader方法使用说明
Dec 14 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
Jan 23 Javascript
Bootstrap笔记之缩略图、警告框实例详解
Mar 09 Javascript
Angular2使用vscode断点调试ts文件的方法
Dec 13 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
Dec 14 Javascript
利用JS判断客户端类型你应该知道的四种方法
Dec 22 Javascript
ES6模板字符串和标签模板的应用实例分析
Jun 25 Javascript
layui table 表格模板按钮的实例代码
Sep 21 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
Nov 01 Javascript
vue ssr服务端渲染(小白解惑)
Nov 10 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
Aug 16 #Javascript
微信小程序多列选择器range-key使用详解
Mar 30 #Javascript
jQuery取得元素标签名称小结(附代码)
Aug 16 #jQuery
微信小程序tabBar底部导航中文注解api详解
Aug 16 #Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
Aug 16 #Javascript
微信小程序开发animation心跳动画效果
Aug 16 #Javascript
全选复选框JavaScript编写小结(附代码)
Aug 16 #Javascript
You might like
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
PHP-Java-Bridge使用笔记
2014/09/22 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
JavaScript实现动态增加文件域表单
2009/02/12 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
Javascript学习笔记二 之 变量
2010/12/15 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
2013/12/25 Javascript
给js文件传参数(详解)
2014/07/13 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
jQuery实现鼠标移入移出事件切换功能示例
2018/09/06 jQuery
webpack的CSS加载器的使用
2018/09/11 Javascript
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
原生js实现日历效果
2020/03/02 Javascript
js实现动态时钟
2020/03/12 Javascript
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
python中is与双等于号“==”的区别示例详解
2017/11/21 Python
Python使用Matplotlib实现雨点图动画效果的方法
2017/12/23 Python
python实现大转盘抽奖效果
2019/01/22 Python
Python3 文章标题关键字提取的例子
2019/08/26 Python
python 进程的几种创建方式详解
2019/08/29 Python
pandas创建DataFrame的7种方法小结
2020/06/14 Python
python cv2.resize函数high和width注意事项说明
2020/07/05 Python
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
寒假致家长的一封信
2015/10/10 职场文书
mysql中varchar类型的日期进行比较、排序等操作的实现
2021/11/17 MySQL