国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vue + vuex todolist的實(shí)現(xiàn)示例代碼

2019-11-19 14:12:27
字體:
供稿:網(wǎng)友

todolist demo

最近有空重新看了一下vuex,然后又寫了一個(gè)todolist小demo,原理比較簡單,主要是自己規(guī)范了一下代碼的寫法.

下載地址 :vue-test_jb51.rar

效果圖

根組件

<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>

單個(gè)待辦事項(xiàng)組件

<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}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 东源县| 清河县| 阿尔山市| 拉萨市| 巴东县| 泽州县| 永川市| 景东| 蕉岭县| 枣阳市| 沅陵县| 无极县| 垦利县| 剑阁县| 奉节县| 平江县| 开封市| 龙游县| 西吉县| 大竹县| 财经| 永嘉县| 共和县| 开化县| 建瓯市| 临夏县| 永新县| 泰顺县| 固安县| 宝坻区| 呼伦贝尔市| 龙山县| 莱阳市| 台中市| 拉萨市| 离岛区| 涿州市| 神木县| 库车县| 彩票| 晋宁县|