vue+elementUI+vue router+vuex综合demo

1.初始化工作
安装node.js
一路next
安装node.js会一并安装npm
验证方式,cmd观察版本号能否正常显示

node -v
npm -v

安装vue脚手架vue-cli

npm install vue-cli -g --registry=https://registry.npm.taobao.org

显示所有模板,正常显示则说明安装依赖成功,一般使用webpack模板

vue list

命令行 vue-cli的webpack模板,初始化工程
vue init webpack hello-vue-element3
全部回车,并选择no,因为要自己使用国内淘宝源加速,以及自己手动npm run dev

cd hello-vue-element3

安装依赖

npm install --registry=https://registry.npm.taobao.org

验证初始化的工程是否ok

npm run dev

访问localhost:8080

IDEA安装 Vue插件

导入IDEA
注意:如果IDEA的命令行不能使用npm run dev,使用管理员启动IDEA试试

删除脚手架工程中的Hello World Component相关代码

2.构建登录页面和主页面的路由,从登录页跳转到主页面。

手动安装路由,使用淘宝源

npm install vue-router --save-dev --registry=https://registry.npm.taobao.org

新建src/router/index.js集中配置所有路由

import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router);
export default new Router({
	routes: [
	   {
		  name: 'Login',
		  path: '/login',
		  component: Login
	   },
	   {
	     name: 'Main',
	     path: '/main',
	     component: Main
	   }
	]
})

新建src/views/Login.vue

main.js中使用router目录

import router from './router'
new Vue({
	router,
})

App.vue中使用router-link,router-view标签验证路由是否成功。
最后要删除两个标签,
因为要通过浏览器访问http://localhost:8080/#/login 以及 http://localhost:8080/#/main

<router-link to="/login">登录</router-link>
<router-link to="/main">主页</router-link>
<router-view />

引入elementUI

安装 element-ui

npm i element-ui -S --registry=https://registry.npm.taobao.org

安装 SASS 加载器,这个下载很慢,安装失败貌似也没影响

npm install sass-loader node-sass --save-dev --registry=https://registry.npm.taobao.org

main.js中引入js库和css库

import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
// 显式调用插件
Vue.use(ElementUI);

// 添加render
new Vue({
render: h => h(App),
})

结合ElementUI官网示例代码,带有验证的表单,填充Login.vue

注意一定要使用函数对象的方式来申明表单中的字段

  export default {
        name: "Login",
        data() {
          return {
            form: {
              username: '',
              password: ''
            }

          }
        }
    }

用methods申明表单提交方法:

methods: {
        onSubmit: function () {
          alert(this.form.username + '>>>' + this.form.password);
		  this.$router.push('/main');
        }
      }

// js实现从Login跳转到main
this.$router.push('main')

表单验证,有elementUI的html代码以及js校验逻辑

主页Main,参考elementUI的Container布局

新建src/views/user/List.vue 和Add.vue

在src/router/index.js配置Main的子路由

import Vue from 'vue'
import Router from 'vue-router'
import UserList from '@/views/user/List'
import UserAdd from '@/views/user/Add'

Vue.use(Router);
export default new Router({
	routes: [
	   {
		  name: 'Login',
		  path: '/login',
		  component: Login
	   },
	   {
	     name: 'Main',
	     path: '/main',
	     component: Main,
	     children: [
	       {name: 'UserList', path: '/user/list', component: UserList},
	       {name: 'UserAdd', path: '/user/add', component: UserAdd}
         ]
	   }
	]
})

Main中配置router-link, router-view

<router-link to="/user/list">用户列表</router-link>
<router-link to="/user/add">新增用户</router-link>
<router-view/>

使用vuex做状态管理

在项目根目录执行如下命令来安装 Vuex

npm install vuex --save --registry=https://registry.npm.taobao.org

修改 main.js 文件,导入 Vuex

import Vuex from 'vuex'
Vue.use(Vuex);

