Vue+Iview+Node 登录demo
1.相关组件安装 axios iview js-cookie crypto-js




2.子父组件传值、监听窗体大小改变、记住密码 、自定义组件(事件 、props)
created:实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。
mounted:el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内。
destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。
computed:计算属性,只在初始化时被调用。
methods: 里面是用来定义函数的,很显然,它需要手动调用才能执行。而不像watch和computed。
watch:类似于监听机制+事件机制
父组件:
<style lang="less">
@import "./login.less";
</style> <template>
<div class="login">
<div class="header Cblue">
<div class="wrapper clearfix">
<h1>VUE+IVIEW V1.0</h1>
<span class="QRspan">
<Icon type="logo-googleplus" size="24" />
<span>关注公众号</span>
<img class="QRimg" src="../../assets/images/qr.png" />
</span>
</div>
</div>
<div class="content" :style="{height: screenHeight}">
<div class="wrapper">
<img class="bg1" src="../../assets/images/bg1.png" />
<div class="loginBox">
<div class="logo">
<img src="../../assets/images/logo.png" />
</div>
<div class="formDiv">
<login-form @on-success-valid="handleSubmit" :username="localusername" :userpwd="localuserpwd"></login-form>
</div>
</div>
</div>
</div>
<div class="footer">
<div class="wrapper">
<span>Copyright © 2019-2020 Lin.Su</span>
</div>
</div>
</div>
</template> <script>
import LoginForm from '_c/login-form'
import { mapActions } from 'vuex'
export default {
components: {
LoginForm
},
data () {
return {
screenHeight: ''
}
},
methods: {
...mapActions(['handleLogin', 'svaeUserInfo']),
handleSubmit ({ userName, password, remember }) {
this.handleLogin({ userName, password }).then(res => {
const user = res.userinfo
user.pwd = password
if (res.code === 200) {
this.svaeUserInfo({ user, remember })
this.$router.push({
name: this.$config.homeName
})
} else {
this.$Message.error({
content: res.msg,
duration: 10
})
}
}).catch(err => {
if (err.message === 'NetWorkeError') {
this.$Message.error({
content: '接口服务异常',
duration: 10
})
}
})
},
getHeight () {
let windowHeight = document.documentElement.clientHeight
this.screenHeight = windowHeight - 102 - 138 + 'px'
}
},
created () {
window.addEventListener('resize', this.getHeight)
this.getHeight()
},
mounted () {
const that = this
window.onresize = () => {
that.getHeight()
}
},
computed: {
localusername () {
var userinfo = JSON.parse(this.$store.state.user.userinfo)
if (userinfo) {
return userinfo.username
}
return ''
},
localuserpwd () {
var userinfo = JSON.parse(this.$store.state.user.userinfo)
if (userinfo) {
return userinfo.pwd
}
return ''
}
},
watch: {
screenHeight (val) {
this.screenHeight = val
}
}
}
</script> <style>
</style>
子组件
<template>
<Form ref="loginForm" :model="form" :rules="rules" @keydown.enter.native="handleSubmit">
<FormItem prop="userName">
<Input v-model="form.userName" placeholder="请输入用户名">
<span slot="prepend">
<Icon :size="16" type="ios-person"></Icon>
</span>
</Input>
</FormItem>
<FormItem prop="password">
<Input type="password" v-model="form.password" placeholder="请输入密码">
<span slot="prepend">
<Icon :size="14" type="md-lock"></Icon>
</span>
</Input>
</FormItem>
<FormItem label="记住密码">
<i-switch v-model="form.remember" size="large">
<span slot="open">开</span>
<span slot="close">关</span>
</i-switch>
</FormItem>
<FormItem>
<Button @click="handleSubmit" type="primary" long>登录</Button>
</FormItem>
</Form>
</template>
<script>
export default {
name: 'LoginForm',
props: {
userNameRules: {
type: Array,
default: () => {
return [{ required: true, message: '账号不能为空', trigger: 'blur' }]
}
},
passwordRules: {
type: Array,
default: () => {
return [{ required: true, message: '密码不能为空', trigger: 'blur' }]
}
},
userpwd: {
type: String,
default: ''
},
username: {
type: String,
default: ''
}
},
data () {
return {
form: {
userName: this.username,
password: this.userpwd,
remember: false
}
}
},
computed: {
rules () {
return {
userName: this.userNameRules,
password: this.passwordRules
}
}
},
methods: {
handleSubmit () {
this.$refs.loginForm.validate(valid => {
if (valid) {
this.$emit('on-success-valid', {
userName: this.form.userName,
password: this.form.password,
remember: this.form.remember
})
}
})
}
}
}
</script>



3.效果展示


