欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 前端技术 > vue >内容正文

vue

基于vue和vuex的todos效果展示及源码分享

发布时间:2024/10/14 vue 99 豆豆
生活随笔 收集整理的这篇文章主要介绍了 基于vue和vuex的todos效果展示及源码分享 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

todos,待做项目经常被以各种方式来实现,js,node,
这里分享一个基于vue和vuex的todos
主要有三部分代码main.js,index.js,App.vue

import Vue from 'vue' import App from './App.vue'// 1. 导入 ant-design-vue 组件库 import Antd from 'ant-design-vue' // 2. 导入组件库的样式表 import 'ant-design-vue/dist/antd.css' import store from './store/index' Vue.config.productionTip = false// 3. 安装组件库 Vue.use(Antd)new Vue({render: h => h(App),store }).$mount('#app') import Vue from 'vue' import Vuex from 'vuex' import axios from 'axios'Vue.use(Vuex)export default new Vuex.Store({state: {list: [],inputValue: 'abc',nextId: 5,viewKey: 'all'},mutations: {initList(state, list) {state.list = list},setInputValue(state, val) {state.inputValue = val},addItem(state) {const obj = {id: state.nextId,info: state.inputValue.trim(),done: false}state.list.push(obj)state.nextId++state.inputValue = ''},removeItem(state, id) {const i = state.list.findIndex(x => x.id === id)if (i !== -1) {state.list.splice(i, 1)}},changeStatus(state, param) {const i = state.list.findIndex(x => x.id === param.id)if (i !== -1) {state.list[i].done = param.status}},cleanDone(state) {state.list = state.list.filter(x => x.done === false)},changeViewKey(state, key) {state.viewKey = key}},actions: {getList(context) {axios.get('../list.json').then(({ data }) => {// console.log(data);context.commit('initList', data)})}},getters: {unDoneLength(state) {return state.list.filter(x => x.done == false).length},infoList(state) {if (state.viewKey === 'all') {return state.list} else if (state.viewKey === 'undone') {return state.list.filter(x => !x.done)} else if (state.viewKey === 'done') {return state.list.filter(x => x.done)} else {return state.list}}},modules: {} }) <template><div id="app"><a-input placeholder="请输入任务" class="my_ipt" :value="inputValue"@change="handleInputChange"/><a-button type="primary" @click="addItemToList">添加事项</a-button><a-list bordered :dataSource="infoList" class="dt_list"><a-list-item slot="renderItem" slot-scope="item"><!-- 复选框 --><a-checkbox :checked="item.done" @change="(e)=>{cbStatusChanged(e,item.id)}">{{item.info}}</a-checkbox><!-- 删除链接 --><a slot="actions" @click="removeItemById(item.id)">删除</a></a-list-item><!-- footer区域 --><div slot="footer" class="footer"><!-- 未完成的任务个数 --><span>{{unDoneLength}}条剩余</span><!-- 操作按钮 --><a-button-group><a-button :type="viewKey==='all'?'primary':'default'" @click="changeList('all')">全部</a-button><a-button :type="viewKey==='undone'?'primary':'default'" @click="changeList('undone')">未完成</a-button><a-button :type="viewKey==='done'?'primary':'default'" @click="changeList('done')">已完成</a-button></a-button-group><!-- 把已经完成的任务清空 --><a @click="clean">清除已完成</a></div></a-list></div> </template><script> import {mapState,mapGetters} from 'vuex'export default {name: 'app',data() {return {}},created(){this.$store.dispatch('getList')},computed:{...mapState(['inputValue','viewKey']),...mapGetters(['unDoneLength','infoList'])},methods:{handleInputChange(e){// console.log(e.target.value);this.$store.commit('setInputValue',e.target.value)},addItemToList(){if(this.inputValue.trim().length <= 0){return this.$message.warning('文本框内容不能为空!')}this.$store.commit('addItem')},removeItemById(id){this.$store.commit('removeItem',id)},cbStatusChanged(e,id){const param = {id:id,status:e.target.checked}this.$store.commit('changeStatus',param)},clean(){this.$store.commit('cleanDone')},changeList(key){this.$store.commit('changeViewKey',key)}} } </script><style scoped> #app {padding: 10px; }.my_ipt {width: 500px;margin-right: 10px; }.dt_list {width: 500px;margin-top: 10px; }.footer {display: flex;justify-content: space-between;align-items: center; } </style>




源码链接: link.

与50位技术专家面对面20年技术见证,附赠技术全景图

总结

以上是生活随笔为你收集整理的基于vue和vuex的todos效果展示及源码分享的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。