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 相关文章推荐
一些技巧性实用js代码小结
Oct 14 Javascript
jquery弹出框的用法示例(2)
Aug 26 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
Jan 20 Javascript
jquery操作select大全
Apr 25 Javascript
jquery实现九宫格大转盘抽奖
Nov 13 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
Jun 14 Javascript
request请求获取参数的实现方法(post和get两种方式)
Sep 27 Javascript
Select2.js下拉框使用小结
Oct 24 Javascript
使用jQuery实现页面定时弹出广告效果
Aug 24 jQuery
JS实现websocket长轮询实时消息提示的效果
Oct 10 Javascript
vue 录制视频并压缩视频文件的方法
Jul 27 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
Aug 07 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实现查询两个数组中不同元素的方法
2016/02/23 PHP
Joomla开启SEF的方法
2016/05/04 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
PHP+redis实现的购物车单例类示例
2019/02/02 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
33种Javascript 表格排序控件收集
2009/12/03 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
JavaScript伸缩的菜单简单示例
2013/12/03 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
2016/06/15 Javascript
JS使用正则表达式验证身份证号码
2017/06/23 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
node.js 模块和其下载资源的镜像设置的方法
2018/09/06 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
nodejs二进制与Buffer的介绍与使用
2019/07/11 NodeJs
JS数据类型STRING使用实例解析
2019/12/18 Javascript
python装饰器深入学习
2018/04/06 Python
python3基于TCP实现CS架构文件传输
2018/07/28 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
python使用smtplib模块发送邮件
2020/12/17 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
领先的英国注册在线药房 :Simply Meds Online
2019/03/28 全球购物
见习期自我鉴定
2013/11/07 职场文书
医药专业应届毕业生求职信范文
2014/01/01 职场文书
人力资源总监工作说明
2014/03/03 职场文书
学雷锋演讲稿
2014/03/04 职场文书
党员教师四风问题对照检查材料
2014/09/26 职场文书
2014年小班保育员工作总结
2014/12/23 职场文书
公司年夜饭通知
2015/04/25 职场文书