vue之状态管理器 store.js index.vue

import axios from '@/utils/request'
export default {
  state: {
    bannerlist: [],
    prolist: []
  },
  getters: {},
  actions: {
    getBannerlist (context) {
      axios.get('/banner').then(res => {
        context.commit({
          type: 'changeBannerlist',
          data: res.data.data
        })
      })
    },
    getProlist ({ commit }) {
      axios.get('/pro').then(res => {
        commit({
          type: 'changeProlist',
          data: res.data.data
        })
      })
    },
    loadMoreProlist (context, params) {
      console.log(context)
      return new Promise((resolve, reject) => {  //如果触发了action之后还需要在组件中继续做操作 就要用promise
        axios.get('/pro?limitNum=10&pageCode=' + params.pageCode).then(res => {
          console.log(res.data.data)
          if (res.data.data.length === 0) {
            resolve(0)
          } else {
            context.commit({
              type: 'changeProlist',
              data: [...context.state.prolist, ...res.data.data]
            })
            resolve(1)
          }
        })
      })
    },
    pullrefresh (context) {
      return new Promise(resolve => {
        axios.get('/pro').then(res => {
          context.commit({
            type: 'changeProlist',
            data: res.data.data
          })
          resolve()
        })
      })
    }
  },
  mutations: {
    changeBannerlist (state, data) {
      state.bannerlist = data.data
    },
    changeProlist (state, data) {
      state.prolist = data.data
    }
  }
}
import axios from '@/utils/request'
export default {
  state: { // 首页需要的初始化数据
    bannerlist: [],
    prolist: []
  },
  getters: { // state的计算属性a
  },
  actions: { // 当前页面需要的异步操作
    getBannerlist (context) { // 请求轮播图数据,context上下文对象
      axios.get('/banner').then(res => {
        context.commit({ // 唯一改变状态管理器的方式就是显示的提交mutation
          type: 'changeBannerlist',
          data: res.data.data
        })
      })
    },
    getProlist ({ commit }) { // 参数解构
      axios.get('/pro').then(res => {
        commit({
          type: 'changeProlist',
          data: res.data.data
        })
      })
    }
  },
  mutations: {
    changeBannerlist (state, data) {
      state.bannerlist = data.data
    },
    changeProlist (state, data) {
      state.prolist = data.data
    }
  }
}

index.vue

<template>
  <div class="box">
    <header class="header">
      <router-link to="/search">搜索</router-link>
    </header>
    <div class="content" id="content">
      <van-pull-refresh v-model="isLoading" @refresh="onRefresh">
        <!-- 轮播图 -->
        <van-swipe :autoplay="4000" indicator-color="white">
          <van-swipe-item v-for="item of bannerlist" :key="item.bannerid">
            <img :src="item.img" alt="">
          </van-swipe-item>
        </van-swipe>
        <!-- 使用组件 -->
        <van-list
          v-if="flag"
          v-model="loading"
          :finished="finished"
          finished-text="没有更多了"
          @load="onLoad"
        >
          <Prolist :prolist="prolist"/>
        </van-list>
        <div v-else>
          登陆之后才能看到更多的信息
          <router-link to="/login">登陆</router-link>
        </div>
      </van-pull-refresh>
      <span @click="backtop" v-show="topflag" class="backtop iconfont icon-fanhuidingbu"></span>
    </div>
  </div>
</template>

<script>
import axios from '@/utils/request'
import { mapState } from 'vuex' // 解构赋值引入方法
import Vue from 'vue'
import { Swipe, SwipeItem, List, PullRefresh } from 'vant'
// 引入列表的组件  ---- es6中的模块化
import Prolist from '@/components/Prolist.vue'
Vue.use(Swipe).use(SwipeItem)
Vue.use(List)
Vue.use(PullRefresh)
export default {
  // 注册组件
  components: {
    // Prolist: Prolist
    Prolist
  },
  data () {
    return {
      bannerlist: [],
      prolist: [],
      flag: false,
      loading: false, // 表示当前是不是正在加载,如果为真,表示可以请求数据,请求成功置为false
      finished: false, // 为true表示所有数据都已加载完毕
      pageCode: 1,
      isLoading: false, // 在不在刷新,如果为真,可以请求数据,请求完毕设置为false
      topflag: false // 默认不显示返回顶部图标
    }
  },
  created () {
    axios.get('/banner').then(res => {
      console.log(res.data)
      this.bannerlist = res.data.data
    })
    axios.get('/pro').then(res => {
      console.log(res.data)
      if (res.data.code === '10119') {
        this.flag = false
      } else {
        this.flag = true
        this.prolist = res.data.data
      }
    })
  },
  watch: {
    pageCode (newval, oldval) {
      if (newval > 2) {
        this.topflag = true
      } else {
        this.topflag = false
      }
    }
  },
  methods: {
    onLoad () { // 页面触底 触发该函数,可以加载下一页的数据
      this.loading = true // 开始加载数据
      axios.get('/pro?limitNum=10&pageCode=' + this.pageCode).then(res => {
        console.log(res.data)
        this.loading = false // 表示加载结束
        this.pageCode++ // 加载结束 页码加1
        if (res.data.code === '10119') { // 未登录
          this.flag = false
        } else { // 可以拿到数据
          this.flag = true
          // 判断有没有数据,如果没有数据,告诉没有数据了,如果有数据,拼接数据
          if (res.data.data.length === 0) {
            this.finished = true // 表示数据已经加载完毕
          } else {
            // 拼接数据 ----- 数组的合并
            // arr.concat(arr1)
            // [...arr, ...arr1]  es6中的合并数组
            this.prolist = [...this.prolist, ...res.data.data]
          }
        }
      })
    },
    onRefresh () { // 下拉触发此函数
      this.isLoading = true // 表示可以请求第一页(默认)的数据
      axios.get('/pro').then(res => {
        console.log(res.data)
        this.isLoading = false // 表示下拉刷新请求函数结束
        if (res.data.code === '10119') {
          this.flag = false
        } else {
          this.flag = true
          this.finished = false // 表示还可以继续上拉加载
          this.pageCode = 1 // 下拉刷新即加载第一页数据,刷新之后重置页码
          this.prolist = res.data.data // 下拉刷新就是直接替换列表
        }
      })
    },
    backtop () {
      document.getElementById('content').scrollTop = 0
      this.topflag = false
    }
  }
}
</script>

<style lang="scss">
.van-swipe {
  // height: 180px;
  img {
    width: 100%;
  }
}
.backtop {
  position: fixed;
  bottom: 60px;
  right: 10px;
  font-size: 30px;
}
</style>