这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

相信我们在开发各类小程序或者H5,甚至APP时,会把uni-app作为一个技术选型,其优点在于一键打包多端运行,较为强大的跨平台的性能。但是,只要开发就免不了使用插件,所以Dcloud为了方便开发者同时也为注入活力,开放了uni的插件市场。从此,我们可以很方便的使用其中的一些第三方插件来满足我们要开发的一些业务需求了。但你知道怎么制作一款uni的插件吗?它又是如何发布到插件商城里的吗?

介绍

开发过微信小程序的朋友或许知道,它的主包限制成2M,我们在插件商城挑选插件时,其实还是要斟酌的,尽可能使用更轻量级的,使用起来更方便的。最近有个需求,页面中出现了一个日历,日历的功能很简单就是切换月份,后端一些特殊日期数据能用颜色标记一下即可。但引入的ui库的日历又有点大,借此机会,本期就按照需求特制了一款轻量级的日历插件进行分享,看看它是如何开发出来并发布到插件商城上面去的。

让我们先来看看发布使用后的效果吧:

开发

创建文件

我们先打开 HBuilder X ,创建一个 uni-app 的项目,在里面创建一个名叫 uni_modules 的文件夹。

然后 uni_modules 上点击右键,里面选择新建 uni_modules插件 ,然会出现一个弹框要求你对插件起名。

起名其实可以随意,最好语义化强一些还要带点自己的特色,比如,这款日历插件我起名叫 ml-calendar ,咳咳,大致意思就是 jsmask-light-calendar,也就是jsmask的轻量级日历,见笑了。就这样,点击创建,就会生成好一个插件结构,我们就会在这里面写关于这个插件的所有逻辑。

还没结束,我们还要在里面创建一个index.js的文件,里面写入:

import mlCalendar from "./components/ml-calendar/ml-calendar"
export default mlCalendar

因为我们只涉及到一个ui组件,所以 export default直接指到这个组件上就好了。这一步很关键,因为如果不写他的话,在引用这款插件的时候默认是找不到这个插件的,会报错查找失败。

依赖引入

因为本次需要快速开发出一款日历来,所以免不了出现很多时间形式的判断和验证,比如,如果日历是当天就不会显示阿拉伯数字了会直接显示汉字今日,所以生成的时候就要判断当前系统时间和日期是不是同一天上。所以,为了方便使用了 dayjs ,相信作为前端开发者没有不知道它的大名吧,它是一款极其轻量的时间库,当然你也可以自己把用到的手写出来,这样体积会更小,但这里为了方便和更多扩展可能就引入进来了。

这里的 dayjs 文件 ,为了省事,我是从node安装后的包里拷贝出来的:

现在就可以在 vue 文件中引入使用它了,当然,我这里还建了个libs文件夹专门来存储第三方库文件的。

import dayjs from '../../libs/dayjs.js'

传入参数

我们先来看看要实现的界面图:

export default {
name: "ml-calendar",
props: {
value: {
type: [Number, String, Date],
default: ""
},
range: {
type: Array,
default: () => ["2021-01", ""]
},
rows: {
type: Array,
default: () => []
},
// ...
},
// ...
}

我们需要提前想好可能会传来什么值,会影响这个日历的生成,首先,肯定要知道需要哪年哪月的数据,value 这里可以传入多种类型然后再让dayjs处理出来,得到统一的日期格式,默认传空字符串,意思就是当月。毕竟,知道年份月份才能得到当月的天数生成周对应的日么。

range 代表时间范围,可以选择上图的左右箭头对应的上一个月和下一个月,月份不能超出范围。

rows 代表着你传入日期对应的标识色,如 :

let rows = [{
date: "2022-5-21",
color: "#5F8BFB"
}, {
date: "2022-5-24",
color: "#FBA75F"
}, {
date: "2022-5-26",
color: "#FBA75F"
}]

接下来,我们就围绕着这些参数去完成这个日历编写。

遍历日期

export default {
name: "ml-calendar",
data() {
return {
year: "",
month: "",
date: [],
now: "",
first: dayjs(this.value).format("YYYY-MM")
}
},
methods: {
render() {
this.date.length = 0;
this.year = dayjs(this.first).year();
this.month = dayjs(this.first).month() + 1;
this.now = dayjs().format("YYYY-MM-DD");
let days = [...new Array(dayjs(this.first).daysInMonth()).keys()].map(i => {
let n = i + 1;
let text = n < 10 ? "0" + n : n;
let date = `${this.first}-${text}`;
let now = !!(dayjs(date).diff(this.now, 'day') === 0);
let color = "";
let obj = this.rows.find(item => dayjs(date).diff(item.date, 'day') === 0);
if (obj) {
color = obj.color
}
return {
text,
date,
color,
now,
}
})
let week = dayjs(`${this.year}-${this.month}-1`).day();
this.date = [...new Array(week ? (week - 1) : 6).fill(null), ...days]
},
// ...
}
}

