From 2cef87a6311e33f17ef2e77e78c55a5a6a927e04 Mon Sep 17 00:00:00 2001 From: iczer <1126263215@qq.com> Date: Sat, 25 Aug 2018 19:30:06 +0800 Subject: [PATCH] refactor: TaskCard components --- src/App.vue | 23 ++++++---- src/components/task/Index.vue | 30 +++++-------- src/components/task/TaskCard.vue | 72 +++++++++++++++++++++++++------- src/components/task/TaskItem.vue | 6 ++- 4 files changed, 88 insertions(+), 43 deletions(-) diff --git a/src/App.vue b/src/App.vue index 7629b80..1f70f06 100644 --- a/src/App.vue +++ b/src/App.vue @@ -18,11 +18,20 @@ export default { } </script> -<style> -#app { - /*font-family: 'Avenir', Helvetica, Arial, sans-serif;*/ - /*-webkit-font-smoothing: antialiased;*/ - /*-moz-osx-font-smoothing: grayscale;*/ - /*color: #2c3e50;*/ -} +<style lang="less"> + //拖拽控件全局样式 + :global{ + .dragable-ghost{ + border: 1px dashed #aaaaaa; + opacity: 0.65; + } + .dragable-chose{ + border: 1px dashed #aaaaaa; + opacity: 0.65; + } + .dragable-drag{ + border: 1px dashed #aaaaaa; + opacity: 0.65; + } + } </style> diff --git a/src/components/task/Index.vue b/src/components/task/Index.vue index e5ecd44..396ab67 100644 --- a/src/components/task/Index.vue +++ b/src/components/task/Index.vue @@ -1,19 +1,13 @@ <template> <div style="display: flex"> - <task-card style="margin: 0 48px" title="ToDo"> - <draggable :options="{group: 'a', sort: true, scroll: true, scrollSpeed: 2, animation: 250, ghostClass: 'ghost', chosenClass: 'chose'}"> - <task-item :key="index" v-for="(item, index) in todoList" :content="item" /> - </draggable> + <task-card class="task-card" title="ToDo" group="task"> + <task-item :key="index" v-for="(item, index) in todoList" :content="item" /> </task-card> - <task-card style="margin: 0 48px" title="In Progress"> - <draggable :options="{group: 'a', sort: true, scroll: true, scrollSpeed: 2, animation: 250, ghostClass: 'ghost', chosenClass: 'chose'}"> - <task-item :key="index" v-for="(item, index) in inproList" :content="item" /> - </draggable> + <task-card class="task-card" title="In Progress" group="task"> + <task-item :key="index" v-for="(item, index) in inproList" :content="item" /> </task-card> - <task-card style="margin: 0 48px" title="Done"> - <draggable :options="{group: 'a', sort: true, scroll: true, scrollSpeed: 2, animation: 250, ghostClass: 'ghost', chosenClass: 'chose'}"> - <task-item :key="index" v-for="(item, index) in doneList" :content="item" /> - </draggable> + <task-card class="task-card" title="Done" group="task"> + <task-item :key="index" v-for="(item, index) in doneList" :content="item" /> </task-card> </div> </template> @@ -21,13 +15,12 @@ <script> import TaskCard from './TaskCard' import TaskItem from './TaskItem' -import Draggable from 'vuedraggable' const todoList = ['任务一', '任务二', '任务三', '任务四', '任务五', '任务六'] const inproList = ['任务七', '任务八', '任务九', '任务十', '任务十一', '任务十二'] const doneList = ['任务十三', '任务十四', '任务十五', '任务十六', '任务十七', '任务十八'] export default { name: 'Index', - components: {TaskItem, TaskCard, Draggable}, + components: {TaskItem, TaskCard}, data () { return { todoList, @@ -38,11 +31,8 @@ export default { } </script> -<style lang="less"> - .ghost{ - background-color: rgba(256, 256, 256, 0.5); - } - .chose{ - border: 1px dashed #aaaaaa; +<style lang="less" scoped> + .task-card{ + margin: 0 48px; } </style> diff --git a/src/components/task/TaskCard.vue b/src/components/task/TaskCard.vue index 97db0d5..975cbb0 100644 --- a/src/components/task/TaskCard.vue +++ b/src/components/task/TaskCard.vue @@ -1,38 +1,80 @@ <template> - <a-card class="task-card" size="large" :title="title" :bordered="false" :bodyStyle="{backgroundColor: '#e1e4e8'}"> - <div slot="extra"> + <div class="task-card"> + <div class="task-head"> + <h3 class="title"><span v-if="count">{{count}}</span>{{title}}</h3> + <div class="actions" style="float: right"> <a-icon class="add" type="plus" draggable="true"/> <a-icon class="more" style="margin-left: 8px" type="ellipsis" /> </div> - <slot></slot> - </a-card> + </div> + <div class="task-content"> + <draggable :options="dragOptions"> + <slot></slot> + </draggable> + </div> + </div> </template> <script> -import ACard from 'ant-design-vue/es/card/Card' import AIcon from 'ant-design-vue/es/icon/icon' +import Draggable from 'vuedraggable' + +const dragOptions = { + sort: true, + scroll: true, + scrollSpeed: 2, + animation: 150, + ghostClass: 'dragable-ghost', + chosenClass: 'dragable-chose', + dragClass: 'dragable-drag' +} + export default { name: 'TaskCard', - components: {AIcon, ACard}, - props: ['title'], + components: {AIcon, Draggable}, + props: ['title', 'group'], data () { return { + dragOptions: {...dragOptions, group: this.group} + } + }, + computed: { + count () { + return this.$slots.default.length } } } </script> -<style lang="less" scoped> +<style lang="less"> .task-card{ width: 33.33%; - font-size: 24px; - font-weight: bolder; + padding: 8px 8px; background-color: #e1e4e8; - .add{ - cursor: pointer; - } - .more{ - cursor: pointer; + border-radius: 6px; + border: 1px solid #d1d4d8; + .task-head{ + margin-bottom: 8px; + .title{ + display: inline-block; + span{ + display: inline-block; + border-radius: 10px; + margin: 0 8px; + font-size: 12px; + padding: 2px 6px; + background-color: rgba(27,31,35,0.15); + } + } + .actions{ + display: inline-block; + float: right; + font-size: 18px; + font-weight: bold; + i{ + cursor: pointer; + } + } } } </style> diff --git a/src/components/task/TaskItem.vue b/src/components/task/TaskItem.vue index 0dca8a0..37ebd48 100644 --- a/src/components/task/TaskItem.vue +++ b/src/components/task/TaskItem.vue @@ -16,9 +16,13 @@ export default { <style lang="less" scoped> .task-item{ margin-bottom: 16px; - transition: all .3s; + box-shadow: 0 1px 1px rgba(27,31,35,0.1); + border-radius: 6px; + color: #24292e; & :hover{ cursor: move; + box-shadow: 0 1px 1px rgba(27,31,35,0.15); + border-radius: 6px; } } </style>