Vue-Router + Vuex 实现单页面应用

效果查看(一个食品安全网,大家也可以发布一些食品安全的见闻,尽举手之劳):

 

源代码:https://pan.baidu.com/s/1i43H3LV

如果想要服务器端代码可以在评论里说明一下

 

利用vue路由和vuex实现了一个单页面应用,项目结构如下:

入口:main.js

import './global.css';
// 引用 vue 没什么要说的
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import qs from 'qs'
Vue.prototype.$qs = qs
// 引用路由
import VueRouter from 'vue-router'
// 光引用不成,还得使用
Vue.use(VueRouter)
// 入口文件为 src/App.vue 文件 所以要引用
import App from './App.vue'
// 引用路由配置文件
import routes from './routes'
//引入data
import data from './data'
// 使用配置文件规则
const router = new VueRouter({
  routes
})
const store = new Vuex.Store({
  modules:data
});
// 跑起来吧
/* eslint-disable no-new */
new Vue({
  el: '#app',
  store,
  router: router,
  render: (createElement) => createElement(App)
})

app.vue:

<template>
  <div class="main">
    <div class="panel">
        <router-view>
        </router-view>
    </div>
    <div class="control">
      <div @click="toHome" class="item homeItem" :class="[selectMenu]">
        <div class="item-logo">
          <i class="iconfont icon-home vetically homeItem"></i>
        </div>
        <div class="item-text">
          <a class="homeItem">home</a>
        </div>
      </div>
      <div @click="toReport" class="item reportItem" :class="[selectMenu]">
        <div class="item-logo">
          <i class="iconfont icon-fabu vetically reportItem"></i>
        </div>
        <div class="item-text">
          <a class="reportItem">report</a>
        </div>
      </div>
    </div>
  </div>
</template>
toHome:function(){
      this.$store.commit('main/setSelectMenu',{menu:"home"})
      this.$router.replace("home");//之所以使用replace是不希望后退后回到之前的界面
    },
    toReport:function(){
      this.$store.commit('main/setSelectMenu',{menu:"report"})
      this.$router.replace("report");//之所以使用replace是不希望后退后回到之前的界面
    }

我们把所有的数据和数据的处理全部放在Vuex里面,也就是我们的data.js:

const main = {
  namespaced: true,
  state:{
    selectMenu:"home"
  },
  mutations:{
    setSelectMenu(state,obj){
      state.selectMenu = obj.menu;
    }
  }
}
const home = {
  namespaced: true,
  state:{
    type:"icon-new",
    data:[],
    pageIndex:1,
    scrollMaxValue:0,
    scrollPosition:0,
    isView:false,
    loading:false
  },
  mutations:{
    setSelectType(state,obj){
      state.type = obj.type;
    },
    setIsView(state,obj){
      state.isView = obj.value;
    },
    setScrollPosition(state,obj){
      state.scrollPosition = obj.value;
    },
    setScrollMaxValue(state,obj){
      state.scrollMaxValue = obj.value;
    },
    setPageIndex(state,obj){
      state.pageIndex = obj.value;
    },
    addPageIndex(state,obj){
      state.pageIndex = state.pageIndex + 1;
    },
    addData(state,obj){
      state.data = state.data.concat(obj.value);
    },
    clearData(state,obj){
      state.data = [];
    },
    setLoading(state,obj){
      state.loading = obj.value;
    }
  }
}
const report = {
  namespaced: true,
  state:{
    reportContent:"",
    imgList:[]
  },
  mutations:{
    setReportContent(state,obj){
      state.reportContent = obj.value;
    },
    clearImgList:function(state,obj){
      state.imgList = [];
    },
    addImgList:function(state,obj){
      var dic = {
        date:obj.date,
        data:obj.data
      }
      state.imgList.push(dic);
    },
    delImgList:function(state,obj){
      let len = state.imgList.length,
          item = null;
      for(let i = 0; i < len; i++){
        item = state.imgList[i];
        if(!!obj && !!item && item.date == obj.date){
          state.imgList.splice(i,1);
        }
      }
    }
  }
}
const details = {
  namespaced: true,
  state:{
    detailsText:"",
    imgList:[]
  },
  mutations:{
    setDetailsText(state,obj){
      state.detailsText = obj.value;
    },
    setImgList(state,obj){
      state.imgList = obj.value;
    },
    changeImgList:function(state,obj){
      let imgData = state.imgList;
      imgData[obj.index] = obj.value;
      state.imgList = imgData;
    }
  }
}
let result = {
  main:main,
  home: home,
  details:details,
  report: report
}
export default result;

路由:routes.js:

var home = () => import('./vue/home.vue')//这样做的目的是异步加载组件
var report = () => import('./vue/report.vue')
var details = () => import('./vue/details.vue')


// import home from './vue/home.vue'
// import blog from './vue/blog.vue'
// import about from './vue/about.vue'
// import topic from './vue/topic.vue'
// 配置路由
export default [
  {
    mode: 'history',
    path: '/home',
    name:'home',
    component: home
  },
  {
    mode: 'history',
    path: '/details',
    name:'details',
    component: details
  },
  {
    mode: 'history',
    path: '/report',
    name:'report',
    component: report
  }
]

  

 

转载于:https://www.cnblogs.com/mrzhu/p/8119481.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
易购商城是一个基于Vue框架开发的前端毕设项目。在该项目中,我使用了VueVuexVue Router、Element UI、Axios等技术和库来实现各种功能。 首先,Vue是一种流行的前端框架,它具有响应式的数据绑定和组件化的特性,使得开发者可以轻松构建交互性强、高效的单页面应用。 其次,我使用了Vuex来管理应用的状态。Vuex提供了一种集中式的状态管理方案,帮助我管理和共享全局的数据,使得不同组件之间的通信更加便捷。 Vue RouterVue官方提供的路由管理库,用于实现页面之间的导航和路由跳转。我使用它来定义和管理不同页面之间的跳转逻辑,使得用户可以通过URL来访问和导航各个页面。 Element UI是一套基于Vue的桌面端组件库,它提供了丰富的UI组件和样式,使得我可以快速构建出美观和功能完善的界面。 为了与后端进行数据交互,我使用了Axios库。Axios是一个基于Promise的HTTP客户端,可以在前端与后端进行异步数据交互,使得用户可以实现登录、注册、添加购物车、结算等功能。 最后,我还使用了Vue插件vue-echarts和vue-awesome-swiper来实现商品数据的可视化展示和轮播图功能。这些插件都提供了强大且易用的功能,使得易购商城的用户界面更加丰富和吸引人。 总体来说,通过使用VueVuexVue Router、Element UI、Axios等技术和库,我成功地实现了易购商城的前端开发工作,提供了丰富的功能和良好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值