首先,我们定义一个 first 变量,表示需要展示的年月,因为要变成日历,肯定日期要对应周几,这样我们通过 dayjs(this.first).daysInMonth() 方法获取当前传入月份的天数,然后进行遍历,把 rows 传入的标记色都给填充上。再通过得知算出这个月的第一天是周几,然后在前面就空出多少个数据来生成出 date

<template>
<view class="ml-calendar">
<!-- more -->
<view class="ml-calendar-month__days">
<view class="ml-calendar-month__days__day" v-for="(item, index) in date" :key="index"
:class="{'active':item&&item.color}" @click="$emit('select',item)">
<view class="ml-calendar-tips" :style="{'background-color':item&&item.color}"></view>
<text v-if="item" :class="[{'now':item.now}]">{{item.now?'今日':item.text}}</text>
</view>
</view>
</view>
</template>

当然,通过观察,每行始终是7个等大的格子,所以样式方面我们大可以使用 grid布局 ,可以十分快速的实现效果 。

.m-calendar-month__days {
display: grid;
grid-template-columns: repeat(7, 1fr);
}

监听更新

当修改当前日期时,或者标记数据时都要求重新渲染日历,此时用 watch 就可以轻松实现。

watch: {
first(v) {
this.render()
this.$emit("change", {
year: this.year,
month: this.month,
})
},
rows(v) {
this.render()
}
}

别忘了,我们还要定义两个事件给开发者使用,在 first 改变是会发出来一个 change事件 ,表示当前日历的年月,发生了改变发出通知。此时接受到通知,你可以从后端走接口重新获取新值或者完成其他的业务逻辑。而另一个是 select事件 来完成点击某个日期,发出的响应,在上个步骤的遍历阶段可以看出。

使用测试

<template>
<view>
<ml-calendar style="width:100%" :rows="rows" :range="range" :value="value" @change="changeDate" @select="selectDate" />
</view>
</template>
<script>
export default {
data() {
return {
value:"2022-05", // 初始化显示的月份
range: ["2021-05", ""], // 时间范围
rows: [{ // 特殊日期标注数据,当前日期和标注颜色
date: "2022-5-21",
color: "#5F8BFB"
}, {
date: "2022-5-24",
color: "#FBA75F"
}, {
date: "2022-5-26",
color: "#FBA75F"
}],
// ...
}
},
methods: {
// 切换日历时触发
changeDate(e){
console.log(e)
},
// 点击日期返回当前日期对象
selectDate(e){
console.log(e)
}
}
//...
}
</script>

日历的大小可能受外界容器的影响,所以,给他加一个100%的宽,此时,我们可以看到,他浏览器和微信小程序的表现是基本一致的。

发布

编辑readme

发布之前我们当然需要在里面的 readme.md 文件写写你开发这款软件是什么?怎么用?这些至少说明白,不然别人过段时间自己都忘了怎么用了,方便别人也方便自己吧。

执行发布

最后我们在 uni_modules 的文件夹中,找的我们刚刚写的 ml-calendar ,在这个文件夹上点击右键选择 发布到插件市场 (此前,必须要在Dcloud注册为开发者并且实名认证)。

此时,会填写一些关于这款插件的信息:

当然,里面会涉及到这款插件的兼容情况的填写,至于到底兼不兼容各端,收不收费根据情况去选择吧。

当点击提交后,就会执行发布指令了。

此时,如果控制台会有发布后的返回信息:

如果成功则会返回一个插件地址链接,点开链接:

本文转载于:

https://www.gxlsystem.com/qianduan-2337714.html

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

