vue + vuex todolist的实现示例代码


Posted in Javascript onMarch 09, 2018

todolist demo

最近有空重新看了一下vuex,然后又写了一个todolist小demo,原理比较简单,主要是自己规范了一下代码的写法.

下载地址 :vue-test_3water.rar

效果图

vue + vuex todolist的实现示例代码

根组件

<template>
 <div class='container'>
 <h1 class='title'>todo list demo</h1>
 <type-filter
 :types='types'
 :filter='filter'
 :handleUpdateFilter='handleUpdateFilter'
 />
 <add-todo :handleAdd='handleAdd' />
 <todo-item
 v-for='(item,index) in list'
 :key='item.id'
 :index='index'
 :data='item'
 :filter='filter'
 :handleRemove='handleRemove'
 :handleToggle='handleToggle'
 />
 </div>
</template>

<script>
import { createNamespacedHelpers } from 'vuex'
import TypeFilter from './filter'
import AddTodo from './addTodo'
import TodoItem from './item'

const { mapState, mapMutations } = createNamespacedHelpers('TodoList')
export default {
 name: 'todo-list-demo',
 components: { TypeFilter, TodoItem, AddTodo },
 computed: {
 ...mapState(['list', 'types', 'filter'])
 },
 methods: {
 ...mapMutations([
 'handleAdd',
 'handleRemove',
 'handleToggle',
 'handleUpdateFilter'
 ])
 }
}
</script>

<style lang='scss' scoped>
@import './style.scss';
</style>

过滤条件组件

<template>
 <ul class='types'>
 <li
 v-for='(item,index) in types'
 :key='index + item'
 :class='filterClass(item)'
 @click='handleUpdateFilter(item)'
 >{{item}}</li>
 </ul>
</template>

<script>
export default {
 name: 'type-filter',
 props: ['types', 'filter', 'handleUpdateFilter'],
 methods: {
 filterClass(filter) {
 return { filter: true, active: filter === this.filter }
 }
 }
}
</script>

<style lang='scss' scoped>
@import './style.scss';
</style>

添加待办组件

<template>
 <input
 type='text'
 name='add-todo'
 id='add-todo-input'
 class='add-todo'
 @keyup.enter='add'
 placeholder='input then hit enter'
 />
</template>

<script>
export default {
 name: 'add-todo',
 props: ['handleAdd'],
 methods: {
 add(e) {
 const val = e.target.value.trim()
 if (val) {
 this.handleAdd({
  id: new Date().getTime(),
  message: val,
  status: false
 })
 e.target.value = ''
 }
 }
 }
}
</script>

<style lang='scss' scoped>
@import './style.scss';
</style>

单个待办事项组件

<template>
 <p v-if='show' class='todo-item'>
 <span
 :class='messageClass(data.status)'
 @click='handleToggle(data.id)'
 >{{index+1}}. {{data.message}}<i class='date'>{{dateFormat(data.id)}}</i></span>
 <span
 class='delete'
 @click='handleRemove(data.id)'
 >Delete</span>
 </p>
</template>

<script>
export default {
 name: 'todo-items',
 props: ['data', 'filter', 'index', 'handleRemove', 'handleToggle'],
 computed: {
 show() {
 return (
 this.filter === 'ALL' ||
 (this.filter === 'UNDO' && !this.data.status) ||
 (this.filter === 'DONE' && this.data.status)
 )
 }
 },
 methods: {
 dateFormat(time) {
 const date = new Date(time)
 return `(${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()})`
 },
 messageClass: status => ({ message: true, done: status })
 }
}
</script>

<style lang='scss' scoped>
@import './style.scss';
</style>

vuex部分(模块)

const state = {
 list: [],
 types: ['ALL', 'UNDO', 'DONE'],
 filter: 'ALL'
}
const mutations = {
 handleAdd(state, item) {
 state.list = [...state.list, item]
 },
 handleRemove(state, id) {
 state.list = state.list.filter(obj => obj.id !== id)
 },
 handleToggle(state, id) {
 state.list = state.list.map(
 obj => (obj.id === id ? { ...obj, status: !obj.status } : obj)
 )
 },
 handleUpdateFilter(state, filter) {
 state.filter = filter
 }
}
export default {
 namespaced: true,
 state,
 mutations
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
获取Javscript执行函数名称的方法
Dec 22 Javascript
javascript window.confirm确认 取消对话框实现代码小结
Oct 21 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
Mar 31 Javascript
Javascript实现返回上一页面并刷新的小例子
Dec 11 Javascript
javascript页面动态显示时间变化示例代码
Dec 18 Javascript
iframe实用操作锦集
Apr 22 Javascript
JS验证图片格式和大小并预览的简单实例
Oct 11 Javascript
jQuery ajax的功能实现方法详解
Jan 06 Javascript
Angular2学习教程之组件中的DOM操作详解
May 28 Javascript
vue-router源码之history类的浅析
May 21 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
Sep 10 Javascript
vue v-on:click传递动态参数的步骤
Sep 11 Javascript
vue实现在表格里,取每行的id的方法
Mar 09 #Javascript
vue移动端UI框架实现QQ侧边菜单组件
Mar 09 #Javascript
vue的安装及element组件的安装方法
Mar 09 #Javascript
11行JS代码制作二维码生成功能
Mar 09 #Javascript
浅谈vue.js导入css库(elementUi)的方法
Mar 09 #Javascript
使用use注册Vue全局组件和全局指令的方法
Mar 08 #Javascript
vue注册组件的几种方式总结
Mar 08 #Javascript
You might like
php生成二维码
2015/08/10 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
ie8下修改input的type属性报错的解决方法
2014/09/16 Javascript
javascript日期计算实例分析
2015/06/29 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
JS实现n秒后自动跳转的两种方法
2020/11/30 Javascript
ES6所改良的javascript“缺陷”问题
2016/08/23 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
2016/12/28 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
Vue.js实现文章评论和回复评论功能
2020/05/30 Javascript
[02:05]2014DOTA2西雅图邀请赛 专访啸天mik夫妻档
2014/07/08 DOTA
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
python for和else语句趣谈
2019/07/02 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
Python如何定义接口和抽象类
2020/07/28 Python
python 爬取B站原视频的实例代码
2020/09/09 Python
python lambda的使用详解
2021/02/26 Python
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
店长岗位职责
2013/11/21 职场文书
秋季婚礼证婚词
2014/01/11 职场文书
母亲追悼会答谢词
2014/01/27 职场文书
师德师风承诺书
2014/05/23 职场文书
社区志愿者活动总结
2014/06/26 职场文书
法定代表人资格证明书
2014/09/11 职场文书
音乐课外活动总结
2015/05/09 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
python turtle绘图
2022/05/04 Python
Fluentd搭建日志收集服务
2022/09/23 Servers