如何写一个微信小程序组件

news/2024/12/26 13:04:46

背景

先谈下背景,在做一款产品的时候需要用到日期选择器,但是官方的却不太满足需求,因为无法选择农历啊。所以自己来造一个轮子好了,造轮子之前先想想啊,万一以后多个地方要用到,多个项目要用,怎么办呢?

那把这个轮子抽象,定义输入输出,即接口。组件里面怎么运转调用方不管啊,给了什么输入,就只管结果好了。

组件三要素

组件的三要素就是小程序定义的三种文件:

  • js

  • wxml

  • wxss

因为js本身就是模块化开发,所以这天然有利于组件化。wxml和wxss呢,定义了组件的皮肤,小程序的模板template标签可以方便wxml的复用。至于wxss,没有独立出来,目前没发现要怎么整合到独立的组件中去,而不与其他的wxss发生耦合。

<!--
  index: int
  msg: string
  time: string
-->
<template name="myTemplate">
  <view>
    <text> {{index}}: {{msg}} </text>
    <text> Time: {{time}} </text>
  </view>
</template>

用法

//  如果模板是写在单独的wxml文件,则要inport,引入。路径则是当前文件的相对路径。

<import src="../cal/calendar.wxml"></import>

<template is="myTemplate" data="{{...item}}"/>

需要注意的是data数据是有单独的作用域的,只能使用data传入的数据。具体的理解就是:

data: {
    item: {
        index: int
        msg: string
        time: string
    },
    index: int
    msg: string
    time: string
}

模板里面的数据实际显示的是item的属性,而不是和item同级的属性。
模板还有一种用法

<template is="myTemplate" data="{{index,msg,time}}"/>

这样就要传入模板中用到的三个变量,而不是item一个对象。模板渲染的结果则是最外层的index属性,而不是item的index属性值。

...符号是扩展运算符,理解为将一个对象所以的属性展开传递给模板,这样的好处是不要传递多个,写出的代码更加简洁。扩展运算符是ES6的特性,有兴趣可以深入学习。

如果运用扩展运算符给模板传入数据,像上面怎么去更新单个key的值呢?小程序提供了可以根据属性路径更新的方法:

// 更新单个key,
this.setData({
    index: 1
});
/* 更新对象中的单个key
item: {
   index: int
   msg: string
   time: string
}
*/
this.setData({
    'item.index': 1
});

// path必须是字符串,不能是变量替代。下面是不行的
path =  'item.index';
this.setData({
   path: 1
});

虽然用法上是有点限制,但也避免了传入一堆的参数给模板。

值得注意的是入参data的item必须是有初始化值,否则会报错。

日历组件

所以利用template和js就可以打造一款组件了。先看下我所做的组件:
小程序日历

定义一个wxml文件

<template name="calendar">
...
</template>

定义一个js文件


class Calendar {
...
}

日期类有自己的作用域名,所以组件内部的事件导致数据更新的时候,还是要用页面更新数据的方法this.setData,所以必须要将页面对象传递给组件内部。

页面调用组件:

// this 是当前页面page对象,含有setData方法。
var calendar = new Calendar(this, function(date) {
  that.setData({
      date: date
  })
});

// 当选择日期变化的时候,组件内部事件: this.pageCtx 则是page上下文,即上面实例化组件入参的this对象。
changeCalendarTab(e) {
   this.pageCtx.setData({
       'calendar_data.selectDateType':
           +e.target.dataset.tap
   });
   this.data.selectDateType = +e.target.dataset.tap;
   this.changeCallBack && this.changeCallBack(this.getCurrentSelectDate());
}

具体组件请参考我的github:calendar。

这样就完成了一个组件编写,任何需要用到的地方都可以引入了。小程序一个不太好的地方是没有包管理的概念,导致跨项目见的公共模块复用起来比较麻烦,下次进行单独讲解。

by addy 原创文章,欢迎转载,但希望全文转载,注明本文地址。本文地址:http://www.iamaddy.net/2017/0...

憋走,点赞是美意,打赏是鼓励~


http://www.niftyadmin.cn/n/1376601.html

相关文章

亚马逊标题分词

导包 import pandas as pd from nltk.tokenize import word_tokenize from nltk.corpus import stopwords from nltk.stem.porter import PorterStemmer from nltk.text import Text from nltk import ngrams,FreqDist 读数据 data pd.read_csv(rD:\数据\亚马逊搜索词排名\…

汇编语言第3章 寄存器(内存访问)

*****本章学习***** 3.1 字数据在内存中的存储 &#xff08;1&#xff09;字单元&#xff0c;即存放一个字型数据&#xff08;16位&#xff09;的内存单元&#xff0c;由两个地址连续的内存单元组成 &#xff08;2&#xff09;高地址内存单元中存放字型数据的高位字节&#xff…

struts2整合JFreechart 饼图、折线图、柱形图

struts2整合JFreechart 饼图、折线图、柱形图 上效果图&#xff1a; 当然可以将数据导出图片格式存储。具体下的链接里的文件有保存成图片的操作。 因为是strust2整合JFreechart,所以strust2框架一定得搭建好。 1.导入三个包&#xff1a;http://download.csdn.net/detail/x4646…

转化图片格式

import os from PIL import Imageos.chdir(r"D:\jupyter\image_convert") os.getcwd() file os.listdir(r"D:\jupyter\image_convert")for f in file:img Image.open(f)img.load()f f.split(".")[0]img.save(f".jpg")

分布式优化名人堂

刘青山 http://web2.nuist.edu.cn/xky/2013-10/20131022215516.html http://web2.nuist.edu.cn:8080/jszy/Professor.aspx?id1754 杨绍富 http://cse.seu.edu.cn/personalpage/ysf/publications.html?tdsourcetags_pctim_aiomsg 凌青 http://home.ustc.edu.cn/~qingling/home…

用mysql实现类似于oracle dblink的功能

为什么80%的码农都做不了架构师&#xff1f;>>> 用mysql实现类似于oracle dblink的功能 首先看看有没有federated 引擎&#xff1a; mysql> show engines; -----------------------------------------------------------------------------------------------…

核心基础(一)--设置搜索路径和字符串连接方式

设置Python模块的搜索路径有几种方式 设置PYTHONPATH环境变量添加.pth文件&#xff08;先在txt文件中写入需要添加为永久路径的项目路径&#xff0c;然后更改文件后缀名为.pth&#xff0c;再次查看sys.path会发现路径已添加至环境变量&#xff09;通过sys.path.append()设置路…

STL 1–迭代器std::begin()和std::end()使用

迭代器是一个行为类似于指针的模板类对象。只需要迭代器iter指向一个有效对象&#xff0c;就可以通过使用*iter解引用的方式来获取一个对象的引用。通常会使用一对迭代器来定义一段元素&#xff0c;可以是任意支持迭代器对象的元素&#xff0c;一段元素是一个通过起始迭代器指向…