diff --git a/src/calendar/README.md b/src/calendar/README.md
new file mode 100644
index 000000000..f75a5a491
--- /dev/null
+++ b/src/calendar/README.md
@@ -0,0 +1,47 @@
+# Calendar
+
+### Install
+
+``` javascript
+import Vue from 'vue';
+import { Calendar } from 'vant';
+
+Vue.use(Calendar);
+```
+
+## Usage
+
+### Basic Usage
+
+```html
+
+```
+
+## API
+
+### Props
+
+| Attribute | Description | Type | Default | Version |
+|------|------|------|------|------|
+
+### Props
+
+| Attribute | Description | Type | Default | Version |
+|------|------|------|------|------|
+
+### Events
+
+| Event | Description | Parameters |
+|------|------|------|
+
+### Slots
+
+| Name | Description | SlotProps |
+|------|------|------|
+
+### Methods
+
+Use [ref](https://vuejs.org/v2/api/#ref) to get Canlendar instance and call instance methods
+
+| Name | Description | Attribute | Return value |
+|------|------|------|------|
diff --git a/src/calendar/README.zh-CN.md b/src/calendar/README.zh-CN.md
new file mode 100644
index 000000000..adfde0714
--- /dev/null
+++ b/src/calendar/README.zh-CN.md
@@ -0,0 +1,44 @@
+# Calendar 日历
+
+### 引入
+
+``` javascript
+import Vue from 'vue';
+import { Calendar } from 'vant';
+
+Vue.use(Calendar);
+```
+
+## 代码演示
+
+### 基础用法
+
+```html
+
+```
+
+## API
+
+### Props
+
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+|------|------|------|------|------|
+| v-model | 选中的日期 | `Date` | - | - |
+| title | 日历标题 | `string` | - | - |
+
+### Events
+
+| 事件名 | 说明 | 回调参数 |
+|------|------|------|
+
+### Slots
+
+| 名称 | 说明 | SlotProps |
+|------|------|------|
+
+### 方法
+
+通过 [ref](https://cn.vuejs.org/v2/api/#ref) 可以获取到 Calendar 实例并调用实例方法
+
+| 方法名 | 说明 | 参数 | 返回值 |
+|------|------|------|------|
diff --git a/src/calendar/demo/index.vue b/src/calendar/demo/index.vue
new file mode 100644
index 000000000..7cbd6b398
--- /dev/null
+++ b/src/calendar/demo/index.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/calendar/index.js b/src/calendar/index.js
new file mode 100644
index 000000000..478d84b75
--- /dev/null
+++ b/src/calendar/index.js
@@ -0,0 +1,57 @@
+import { createNamespace } from '../utils';
+import { isDate } from '../utils/validate/date';
+
+const [createComponent, bem, t] = createNamespace('calendar');
+const now = new Date();
+
+export default createComponent({
+ props: {
+ title: String,
+ minDate: {
+ type: Date,
+ default: () => new Date(now),
+ validator: isDate
+ },
+ maxDate: {
+ type: Date,
+ default: () => new Date(now.getFullYear(), now.getMonth() + 6, now.getDate()),
+ validator: isDate
+ }
+ },
+
+ data() {
+ return {};
+ },
+
+ methods: {
+ genTitle() {
+ if (this.title) {
+ return
{this.title}
;
+ }
+ },
+
+ genWeekDays() {
+ const weekdays = t('weekdays');
+
+ return (
+
+ {weekdays.map(item => (
+ {item}
+ ))}
+
+ );
+ },
+
+ genMonth() {}
+ },
+
+ render() {
+ return (
+
+ {this.genTitle()}
+ {this.genWeekDays()}
+
+
+ );
+ }
+});
diff --git a/src/calendar/index.less b/src/calendar/index.less
new file mode 100644
index 000000000..ef52ca793
--- /dev/null
+++ b/src/calendar/index.less
@@ -0,0 +1,37 @@
+@import '../style/var';
+
+.van-calendar {
+ display: flex;
+ flex-direction: column;
+ height: 80vh;
+
+ &__title,
+ &__weekdays {
+ flex-shrink: 0;
+ }
+
+ &__title {
+ height: 44px;
+ font-weight: @font-weight-bold;
+ font-size: @font-size-lg;
+ line-height: 44px;
+ text-align: center;
+ }
+
+ &__weekdays {
+ display: flex;
+ }
+
+ &__weekday {
+ flex: 1;
+ font-size: @font-size-sm;
+ line-height: 30px;
+ text-align: center;
+ }
+
+ &__body {
+ flex: 1;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
diff --git a/src/calendar/test/__snapshots__/demo.spec.js.snap b/src/calendar/test/__snapshots__/demo.spec.js.snap
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/calendar/test/__snapshots__/index.spec.js.snap b/src/calendar/test/__snapshots__/index.spec.js.snap
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/calendar/test/demo.spec.js b/src/calendar/test/demo.spec.js
new file mode 100644
index 000000000..5c70922b5
--- /dev/null
+++ b/src/calendar/test/demo.spec.js
@@ -0,0 +1,4 @@
+import Demo from '../demo';
+import { snapshotDemo } from '../../../test/demo';
+
+snapshotDemo(Demo);
diff --git a/src/calendar/test/index.spec.js b/src/calendar/test/index.spec.js
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/locale/lang/zh-CN.ts b/src/locale/lang/zh-CN.ts
index 15b555f75..4ac93a0b1 100644
--- a/src/locale/lang/zh-CN.ts
+++ b/src/locale/lang/zh-CN.ts
@@ -11,6 +11,9 @@ export default {
nameEmpty: '请填写姓名',
confirmDelete: '确定要删除么',
telInvalid: '请填写正确的电话',
+ vanCalendar: {
+ weekdays: ['日', '一', '二', '三', '四', '五', '六']
+ },
vanContactCard: {
addText: '添加联系人'
},
diff --git a/vant.config.js b/vant.config.js
index 79c3f8a1e..e0100e805 100644
--- a/vant.config.js
+++ b/vant.config.js
@@ -114,6 +114,10 @@ module.exports = {
title: '表单组件',
icon: 'orders-o',
items: [
+ {
+ path: 'calendar',
+ title: 'Calendar 日历'
+ },
{
path: 'checkbox',
title: 'Checkbox 复选框'
@@ -446,6 +450,10 @@ module.exports = {
title: 'Form Components',
icon: 'orders-o',
items: [
+ {
+ path: 'calendar',
+ title: 'Calendar'
+ },
{
path: 'checkbox',
title: 'Checkbox'