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接口实现代码 (Interfaces In JavaScript)
Jun 11 Javascript
JavaScript中的排序算法代码
Feb 22 Javascript
利用jQuery接受和处理xml数据的代码(.net)
Mar 28 Javascript
jquery批量设置属性readonly和disabled的方法
Jan 24 Javascript
JS函数的几种定义方式分析
Dec 17 Javascript
js中变量的连续赋值(实例讲解)
Jul 08 Javascript
微信小程序对接七牛云存储的方法
Jul 30 Javascript
Vue2.0 事件的广播与接收(观察者模式)
Mar 14 Javascript
vue计算属性和监听器实例解析
May 10 Javascript
从vue源码解析Vue.set()和this.$set()
Aug 30 Javascript
vue Tab切换以及缓存页面处理的几种方式
Nov 05 Javascript
JavaScript 如何计算文本的行数的实现
Sep 14 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
Zend Framework+smarty用法实例详解
2016/03/19 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
php post换行的方法
2020/02/03 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
ExtJs之带图片的下拉列表框插件
2010/03/04 Javascript
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
Bootstrap轮播插件使用代码
2016/10/11 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
小程序云开发实战小结
2018/10/25 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Python中的descriptor描述器简明使用指南
2016/06/02 Python
python3+PyQt5泛型委托详解
2018/04/24 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
Python flask框架post接口调用示例
2019/07/03 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
HTML5标签使用方法详解
2015/11/27 HTML / CSS
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
研究生自荐信
2013/10/09 职场文书
运动会稿件300字
2014/02/14 职场文书
统计岗位职责
2014/02/21 职场文书
高中学生评语大全
2014/04/25 职场文书
药剂专业自荐书
2014/06/20 职场文书
四查四看整改措施
2014/09/19 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
2014年健康教育工作总结
2014/11/20 职场文书