记录--手把手带你开发一个uni-app日历插件(并发布)的更多相关文章

  1. 手把手教你用Vue2+webpack+node开发一个H5 app

    手把手教你用Vue2+webpack+node开发一个H5 app ​前一篇vue2 + webpack + node 开发一个小demo说到了用vue的一些基本用法,这一篇就讲一个复杂一点的更完整的 ...

  2. 手把手带你做一个超炫酷loading成功动画view Android自定义view

    写在前面: 本篇可能是手把手自定义view系列最后一篇了,实际上我也是一周前才开始真正接触自定义view,通过这一周的练习,基本上已经熟练自定义view,能够应对一般的view需要,那么就以本篇来结尾 ...

  3. 从0开始,手把手教你用Vue开发一个答题App

    项目演示 项目演示 项目源码 项目源码 教程说明 本教程适合对Vue基础知识有一点了解,但不懂得综合运用,还未曾使用Vue从头开发过一个小型App的读者.本教程不对所有的Vue知识点进行讲解,而是手把 ...

  4. [已开源/文章教程]独立开发 一个社交 APP 的源码/架构分享 (已上架)

    0x00 背景 真不是和被推荐了2天的博客园一位大神较真,从他那篇文章的索引式文章内容也学习到了很多东西,看评论区那么多对社交APP源码有兴趣的,正巧我上周把我的一个社交APP开源了,包括androi ...

  5. 如何开发一个直播APP

    一.个人见解(直播难与易) 直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通 ...

  6. 开发一个成功APP的六个技巧

    越来越多的人开始使用智能手机,平板电脑或其他的移动设备.出于这个原因,移动APP开发已成为当今软件开发中增长最快的领域之一.本文提供九个简单而有效的提示,可帮助您规划和实施成功的移动APP. 1.目标 ...

  7. 在2015年 开发一个 Web App 必须了解的那些事

    在过去的一年里,我在从头开始开发我的第一个重要的Web应用.经验教会了很多以前不知道的东西,特别是在安全性和用户体验方面. 值得一提的是,我上一次尝试构建的任何合理复杂性是在2005年.所以,在安全防 ...

  8. 开发一个 Web App 必须了解的那些事

    在过去的一年里,我在从头开始开发我的第一个重要的Web应用.经验教会了很多以前不知道的东西,特别是在安全性和用户体验方面. 值得一提的是,我上一次尝试构建的任何合理复杂性是在2005年.所以,在安全防 ...

  9. 如何基于App SDK快速地开发一个IoT App?

    一.背景及大纲介绍 在如今物联网DCM(Device.Connect.Manage)的大框架下,有一个应用层来分析和处理数据,是必备技能.但是,对于一个公司来说,因为研发能力或者研发时间的原因,可能很 ...

  10. 手把手带你画一个动态错误提示 Android自定义view

    嗯..再差1篇就可以获得持之以恒徽章了,今天带大家画一个比较简单的view. 转载请注明出处:http://blog.csdn.net/wingichoy/article/details/504771 ...

随机推荐

  1. NC20277 [SCOI2010]字符串

    题目链接 题目 题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhg ...

  2. NC224933 漂亮数

    题目链接 题目 题目描述 小红定义一个数满足以下条件为"漂亮数": 该数不是素数. 该数可以分解为2个素数的乘积. 4 是漂亮数,因为 4=2*2 21 是漂亮数,因为 21=3* ...

  3. NC50439 tokitsukaze and Soldier

    题目链接 题目 题目描述 在一个游戏中,tokitsukaze需要在n个士兵中选出一些士兵组成一个团去打副本. 第i个士兵的战力为v[i],团的战力是团内所有士兵的战力之和. 但是这些士兵有特殊的要求 ...

  4. NC24870 [USACO 2009 Dec G]Video Game Troubles

    题目链接 题目 题目描述 Farmer John's cows love their video games! FJ noticed that after playing these games th ...

  5. Auxiliary Set题解

    F Auxiliary Set 树上LCA + DFS 注意一下输出格式! #include<bits/stdc++.h> using namespace std; const int N ...

  6. win32 - IFolderView2::GetCurrentFolderFlags的使用

    网上关于IFolderView2接口调用的示例有点少. 下面的例子是将桌面的图标隐藏起来,使用了FWF_NOICONS样式. #include <ShlObj.h> // Shell AP ...

  7. win32 - 内存映射(CreateFileMapping)

    目标:创建一个app,使用CreateToolhelp32Snapshot扫描所有的进程,并将进程的pid和exe名字映射到内存中,再在另一个app中使用OpenFileMapping打开该映射读取相 ...

  8. 深入理解Go语言(04):scheduler调度器-GMP里结构体源码分析

    在前面一节中简单介绍了golang的调度模型-GPM模型,介绍了他们各自的作用.这篇文章就来看看他们的源码结构. Go版本:go1.13.9 M结构体 M结构体是OS线程的一个抽象,主要负责结合P运行 ...

  9. pikachu sql inject bool盲注

    输入框中输入 已知用户名 kobe 显示了用户信息 your uid:3 your email is: kobe@pikachu 输入kobe'看一下情况 显示 您输入的username不存在,请重新 ...

  10. .Net 6 WebAPI 使用JWT进行 授权认证配置

    .Net 6 WebAPI 使用JWT进行 授权认证 1.安装组件(Nuget) Microsoft.AspNetCore.Authentication.JwtBearer 2.Program.cs ...