前言
写插件是很有意思,也很锻炼人,因为这个过程中能发现许多的细节问题。在前端发展的过程中,jQuery无疑是一个重要的里程碑,围绕着这个优秀项目也出现了很多优秀的插件可以直接使用,大大节省了开发者们的时间.jQuery最重要的作用是跨浏览器,而现在浏览器市场虽不完的美,但已远没有从前那么惨,数据驱动视图的思想倍受欢迎,大家开始使用前端框架取代jQuery,我个人比较喜欢Vue.js,所以想试着用Vue.js写一个组件出来。
为了发布到npm上,所以给项目地址改名字了,但是内部代码没有改,使用方法比之前方便。
GitHub地址:
功能,期望
这个datepicker目前仅实现了一些常用的功能:
-
<李>选择时间(这话说得有点多余)李>
<李>最大/最小时间限制李>
<李>中/英文切换(其实也就星期和月份需要切换)李>
<李>可以以.vue形式使用,也可在浏览器环境中直接使用李>
<李>没了…李>
目录结构
万事的第一步依然是创建项目,只是单一组件,结构并不复杂,Datepicker.vue是最重要的组件文件,dist是webpack的输出文件夹,index.js是webpack打包的入口文件,最后是webpack的配置文件,用来对我们的库文件进行打包用的。因此项目结构就是这样:
。 ├──Datepicker.vue ├──许可证 ├──README.md ├──dist │└──vue-datepicker.js ├──index.js ├──package.json └──webpack.config.js >之前从Datepicker。vue入手
以。vue的方式写vue组件是一种特殊写法,每个vue文件包括模板,脚本,风格三部分,模板最好不要成为片段实例,所以最外层先套一层div,当做整个组件的根元素。一个datepicker一般由两部分组成,一个用来显示日期的输入框,一个用来选择日期的面板中,因为我发现输入在移动端会自动唤起键盘,所以没有使用输入,直接用了div模拟,通过点击事件决定板的显隐value是最终的结果,需要和父组件通信,所以将价值写成了道具,在父组件中使用value.sync=皒xx”, datepicker的价值就和父组件的xxx双向绑定了。
& lt; template> & lt; div类="日期选择"比; & lt; div类="输入" v-text=凹壑怠盄click=皃anelState=! panelState”比; & lt;/div> & lt; div类=" date-panel " v-show=皃anelState”比; & lt;/div> & lt;/template> & lt; scrip> 出口默认{ 数据(){ 返回{ panelState:假//初始值,默认面板关闭 } }, 道具:{ 值:字符串 } } & lt;/script> >之前渲染日期列表
一个月最少是28天,如果把周日排在开的头,那么最少(1号恰好是周日)需要4行,但是每个月天数30、31日居多,而且1号又不一定是周日,我索性干脆按最多的情况设计了,共6行,当月日期没填满的地方用上个月或下个月的日期补齐,这样就方便计算的了,而且切换月份时候面板高度不会变化。日期列表的数组需要动态计算,Vue提供了计算这个属性,所以直接将日期列表dateList写成计算属性。我的方法是将日期列表固定为长度为42的数组,然后将本月,上个月,下个月的日期依次填充。
计算:{ dateList () {//获取当月的天数 (这让currentMonthLength=新的日期。tmpMonth,这。tmpMonth + 1,0) .getDate ()//先将当月的日期塞入dateList 让dateList=Array.from({长度:currentMonthLength}, (val,索引)=比;{ 返回{ currentMonth:没错, 索引值:+ 1 } })//获取当月1号的星期是为了确定在1号前需要插多少天 (这让startDay=新的日期。年,这个。tmpMonth, 1) .getDay ()//确认上个月一共多少天 (这让previousMongthLength=新的日期。年,这个。tmpMonth,0) .getDate () }//在1号前插入上个月日期 (让我=0,len=startDay;我& lt;兰;我+ +){ dateList=[{previousMonth:真的,价值:previousMongthLength——我}].concat (dateList) }//补全剩余位置 (让我=0=1项;我& lt;42岁;我+ +项目+ +){ dateList [dateList。长度]={nextMonth:真的,价值:我} } 返回dateList } >之前这里用Array.from来初始化了一个数组,传入一个数组,转化成数组,在拼接字符串时候采用了arr [arr.length]和[{}].concat (arr)这种方式,因为在JsTips上学到这样做性能更好,文章的最后会贴出相关链接。
使用Vue写一个datepicker的示例