利用路由钩子 beforeEach 来判断用户是否登录,期间会用到 sessionStorage 存储功能。
在main.js捕获所有的路由事件,
根据isLogin标注位判断是否已经登录

router.beforeEach((to,from,next)=>{
  // debugger
  let isLogin = sessionStorage.getItem("isLogin");

  // next()表示放行,安装原先的跳转逻辑放行
  // next({path:"/xxx"}),表示自定义跳转逻辑
  // 一般来说,二者选其一
  if (to.path=="/logout")
  {
    sessionStorage.clear();
    next({path:"/login"})
  }
  else if(to.path=="/login")
  {
    if(isLogin=="true")
    {
      next({path:"/main"})
    }
    else
    {
      next()
    }
  }
  else if (isLogin==null)
  {
    next({path:"/login"})
  }
  else
   {
     next();
   }
  console.log("into beforeEach,from.path="+from.path+",to.path="+to.path+",next.path="+next.path);
})

新建 src/store/index.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
// 分别定义4个const
constant state = {
  user: {
    username: '',
  }
};
constant getters = {
  getUser(state) {
    return state.user;
  }
};
// mutations可以改变state的值,但是它是同步的,性能低
constant mutations = {
  updateUser(state, user) {
    state.user = user;
  }
};
// actions是异步的,性能高,一般通过actions调用mutations方法
constant actions = {
  asyncUpdateUser(context, user) {
    context.commit('updateUser', user);
  }
}
export default new Store({
	state,
	getters,
	mutations,
	actions
});

main.js中使用store

import store from './store'
new Vue({
el: '#app',
store,
});

在Login.vue中调用vuex,通过actions异步调用

this.$store.dispatch('asyncUpdateUser', this.form);

在Main.vue中读取已登录的用户名

{{this.$store.getters.getUser.username}}

解决vuex里的保存的用户名,F5后消失问题
在App.vue中,捕捉页面刷新事件

mounted() {
    window.addEventListener('unload', this.saveState);
  },

  methods: {
    saveState: function () {
      // 页面刷新unload事件,只能通过console.log,控制台一闪而过。alert是看不出效果的。
      // 刷新则存储state json串到sessionStorage
      sessionStorage.setItem("state", JSON.stringify(this.$store.state));

    }

修改store/index.js

const state = sessionStorage.getItem("state") != "undefined" ? JSON.parse(sessionStorage.getItem("state")) : {
  user: {
    username: ''
  }
};

Vuex.Store还支持模块化
新建src/store/user/user.js

const user = {
  state: {
	user: {
	  username: ''
	}
  },
  getters: {
    getUser(state, user) {
	  return state.user;
	}
  },
  mutations: {
    updateUser(state, user) {
	  state.user = user;
	}
  },
  actions: {
    asyncUpdateUser(context, user) {
		context.commit('updateUser', user);
	}
  }
  export default user;
}

修改store/index.js

import user from './modules/user'
export new Vuex.Store({
	modules: {
	  user,
	}
});

Login.vue,登录成功后,调用vuex

this.$store.dispatch('asyncUpdateUser', this.form);

Main.vue展示登录的用户名

{{this.$store.getters.getUser.username}}

App.vue捕获刷新事件,把vuex state存入sessionStorage

sessionStorage.setItem('state', JSON.stringify(this.$store.state.user));

src/store/user/user.js修改为

state = sessionStorage.getItem("state")!="undefined"?JSON.parse(sessionStorage.getItem("state")):{
  user: {
    username: ''
  }
}

小总结:
1.使用sessionStorage保存了是否登录的标志位isLogin true/false
2.使用vuex(state,getters,mutations,actions)保存,获取,同步修改,异步修改 当前登录的用户名
3.页面刷新vuex的state会重置,所以捕获unload事件,把当前用户名存入sessionStorage。
state优先从sessionStorage中读,如果有则JSON.parse。如果没有,则重新初始化

代码路径:

https://gitee.com/Orz6/Vue_practice/tree/master/src/hello-vue-element

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值