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 相关文章推荐
jquery遍历筛选数组的几种方法和遍历解析json对象
Dec 13 Javascript
使用js获取图片原始尺寸
Dec 03 Javascript
jQuery实现拖拽效果插件的方法
Mar 23 Javascript
JQuery实现带排序功能的权限选择实例
May 18 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
Jun 23 Javascript
AngularJs  unit-testing(单元测试)详解
Sep 02 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
May 15 jQuery
Vue声明式渲染详解
May 17 Javascript
jquery分页插件pagination使用教程
Oct 23 jQuery
JavaScript模板引擎应用场景及实现原理详解
Dec 14 Javascript
vue实现二级导航栏效果
Oct 19 Javascript
详解elementUI中input框无法输入的问题
Apr 27 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获取随机数字和字母的方法详解
2013/06/06 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
2016/10/13 PHP
javascript 对表格的行和列都能加亮显示
2008/12/26 Javascript
起点页面传值js,有空研究学习下
2010/01/25 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
jquery实现企业定位式导航效果
2018/01/01 jQuery
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
Python列表append和+的区别浅析
2015/02/02 Python
Python实时获取cmd的输出
2015/12/13 Python
Django实现快速分页的方法实例
2017/10/22 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
python虚拟环境迁移方法
2019/01/03 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
Python描述数据结构学习之哈夫曼树篇
2020/09/07 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
市场部规章制度
2014/01/24 职场文书
四年级下册教学反思
2014/02/01 职场文书
党校个人自我鉴定范文
2014/03/28 职场文书
法定代表人资格证明书
2014/09/11 职场文书
公司合并协议书范本
2014/09/30 职场文书
酒店采购员岗位职责
2015/04/03 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
2015年电信员工工作总结
2015/05/26 职场文书
2015年数学教研工作总结
2015/07/22 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby
Python 匹配文本并在其上一行追加文本
2022/05/11 Python
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers