摘要:输入框内容过滤产品有一个需求是,在搜索用户信息时,只能通过邮箱搜索,并且只能输入字母数字以及。我选择了输入框的值这里的坑就是需要在中更新值,因为元素这时才刷新。是否有一定要用的必要类似的管理系统涉及到不同页面之间的交互都很少。
初始化项目
使用 Vue-cli3 初始化项目1
安装 Element UI
安装 Vue-i18n,做相关配置2,3
项目结构</>复制代码
原则上需要对 Element 也做 I18n 的处理,但是我觉得 Element 中已经有很完善的多语言翻译,而 Element 自身尚不支持 Vue-i18n 7+ 版本,要特殊处理,所以就算了,这里直接使用了 Element 自带的方法。
</>复制代码
.
|-- babel.config.js
|-- package.json
|-- public
| `-- index.html
|-- src
| |-- App.vue
| |-- assets
| | |-- override-element-ui.less // 覆盖 Element 默认样式
| | `-- image // 图片文件目录
| |-- components // 所有非 `` 中显示的页面的 Vue 组件
| | |-- mainMenu.vue // 左侧导航
| | |-- pureTitle.vue // 通用的 Title 组件,项目中有多个页面会用到
| | |-- search.vue // 通用的 Search 头部组件,同样会用到
| | `-- userCenter.vue // 字面意思用户中心,目前只需要显示用户名,handle 用户退出操作。可预见:下拉菜单操作、头像显示等...
| |-- main.js // Vue-cli 生成的项目基本文件
| |-- router.js // Vue-cli 生成,路由
| |-- store // Vuex相关
| | |-- index.js
| | |-- mutationTypes.js
| | `-- module // 这里按照路由划分了 module,不一定对
| | | |-- someModule.js
| | | `-- elseModule.js
| |-- utils
| | |-- i18n // 国际化支持
| | | |-- index.js
| | | `-- lang // 语言字符串文件
| | | |-- en.json
| | | `-- zh.json
| | |-- request // 处理所有 ajax 请求
| | | |-- index.js // 基于 axios,封装了需要用到的方法,例如 token 的处理
| | | |-- someComponentName.js // 基于组件分割的请求,在 Vuex action 中调用独立方法
| | | `-- elseComponentName.js
| | |-- timeHelper.js // 时间戳转换帮助函数
| | `-- userHelper.js // 保存用户信息帮助函数
| `-- views // ` 下内容显示组件`
| |-- Home.vue
| |-- Login.vue
| |-- MainPage.vue
| |-- Manage.vue
| `-- Verify.vue
|-- .env.development // 环境变量 process.env
|-- .env.production // 生产环境下的环境变量
`-- vue.config.js // 更改 Vue-cli 默认配置
Element
按需加载
先看一张项目初始状态下,全局引入 Element & 按需引入打包大小的对比:
How参考:按需引入
需要注意的地方是:
不用新建 .babelrc 文件,只需要更改 babel.config.js
使用 Vue-cli 初始化项目后, presets 中为 ["@vue/app"],不需要更改为 element 官网中的 es2015 。原因是 babel 的目前版本已经不推荐按照 JavaScript 版本来区分编译目标。(// todo:添加相关链接)
可用的 babel.config.js 文件如下:
</>复制代码
module.exports = {
presets: [
["@vue/app"],
],
plugins: [
[
"component",
{
"libraryName": "element-ui",
"styleLibraryName": "theme-chalk"
}
]
]
}
覆盖默认样式
正常情况下,可以通过直接修改对应 class 的内容修改。但含有 foo__bar 类似格式的样式不会应用 scoped(因为不是同一个 Vue 实例),因此修改不会生效。
可以通过在 *.vue 中不使用 scope 来解决这个问题,Element 在 Issue 中也吐槽过。虽然我不认为 scope 不是一个好的解决方案。
因此,我选择了在 main.js 中引入外部样式表,例如override-element-ui.less,在外部样式表中修改 foo__bar 类名的样式。
路由设计route.js 主要设计如下:
</>复制代码
routes: [
{
path: "/login",
name: "login",
component: Login
},
{
path: "/",
name: "home",
component: Home,
children: [
{
path: "/index",
component: mainPage
},
{
path: "/manage",
component: manage,
children: [
{
path: "user/:uumsid&:userid",
component: userDetail
},
{
path: "enterprise/:id",
component: insDetail
},
{
path: "/",
component: manageList
},
]
},
{
path: "/verify",
component: Verify,
},
{
path: "/verify/:id",
component: VerifyDetail
},
{
path: "*",
redirect: "/index"
},
]
},
]
555...不太想贴代码,感觉太乱、太长。
但不贴又说不清楚。
简单来说,项目只分为两个部分。登陆页和功能页。
根路由绑定到了登陆后的首页。
首页包含头部标题、左侧菜单还有显示内容的
因此,如果用户仅输入 location.host 访问网站,会被带到 ${host}/index 页面。另外,访问任意未被匹配的 path,都会重定向到 index 页面。
这个时候会出现两个分支:
判断本地是否存在用户信息是否存在 ? 进行正常操作 :重定向到登录页
如何保存用户信息和登陆状态整个系统只需要分成需要登录和不需登陆两个部分。
当前所开发的系统除登录页外,都需要登录后访问。
这个部分和路由设计强相关。何时判断用户是否登录在上一部分已经解释过。
使用 localstorage 来持久化保存用户信息,处理用户刷新页面以及一段时间内关闭浏览器后不用重新登录的需求。(一段时间为30min)
在 Home.vue 的 created() 钩子中做如下操作:
</>复制代码
created() {
let userInfo = getUserFromLocal("userinfo")
let verifiedUserInfo = (info) => {
let now = new Date().getTime()
const PASS_TIME = 1000 * 60 * 30 // 30min
if (!info) return false
if (now - info.time < PASS_TIME) return true
return false
}
if (!!verifiedUserInfo(userInfo)) {
this.onRefresh(userInfo)
} else {
this.$router.push({path: "/login"})
}
}
其中,getUserFromLocal 是在 userHelper.js 中写的从 localstorage 中获取数据的方法。通过判断用户信息是否存在以及是否过期来决定是跳转到登录页还是直接使用当前已有的用户信息。
// 我不觉得这是一个很完美的方案,但根据我搜索的资料来看,确实没有详细说过这方面内容的文章。所以,期待能看到更好的方案。
如何优雅的触发表单验证Element 的表单验证方法
但没有给出 async-validator 支持的表单验证触发方式。
经过查找,支持的触发方式有: submit, blur, input
我选择的方案是在规则中使用 submit 时验证(指表单提交时触发,因此实际情况中永远不会触发,但能满足需求,即手动触发验证。)
同时,在点击登录或者发送请求按钮时,调用 this.$refs.[formEl].validate((boolean) => { // callback})
清除表单验证结果:
当表单项很多时,也可以在
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/98131.html
摘要:利用中间件实现异步请求,实现两个用户角色实时通信。目前还未深入了解的一些概念。往后会写更多的前后台联通的项目。删除分组会连同组内的所有图片一起删除。算是对自己上次用写后台的一个强化,项目文章在这里。后来一直没动,前些日子才把后续的完善。 欢迎访问我的个人网站:http://www.neroht.com/ 刚学vue和react时,利用业余时间写的关于这两个框架的训练,都相对简单,有的...
摘要:用来主要前台的请求,并处理返回相关的数据,做后台服务。总结做完这个项目,其中的过程还是挺艰辛的,毕竟都是边学边做,不过最后能完成还是挺开心的,终于有了一个从到的项目过程。虽然只是一个小小的练手项目,不过对于目前的我,感觉还是不错的。 showImg(https://oc1gyfe6q.qnssl.com/17-3-30/43434844-file_1490879850754_14751...
摘要:用来主要前台的请求,并处理返回相关的数据,做后台服务。总结做完这个项目,其中的过程还是挺艰辛的,毕竟都是边学边做,不过最后能完成还是挺开心的,终于有了一个从到的项目过程。虽然只是一个小小的练手项目,不过对于目前的我,感觉还是不错的。 showImg(https://oc1gyfe6q.qnssl.com/17-3-30/43434844-file_1490879850754_14751...
摘要:用来主要前台的请求,并处理返回相关的数据,做后台服务。总结做完这个项目,其中的过程还是挺艰辛的,毕竟都是边学边做,不过最后能完成还是挺开心的,终于有了一个从到的项目过程。虽然只是一个小小的练手项目,不过对于目前的我,感觉还是不错的。 showImg(https://oc1gyfe6q.qnssl.com/17-3-30/43434844-file_1490879850754_14751...
阅读 3826·2021-10-11 10:58
阅读 2123·2021-09-24 09:47
阅读 586·2019-08-30 14:19
阅读 1887·2019-08-30 13:58
阅读 1524·2019-08-29 15:26
阅读 702·2019-08-26 13:45
阅读 2221·2019-08-26 11:53
阅读 1846·2019-08-26 11:30