Vue+Iview+Node 登录demo的更多相关文章
- Vue+Iview+Node 搭建数据模拟接口
1.初始化node 项目 2.安装需要部件 3.编写简单代码 routers=>:index.js login.js users.js 根目录 index.js var express=re ...
- Vue+Iview+Node 项目结构和配置
1.项目调整后的目录 api:数据接口定义 assets:静态文件 components:组件 config:项目相关配置 driective:指令 router:路由 store:状态管 ...
- Vue+Iview+Node 安装环境 运行测试Vue
1.运行环境及设置 备注:建议设置 npm config set registry https://registry.npm.taobao.org 2.全局安装vue/cli 3.创建vue 项目 v ...
- 【vue】MongoDB+Nodejs+express+Vue后台管理项目Demo
¶项目分析 一个完整的网站服务架构,包括: 1.web frame ---这里应用express框架 2.web server ---这里应用nodejs 3.Database ---这里 ...
- thinkphp5+vue+iview商城 公众号+小程序更新版本
thinkphp5+vue+iview商城加分销 源码下载地址:http://github.crmeb.net/u/crmeb 演示站后台:http://demo25.crmeb.net 账号:dem ...
- .NET压缩图片保存 .NET CORE WebApi Post跨域提交 C# Debug和release判断用法 tofixed方法 四舍五入 (function($){})(jQuery); 使用VUE+iView+.Net Core上传图片
.NET压缩图片保存 需求: 需要将用户后买的图片批量下载打包压缩,并且分不同的文件夹(因:购买了多个用户的图片情况) 文章中用到了一个第三方的类库,Nuget下载 SharpZipLib 目前用 ...
- Xamarin.Android再体验之简单的登录Demo
一.前言 在空闲之余,学学新东西 二.服务端的代码编写与部署 这里采取的方式是MVC+EF返回Json数据,(本来是想用Nancy来实现的,想想电脑太卡就不开多个虚拟机了,用用IIS部署也好) 主要是 ...
- 易Android登录Demo
上一页介绍Android项目简单的页面跳转实例,算是对开发环境的熟悉,这一篇将在此基础上增加一些简单的逻辑,实现登录的效果. 登录之前: 登录成功: watermark/2/text/aHR0cDov ...
- socket应用(vue、node.js、M站)
socket应用(vue.node.js.M站) 前言:我们在做一些项目的时候需要做到实时变化, 比如我们有时候有需求会要求我们做一个类似于聊天室的页面 比如有些时候我们对某些东西进行点赞和刷票,需要 ...
随机推荐
- tty - 显示连接标准输入的终端的文件名
总览 (SYNOPSIS) tty [OPTION]... 描述 (DESCRIPTION) 显示 连接 标准输入 的 终端 的 文件名. -s, --silent, --quiet 什么 都 不显示 ...
- (一)环境搭建——Django
实验环境准备: 安装django # cmd中 pip install Django 第一个django项目HelloWorld # 在D:/Python test 下创建一个helloworld项目 ...
- 49. ArrayList LinkedList中特有的方法
集合的体系:--------------| Collection 单列集合的根接口 ----------| List 如果实现了List接口的集合类,该类具备的特点是:有序,可重复 ------|A ...
- Superset安装出错 sqlalchemy.exc.InvalidRequestError: Can't determine which FROM clause to join from, ...
$ superset db upgrade ... Traceback (most recent call last): File "/home/jhadmin/.pyenv/version ...
- grep命令 一 文本搜索工具
使用正则表达式搜索文本,并把匹配的行打印出来.使用权限是所有用户. 基本使用 grep [option] pattern filename: pattern如果是表达式或者超过两个单词的, 需要用引号 ...
- Delphi做异型窗体PNG透明
{*******************************************************}{ }{ 异形窗口 }{ }{ 2009.12.4 王 锐 }{ }{******** ...
- hdu多校第八场 1009 (hdu6665) Calabash and Landlord 计算几何/dfs
题意: 给定两个矩形,输出这两个矩形把平面分成了多少块. 题解: 本来是道计算几何的大讨论,被我生生写成了bfs. 离散化边,注意不重合的边中间要空出来一格,四周也要空出来一圈,然后暴力bfs计算一共 ...
- 剑指offer——35二叉树的后序遍历
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 题解: 这道题,一开始以为将后序遍历排序后的得 ...
- 火狐不支持webp格式的图片
<!DOCTYPE html> <html lang="en"> <style> ul{list-style: none;} li{float: ...
- 控制音量大小widget
由于手机音量按键非常悲剧的掉了.无法控制手机音量大小.使用起来非常不方便.所以决定写一个小widget放在桌面能够随时控制音量吧.也算是解决一点便利问题. 1.一个简单的widget 由于我的需求非常 ...