Vuex案例ToDoList

Vuex学习

  • 使用UI:ant-design-vue 修改main.js
import Vue from 'vue'
import App from './App.vue'
import store from './store.js'

// 导入 ant-design-vue 组件库
import Antd from 'ant-design-vue'
// 导入组件库的样式表
import 'ant-design-vue/dist/antd.css'

Vue.config.productionTip = false
// 注册组件库
Vue.use(Antd)

new Vue({
  render: h => h(App),
  store // 挂载 store
}).$mount('#app')
  • 修改App.vue组件,完善功能
<template>
  <div>
    <a-input placeholder="请输入任务" class="my_ipt" :value="inputValue"  @change="handleInputChange"/>
    <a-button type="primary" @click="addItemToList">添加事项</a-button>
    <a-list border :dataSource="infoList" class="dt_list">
       <a-list-item slot="renderItem" slot-scope="item">
        <!-- 复选框 -->
        <a-checkbox :checked="item.done" @change="(e, item.id) => { cbStatusChanged(e) }">{{ item.info }} </a-checkbox>
         <!-- 删除链接 -->
        <a slot="action" @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() {
      // 调用 store 中的方法
      this.$store.dispatch('getList')
  },
  computed: {
    // 按需导入 store 中的 state 映射计算属性
    ...mapState(['inputValue', 'viewKey'])
    ...mapGetters(['unDoneLength', 'infoList'])
  },
  methods: {
    // 监听输入文本框内容变化
    handleInputChange(e) {
      this.$store.commit('setInputValue', e.target.value)
    },
    // 向列表中新增 item 项
    addItemToList() {
      if(this.inputValue.trim().length <= 0) {
        return this.$message.warning('文本框的内容不能为空!')
      }
      this.$store.commit('addItem')
    }
  },
  // 根据 Id 删除对应的事项
  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('clearnDone')
  },
  // 修改页面展示的数据列表
  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>

  • 创建 list.json 数据文件
 [
  {
    "id": 0,
    "info": "这是一件应该要完成的事情0",
    "done": false
  },
  {
    "id": 1,
    "info": "这是一件应该要完成的事情1",
    "done": false
  },
  {
    "id": 2,
    "info": "这是一件应该要完成的事情2",
    "done": false
  },
  {
    "id": 3,
    "info": "这是一件应该要完成的事情3",
    "done": false
  },
  {
    "id": 4,
    "info": "这是一件应该要完成的事情4",
    "done": false
  }
 ]
  • 创建 store.js
import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'  // 导入axios 请求数据

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    list: [],   // 所有任务列表
    inputValue: '',
    nextId: 5,   // 下一个ID
    viewKey: 'all'
  },
  mutations: {
    // 为 store 中的 list 赋值
    initList(state, list) {
      state.list = list
    },
    // 为 store 中的 inputValue 赋值
    setInputValue(state, val) {
      state.inputValue = val
    },
    // 添加列表项
    addItem() {
      const obj = {
        id: state.nextId,
        info: state.inputValue.trim(),
        done: false
      }
      state.list.push(obj)
      state.nextId ++
      state.inputValue = ''
    },
   // 根据 Id 删除对应的任务事项
   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.findexIndex(x => x.id === param.id)
      if (i !== -1) {
        state.list[i].done = param.status
      }
   },
  // 清除已完成的任务
  clearnDone(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)
        // 调用 mutations 中的方法更新 state
        context.commit('initList', data)
      })
    }
  },
  getters: {
    // 统计未完成的任务条数
    unDoneLength(state) {
      return state.list.filter(x => x.done === false).length
    },
    // 
    infoList() {
      if(state.viewKey === 'all') {
        return state.list
      }
      if(state.viewKey === 'unDone') {
        return state.list.filter(x=>!x.done)
      }
      if(state.viewKey === 'done') {
        return state.list.filter(x=>x.done)
      }
      return state.list
    } 
  }
})  

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342