内容简介:微信小程序自定义组件的生命周期指的是指的是组件自身的一些函数,这些函数在特殊的时间点或遇到一些特殊的框架事件时被自动触发。其中,最重要的生命周期是其中引入了两个wxs文件中的函数
- 最近写小程序写上瘾了,业务上需要实现一个倒计时的功能,考虑到可拓展以及使用方便,便将其封装成组件(写习惯了JSX不得不吐槽小程序自定义组件的繁琐)
- 萌新第一次在掘金写东西,东西比较简单可能拉低整个掘金的文章水平了(求轻喷~)
需求
- 可配置倒计时的时间
- 倒计时结束后执行事件
- 可配置倒计时时间的格式
步骤
-
先定义自定义组件的
properties,这里有两个父组件传给该倒计时组件的参数target倒计时的时间,format倒计时时间的格式
properties: {
target: {
type: String,
},
format: {
type: Function,
default: null
}
},
复制代码
- 定义组件生命周期函数
lifetimes: {
attached() {
//组件创建时
this.setData({
lastTime: this.initTime(this.properties).lastTime, //根据 target 初始化组件的lastTime属性
}, () => {
//开启定时器
this.tick();
//判断是否有format属性 如果设置按照自定义format处理页面上显示的时间 没有设置按照默认的格式处理
if (typeof this.properties.format === 'object') {
this.defaultFormat(this.data.lastTime)
}
})
},
detached() {
//组件销毁时清除定时器 防止爆栈
clearTimeout(timer);
},
},
复制代码
微信小程序自定义组件的生命周期指的是指的是组件自身的一些函数,这些函数在特殊的时间点或遇到一些特殊的框架事件时被自动触发。其中,最重要的生命周期是 created
attached
detached
,包含一个组件实例生命流程的最主要时间点。具体微信自定义组件学习参考官方文档
- 定义组件自身的状态
/**
* 组件的初始数据
*/
data: {
d: 0, //天
h: 0, //时
m: 0, //分
s: 0, //秒
result: '', //自定义格式返回页面显示结果
lastTime:'' //倒计时的时间错
},
复制代码
- 组件自身的方法
methods: {
//默认处理时间格式
defaultFormat: function(time) {
const day = 24 * 60 * 60 * 1000
const hours = 60 * 60 * 1000;
const minutes = 60 * 1000;
const d = Math.floor(time / day);
const h = Math.floor((time - d * day) / hours);
const m = Math.floor((time - d * day - h * hours) / minutes);
const s = Math.floor((time - d * day - h * hours - m * minutes) / 1000);
this.setData({
d,
h,
m,
s
})
},
//定时事件
tick: function() {
let {
lastTime
} = this.data;
timer = setTimeout(() => {
if (lastTime < interval) {
clearTimeout(timer);
this.setData({
lastTime: 0,
result: ''
},
() => {
this.defaultFormat(lastTime)
if (this.onEnd) {
this.onEnd();
}
}
);
} else {
lastTime -= interval;
this.setData({
lastTime,
result: this.properties.format ? this.properties.format(lastTime) : ''
},
() => {
this.defaultFormat(lastTime)
this.tick();
}
);
}
}, interval);
},
//初始化时间
initTime: function(properties) {
let lastTime = 0;
let targetTime = 0;
try {
if (Object.prototype.toString.call(properties.target) === '[object Date]') {
targetTime = Number(properties.target).getTime();
} else {
targetTime = new Date(Number(properties.target)).getTime();
}
} catch (e) {
throw new Error('invalid target properties', e);
}
lastTime = targetTime - new Date().getTime();
return {
lastTime: lastTime < 0 ? 0 : lastTime,
};
},
//时间结束回调事件
onEnd: function() {
this.triggerEvent('onEnd');
}
}
复制代码
defaultFormat
:默认时间处理函数 tick
:定时事件 initTime
初始化时间 onEnd
:时间结束的回调
-
倒计时组件
countDown.js完整代码
var timer = 0;
var interval = 1000;
Component({
/**
* 组件的属性列表
*/
properties: {
target: {
type: String,
},
format: {
type: Function,
default: null
}
},
lifetimes: {
attached() {
//组件创建时
this.setData({
lastTime: this.initTime(this.properties).lastTime, //根据 target 初始化组件的lastTime属性
}, () => {
//开启定时器
this.tick();
//判断是否有format属性 如果设置按照自定义format处理页面上显示的时间 没有设置按照默认的格式处理
if (typeof this.properties.format === 'object') {
this.defaultFormat(this.data.lastTime)
}
})
},
detached() {
//组件销毁时清除定时器 防止爆栈
clearTimeout(timer);
},
},
/**
* 组件的初始数据
*/
data: {
d: 0, //天
h: 0, //时
m: 0, //分
s: 0, //秒
result: '', //自定义格式返回页面显示结果
lastTime:'' //倒计时的时间错
},
/**
* 组件的方法列表
*/
methods: {
//默认处理时间格式
defaultFormat: function(time) {
const day = 24 * 60 * 60 * 1000
const hours = 60 * 60 * 1000;
const minutes = 60 * 1000;
const d = Math.floor(time / day);
const h = Math.floor((time - d * day) / hours);
const m = Math.floor((time - d * day - h * hours) / minutes);
const s = Math.floor((time - d * day - h * hours - m * minutes) / 1000);
this.setData({
d,
h,
m,
s
})
},
//定时事件
tick: function() {
let {
lastTime
} = this.data;
timer = setTimeout(() => {
if (lastTime < interval) {
clearTimeout(timer);
this.setData({
lastTime: 0,
result: ''
},
() => {
this.defaultFormat(lastTime)
if (this.onEnd) {
this.onEnd();
}
}
);
} else {
lastTime -= interval;
this.setData({
lastTime,
result: this.properties.format ? this.properties.format(lastTime) : ''
},
() => {
this.defaultFormat(lastTime)
this.tick();
}
);
}
}, interval);
},
//初始化时间
initTime: function(properties) {
let lastTime = 0;
let targetTime = 0;
try {
if (Object.prototype.toString.call(properties.target) === '[object Date]') {
targetTime = Number(properties.target).getTime();
} else {
targetTime = new Date(Number(properties.target)).getTime();
}
} catch (e) {
throw new Error('invalid target properties', e);
}
lastTime = targetTime - new Date().getTime();
return {
lastTime: lastTime < 0 ? 0 : lastTime,
};
},
//时间结束回调事件
onEnd: function() {
this.triggerEvent('onEnd');
}
}
})
复制代码
-
倒计时组件
countDown.wxml完整代码
<wxs src="../wxs/utils.wxs" module="utils" />
<wxs src="../../comm.wxs" module="comm" />
<view class="count-down">
<text wx:if="{{result!==''}}">{{result}}</text>
<block wx:else>
<text wx:if="{{comm.numberToFixed(d)>0}}">{{d}}天</text>
<text>{{utils.fixedZero(h)}}</text>
<text style="font-weight: 500">:</text>
<text>{{utils.fixedZero(m)}}</text>
<text style="font-weight: 500">:</text>
<text>{{utils.fixedZero(s)}}</text>
</block>
</view>
复制代码
其中引入了两个wxs文件中的函数
WXS(WeiXin Script)是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构。官方文档
function fixedZero(val) {
return val * 1 < 10 ? '0' + val : val;
}
//保留 pos位小数
function numberToFixed(number, pos) {
if (number === null || number === '' || number < 0) return ''
return parseFloat(number).toFixed(pos)
}
复制代码
组件使用
- 引入方式
"usingComponents": {
"countDown": "../../../components/countDown/countDown"
},
复制代码
- 代码演示
<countDown bind:onEnd="getPageList" format="{{formatTime}}" target="{{creatTargetTime}}" />
复制代码
const formatChinaDate = mss => {
let days = parseInt(mss / (1000 * 60 * 60 * 24));
let hours = parseInt((mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
let minutes = parseInt((mss % (1000 * 60 * 60)) / (1000 * 60));
let seconds = parseInt((mss % (1000 * 60)) / 1000);
return days + ' 天 ' + hours + ' 小时 ' + minutes + ' 分钟 ' + seconds + ' 秒 ';
};
data:{
formatTime:formatChinaDate,
creatTargetTime:1556428889000, //时间戳
}
getPageList:function(){
//倒计时结束啦
console.log('倒计时结束啦')
}
复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Vue自定义组件(简单实现一个自定义组件)
- angular自定义组件-UI组件篇-switch组件
- 简单-定义一个小程序组件
- 自定义react数据验证组件
- 关于自定义组件的那些事儿
- ReactNative学习笔记(四)之自定义文本组件与Image组件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
微机原理与接口技术
李文英、李勤、刘星、宋蕴新 / 清华大学出版社 / 2001-9 / 26.00元
《高等院校计算机应用技术规划教材•应用型教材系列•微机原理与接口技术》是“高职高专计算机系列教材”之一。全书包括微机原理、汇编语言、接口技术三部分内容。微机原理部分讲述了80x86的内部结构及工作原理、半导体存储器及其系统、微型机总线结构等。汇编语言部分讲述了指令系统、编程技巧。接口技术部分讲述了中断系统、中断控制器、并行接口、串行接口、DMA控制器、定时器,以及A/D、D/A转换器等常用芯片的硬......一起来看看 《微机原理与接口技术》 这本书的介绍吧!