vuex的基础小案例(黑马教程)

一,使用cli初始化项目,然后安装axios运行依赖和ant-design-vue

在这里插入图片描述
在这里插入图片描述
入口文件main.js:

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.js'

Vue.config.productionTip = false
// 3. 安装组件库
Vue.use(Antd)

new Vue({
    
    
  render: h => h(App),
	store
}).$mount('#app')

根组件APP.vue:

<template>
  <div id="app">
    <a-input placeholder="请输入任务" class="my_ipt" />
    <a-button type="primary">添加事项</a-button>

    <a-list bordered :dataSource="list" class="dt_list">
      <a-list-item slot="renderItem" slot-scope="item">
        <!-- 复选框 -->
        <a-checkbox>{
   
   {item.info}}</a-checkbox>
        <!-- 删除链接 -->
        <a slot="actions">删除</a>
      </a-list-item>

      <!-- footer区域 -->
      <div slot="footer" class="footer">
        <!-- 未完成的任务个数 -->
        <span>0条剩余</span>
        <!-- 操作按钮 -->
        <a-button-group>
          <a-button type="primary">全部</a-button>
          <a-button>未完成</a-button>
          <a-button>已完成</a-button>
        </a-button-group>
        <!-- 把已经完成的任务清空 -->
        <a>清除已完成</a>
      </div>
    </a-list>
  </div>
</template>

<script>
export default {
     
     
  name: 'app',
  data() {
     
     
    return {
     
     
      list: []
    }
  },
  created(){
     
     
	  this.$store.dispatch('getList')
  }
  
}
</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>

vuex文件:

import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
Vue.use(Vuex)

export default new Vuex.Store({
    
    
  state: {
    
    
  },
  mutations: {
    
    
  },
  actions: {
    
    
	  getList(context){
    
    
		 axios.get('/list.json').then(({
    
    data:res})=>{
    
    
			  console.log(res)
		 }) 
	  }
  },
  modules: {
    
    
  }
})

二,使用axios获取数据

第一步创建数据:
在这里插入图片描述
第二步:在store的Action创建函数,利用axios请求,获取json中的数据:
在这里插入图片描述
然后在组件中调用这个异步函数,发起请求,获取数据。
在这里插入图片描述
在这里插入图片描述

三,将取到的数据存储在store的state中,完成页面的渲染

在这里插入图片描述
也就是 异步操作,需要让Action中函数调用mutation中函数,才能完成对state中数据的操作。
这时候,state中已经存储了axios请求取得的数据。就可以在组件中进行调用,以及渲染了:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四,将输入框的内容添加到列表

第一步:先为添加按钮绑定事件
在这里插入图片描述
第二步:在本组件中定义函数,用来调用store的mutation中的函数:
在这里插入图片描述
第三步:在mutation中定义addItem函数:
在这里插入图片描述
从这里也可以体会到,vue的开发,是数据驱动的,我们添加了一个数组元素进list,页面就会多渲染出一个数据。而不是像之前操作DOM一样,需要创建一个新的节点。

五,删除对应的元素

第一步:给删除按钮绑定删除事件:
在这里插入图片描述
因为这里是作用域插槽。所以可以传入id值
第二步:在组件中定义函数,调用store中的mutation中的函数:
在这里插入图片描述
第三步:在mutation中定义这个函数,完成对list的删除元素操作
在这里插入图片描述

六,复选框的属性绑定

第一步:修改json文件,让我们有一两个是初始就选中的:
在这里插入图片描述
第二步:数据绑定到页面:
在这里插入图片描述
因为之前已经把store中的list映射成本组件的计算属性了,而且这里利用了作用域插槽,所以可以直接属性绑定:
在这里插入图片描述

七,点击复选框可以完成状态的切换

因为我们的数据是从json文件中读取出来的,但是暂时我们没办法修改json的文件内容,然而可以修改读取到的list数组中的数据。
也就是说,我们要做的事情是,点击复选框的时候,完成这个数组中对应对象的done属性的true和false切换。
第一步:为 复选框的状态变化绑定事件:
在这里插入图片描述

第二步:在本组件中定义函数,用以调用对应的mutattion内的函数
在这里插入图片描述
第三步:在mutation中定义这个函数,完成对list的操作

在这里插入图片描述

八,几条数据剩余的记录

在这里插入图片描述
要得到这个未选中的数据条数,最简单的方法就是使用filter方法,获取没选中的数据,组成新数组,然后测它的数组长度就可以了。
并且,这个数据的变动因为是复选框的状态值发生变化导致的,所以呢,这个部分的代码可以写在改变复选框的状态代码下,但是这样写的话,还要从stete中定义一个存储剩余条数的变量,然后再映射到组件,很麻烦。
鉴于是这个剩余数量是统计list的条数而获得的,所以,这里可以直接用getters,获取剩余条数,直接映射到组件中使用:
第一步:在store中创建getters:
在这里插入图片描述
第二步:映射到本组件
在这里插入图片描述
第三步:在本组件中直接使用
在这里插入图片描述

九,清除已完成的任务

点击清除已完成的任务时,会遍历list数组,然后从list中删除选中的
第一步:为清除已完成的任务绑定事件
在这里插入图片描述
第二步:定义事件,去调用mutation中的事件
在这里插入图片描述
第三步:在mutation中定义事件,完成对list的操作
在这里插入图片描述

十,点击tab,显示不同样式的实现

第一步:三个选项应该绑定同一个事件,各自传入不同flag
在这里插入图片描述

第二步:定义事件,调用mutation中的函数
在这里插入图片描述

第三步:定义state中对应的数据和mutation中的函数
在这里插入图片描述
第四步:将flag映射到组件
在这里插入图片描述
第五步:属性绑定,完成页面的渲染
在这里插入图片描述

十一,列表数据的切换

只要在点击的时候,同样是判断flag,看选中的是那个tab,然后在getters中把list处理一下,再映射到组件使用,而不是直接映射:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42349568/article/details/108886013
今日推荐