项目实战

发布时间:2024-12-17 23:23

'->'项目实战,通过实际项目提升经验 #生活技巧# #工作学习技巧# #编程学习路径#

最新推荐文章于 2024-10-25 16:48:04 发布

weixin_33721344 于 2018-12-05 00:38:20 发布

需求分析

在实际项目中,表单里面的日期选择是常用的组件。Vant有提供日期组件,但是居然没有提供下拉形式的日期组件,不过该有的元件都有,就自己封装一个。

封装组件过程中我们要解决:

和表单的样式能兼容错误提示参数问题事件机制格式化

解决问题

就给新的组件取名为 VantFieldDate。
期望使用的时候是这样的

<vant-field-date

label="发布时间"

v-model="formData.publishDate"

type="datetime"

:max-date="new Date()"

/>

具体实现,我贴上代码详细讲解。

<template>

<div class="vant-field-date">

<van-cell

:title="label"

:class="{'readonly': readonly, 'placeholder' : text}"

:is-link="!readonly"

:required="required"

@click="show">

{{ text ? text : placeholder }}

<div

v-if="$attrs.error"

v-text="$attrs['error-message']"

class="van-field__error-message"

/>

</van-cell>

<van-actionsheet v-model="isShowPicker">

<van-datetime-picker

v-bind="$attrs"

:type="type"

title="请选择日期"

:min-date="minDate"

:max-date="maxDate"

@cancel="cancel"

@confirm="confirm"

/>

</van-actionsheet>

</div>

</template>

<script>

export default {

name: 'VantFieldDate',

inheritAttrs: false,

props: {

value: {

type: [Number, Date],

default: undefined

},

label: {

type: String,

default: null

},

required: {

type: Boolean,

default: false

},

readonly: {

type: Boolean,

default: false

},

placeholder: {

type: String,

default: '请选择'

},

format: {

type: String,

default: null

}

},

data() {

return {

selectedItem: null,

isShowPicker: false

}

},

computed: {

formatFormula() {

if(this.format){

return this.format

} else if (this.type === 'date') {

return 'yyyy-MM-dd'

} else if (this.type === 'datetime') {

return 'yyyy-MM-dd hh:mm'

} else if (this.type === 'time') {

return 'hh:mm'

} else if (this.type === 'year-month') {

return 'yyyy-MM'

}

},

text() {

return this.value ? this.dateFormat(this.value, this.formatFormula) : ''

}

},

methods: {

dateFormat: (value, format) => {

if (!value) return

if (!(value instanceof Date)) {

value = new Date(value)

}

let o = {

'M+': value.getMonth() + 1,

'd+': value.getDate(),

'h+': value.getHours(),

'm+': value.getMinutes(),

's+': value.getSeconds(),

'q+': Math.floor((value.getMonth() + 3) / 3),

'S': value.getMilliseconds()

}

if (!format || format === '') {

format = 'yyyy-MM-dd hh:mm:ss'

}

if (/(y+)/.test(format)) {

format = format.replace(RegExp.$1, (value.getFullYear() + '').substr(4 - RegExp.$1.length))

}

for (let k in o) {

if (new RegExp('(' + k + ')').test(format)) {

format = format.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length))

}

}

return format

},

show() {

if (!this.readonly) {

this.isShowPicker = true

}

},

confirm(value) {

this.$emit('input', value.getTime(), value)

this.$emit('change', value.getTime(), value)

this.cancel()

},

cancel() {

this.isShowPicker = false

}

}

}

</script>

效果

图片描述

网址:项目实战 https://www.yuejiaxmz.com/news/view/504038

相关内容

Harmony鸿蒙实战开发项目
家庭助手(HomeAssistant)开源项目实战指南
爬虫实战项目
项目施工过程中的节能减排实战手册
成本管控实战:挖掘项目节约潜力的关键策略
项目实施
物联网智能项目实战:从智能家居到智慧城市
计算机实战项目之SSM家庭理财个人理财管理系统
构建待办事项清单:Android应用实战
数据分析实战项目4

随便看看