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 相关文章推荐
用Javascript来生成ftp脚本的小例子
Jul 03 Javascript
全面理解面向对象的 JavaScript(来自ibm)
Nov 10 Javascript
使用纯javascript实现经典扫雷游戏
Apr 23 Javascript
javascript高级编程之函数表达式 递归和闭包函数
Nov 29 Javascript
详解JS面向对象编程
Jan 24 Javascript
深入理解node exports和module.exports区别
Jun 01 Javascript
vue如何实现observer和watcher源码解析
Mar 09 Javascript
javascript 作用于作用域链的详解
Sep 27 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
Sep 28 Javascript
vue axios 二次封装的示例代码
Dec 08 Javascript
vue.js 实现评价五角星组件的实例代码
Aug 13 Javascript
手淘flexible.js框架使用和源代码讲解小结
Oct 15 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使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
JS 动态加载脚本的4种方法
2009/05/05 Javascript
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
2015/08/24 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
2020/04/28 Javascript
js实现车辆管理系统
2020/08/26 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
[01:13:46]iG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
django中的HTML控件及参数传递方法
2018/03/20 Python
python如何为被装饰的函数保留元数据
2018/03/21 Python
tensorflow实现简单的卷积网络
2018/05/24 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
HTML5新标签兼容——&gt; 的两种方法
2018/09/12 HTML / CSS
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
毕业生找工作的自我评价
2013/10/18 职场文书
最新奶茶店创业计划书
2014/01/25 职场文书
运动会入场词50字
2014/02/20 职场文书
教师群众路线心得体会
2014/11/04 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
2015年党总支工作总结
2015/05/25 职场文书
挂职锻炼工作总结2015
2015/05/28 职场文书
欠款证明
2015/06/24 职场文书
python使用pygame创建精灵Sprite
2021/04/06 Python
nginx+lua单机上万并发的实现
2021/05/31 Servers
Go语言空白表示符_的实例用法
2021/07/04 Golang