前台搭建遇到问题

----前台访问量大 未采用vue 单页面SAP 的方式构建 使用多HTML构建页面

项目构建

  1. vue 2.6 https://cn.vuejs.org/
  2. elementUI https://element.eleme.cn/#/zh-CN
  3. animate.css https://animate.style/
  4. vue-lazyload https://www.npmjs.com/package/vue-lazyload
  5. axios http://www.axios-js.com/zh-cn/docs/
  6. iconfont https://www.iconfont.cn/
  1. <!-- 引入iconfont icon字体 -->
  2. <link rel="stylesheet" type="text/css" href="../../public/css/icon-font.css">
  3. <!-- 引入elementUI样式 -->
  4. <link rel="stylesheet" type="text/css" href="../../public/elementUI/elementUI.css">
  5. <!-- Vue开发环境版本,包含了有帮助的命令行警告 -->
  6. <script src="../../public/js/vue.js"></script>
  7. <!-- animate 动画 -->
  8. <link rel="stylesheet" type="text/css" href="../../public/css/animate.min.css">
  9. <!-- vue 图片懒加载 -->
  10. <script src="../../public/js/vue-lazyload.js"></script>
  11. <!-- 引入elementUI组件库 -->
  12. <script src="../../public/elementUI/elementUI.js"></script>
  13. <!-- 引入axios -->
  14. <script src="../../public/js/axios.min.js"></script>

V-lazyload 配置

  1. Vue.use(VueLazyload, {
  2. preLoad: 1.3,//图片占比
  3. error: '../../public/img/error.png', //图片加载错误时显示图片
  4. loading: '../../public/img/loading.png',//图片加载中的图片
  5. attempt: 1 //加载失败重试次数
  6. })
  7. /*
  8. 其他属性
  9. preLoad:类型Number,默认1.3. 表示lazyload的元素距离页面底部距离的百分比.计算值为(preload - 1).
  10. attempt:图片加载失败后的重试次数.默认为3.
  11. error:类型string.图片加载失败后的显示的失败图片路径.
  12. loading:类型string.图片正在加载中显示的loading图片的路径.
  13. listenEvents:类型array.默认['scroll', 'wheel', 'mousewheel', 'resize', 'animationend', 'transitionend', 'touchmove'].即是在监听上述事件中,判断图片是否在preload的位置.如果你不想在那么多事件中判断,可以指定一个或者几个.例如如果你给这个属性只指定['touchmove'].那么scroll 屏幕不会加载图片,只有手指滑动屏幕才会加载图片.
  14. adapter:注册img 的loading,loaded,error三个状态的回调函数,参数会暴露懒加载的img元素,可以对其进行操作.
  15. filter: img未加载之前,解析到src 的时候注册的回调函数.可以在加载图片之前,对src进行修改.注册在filter下的所有的函数都会执行
  16. */

v-lazyload使用

  1. <!---将 img 标签的:src 属性直接改为v-lazy, :key是为了防止刷新页面或图片更改时图片不更新-->
  2. <img v-lazy="proImg" :key="imgKey">

问题

引入elementUI 后 elementUI 提供的 icon 无法加载

需要单独引入elementUI的字体文件 element-icons.ttfelement-icons.woff

https://unpkg.com/browse/element-ui@2.15.0/lib/theme-chalk/fonts/

animate最新版 动画无效问题

最新版类名进行了修改 需要给每个类名添加animate__前缀

  1. <link href="https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel="stylesheet" type="text/css">
  2. <div >
  3. <button @click="show = !show">
  4. Toggle render
  5. </button>
  6. <transition
  7. name="custom-classes-transition"
  8. enter-active-class="animate__animated animate__tada"
  9. leave-active-class="animate__animated animate__bounceOutRight"
  10. >
  11. <p v-if="show">hello</p>
  12. </transition>
  13. </div>

Axios 异步与同步问题

一些页面初始化数据需要先请求服务接口 后渲染到页面上 由于axios 的then() 与catch()方法都是异步的 所以当数据响应完毕页面已经加载完毕 数据无法渲染都网页上所以需要将axios改为同步请求让页面等待请求响应完毕再渲染页面

异步GET请求

  1. // 为给定 ID 的 user 创建请求
  2. axios.get('url')
  3. .then(function (response) {
  4. console.log(response);
  5. })
  6. .catch(function (error) {
  7. console.log(error);
  8. });

异步POST请求

  1. axios.post('url', {
  2. params1: 'value',
  3. params1: 'value'
  4. })
  5. .then(function (response) {
  6. console.log(response);
  7. })
  8. .catch(function (error) {
  9. console.log(error);
  10. });

ES7的异步特性async / await

async用于申明一个函数是异步的,await等待异步请求完成,await只能在async方法中使用

  1. let fun1 = async function(){
  2. await axios.get(url,params);
  3. ...
  4. }

例如一个获取全国行政区划的接口

https://huangshen.oss-cn-beijing.aliyuncs.com/miao-shop/json/CityList.json

  1. //获取地址信息
  2. async getCityList() {
  3. this.cityList = await axios.get(
  4. 'https://huangshen.oss-cn-beijing.aliyuncs.com/miao-shop/json/CityList.json')
  5. .then(function (response) {
  6. return response.data
  7. })
  8. .catch(function (error) {
  9. console.log(error);
  10. });
  11. },

this.cityList会等待get请求的响应 后赋值 整个等待过程页面也在等待 会出现卡一下的现象

el-scrollbar 组件滚动底部

el-scrollbar 是elementUI 的一个组件 但在官方文档中没有介绍 这是一个滚动面板组件 在做聊天窗口是很方便

使用时要首先在全局css中设置

  1. body .el-scrollbar__wrap {
  2. overflow-x: hidden; /*隐藏X轴滚动条*/
  3. overflow-y: hidden; /*隐藏Y轴滚动条*/
  4. }

默认都是在滚动面板的顶部 聊天窗口一般都是至于底部置底方法

  1. //聊天窗口滚动条置底
  2. scrollDown(){
  3. this.$refs.myScrollbar.wrap.scrollTop=this.$refs.myScrollbar.wrap.scrollHeight
  4. }

注意1 这个方法必须在页面加载完毕数据更新时调用 使用vue 的updated()钩子函数

  1. updated(){
  2. this.scrollDown();
  3. }

注意2

  1. el-scrollbar的父层要有固定高度

  2. el-scrollbar的高度要设成100%

  3. 如果出现横滚动条,添加overflow-x:hidden;

scrollbar 介绍

scrollbar组件暴露了 native, wrapStyle, wrapClass, viewClass, viewStyle, noresize, tag 这7个 props属性

  1. props: {
  2. native: Boolean, // 是否使用本地,设为true则不会启用element-ui自定义的滚动条
  3. wrapStyle: {}, // 包裹层自定义样式
  4. wrapClass: {}, // 包裹层自定义样式类
  5. viewClass: {}, // 可滚动部分自定义样式类
  6. viewStyle: {}, // 可滚动部分自定义样式
  7. noresize: Boolean, // 如果 container 尺寸不会发生变化,最好设置它可以优化性能
  8. tag: { // 生成的标签类型,默认使用 `div`标签包裹
  9. type: String,
  10. default: 'div'
  11. }
  12. }

页面之间信息共享

网站公共信息全部存储于 sessionStorage,localStorage

操作sessionStorage,localStorage的方法

  1. sessionStorage.getItem('key')
  2. sessionStorage.setItem('key','value')
  3. localStorage.getItem('key')
  4. localStorage.setItem("key","value")

sessionStorage仅在当前会话下有效,关闭页面或浏览器后被清除。存放数据大小为一般为5MB,而且它仅在客户端(即浏览器)中保存。

localStorage生命周期是永久,这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在。存放数据大小为一般为5MB,而且它仅在客户端(即浏览器)中保存。

页面间跳转 与 刷新

HTML 跳转

在HTML页中,可以使用meta标签进入页面的跳转,此方法可以控制跳转的时间,以及自由化的定义跳转的网址

  1. <meta http-equiv="refresh" content="5;url=https://www.baidu.com">

meta 标签中有一个content属性,表示打开此页面后,多少秒后开启跳转。还有个URL属性,表示跳转的网址

HTML中A标签跳转

HTML中的A标签也可以看做为页面跳转的一种,只是通过鼠标点击的方式进入跳转

  1. <a href="http://www.baidu.com">跳转到百度</a>

javascript代码跳转

在网页利用js也可以实现页面的跳转或定时跳转

  1. window.location.href = 'https://www.baidu.com/';
  2. // 五秒以后再跳转
  3. setTimeout("javascript:location.href='https://www.baidu.com'", 5000);
  4. //在新的窗口打开页面
  5. var tempwindow=window.open('_blank');
  6. tempwindow.location='../search/search.html;

页面刷新

  1. window.location.reload();

页面跳转传参

要在跳转路径中传递参数 可以使用“?”传参

  1. window.location.href='../index/index.html?wd1=value&wd2=value';
  • 传参时出现中文乱码问题
  1. js中通过window.location.href方式跳转页面并在路径上传递参数中文乱码解决
  2. js中对中文进行编码:(不对ASCII 字母和数字进行编码)
  3. window.location.href = aaa.html?Unit=’+encodeURI(encodeURI(中文内容))
  4. //有时需要两次编码
  5. window.location.href = aaa.html?Unit=’+encodeURI(中文内容)
  6. //有时只需要编码一次即可(具体原因没有细究)
  7. 在接收页面接收的时候再解码回来即可
  8. decodeURI(window.location.href)

接收参数

参数传递时使用? = & 作为分隔符去的时候使用字符串操作取出

  1. //原始页
  2. var tempwindow=window.open('_blank'); tempwindow.location='../search/search.html?'+encodeURI('wd=零食');
  3. //跳转页
  4. //解码url
  5. const params= decodeURI(window.location.href).split("?")[1].split("&");
  6. //params ="wd=零食"

页面title 设置

使用js设置网页title

  1. document.title='与零食有关的商品'

检测登录的方法

判断是否登录的依据是检查sessionStorage,localStorage 是否存储有用户信息

每次在页面加载之前 进行检测

在vue 中使用vue的生命周期钩子函数 进行检测

  1. created() {
  2. },
  3. mounted() {
  4. },

如果是一些必须要登录才可以访问的页面 检测到未登录后 将页面跳转到登录页

  1. created() {
  2. const userInfo = sessionStorage.getItem("userInfo")
  3. if (null === userInfo) {
  4. this.isLogin = false
  5. window.location.href = '../index/index.html';
  6. } else {
  7. this.isLogin = true
  8. }
  9. }

vue 生命周期

JSON对象 与JSON字符串之间的转换

  1. //JSON 对象
  2. const message=[
  3. {
  4. id:1,
  5. context:'这是测试'
  6. },
  7. {
  8. id:2,
  9. context:'这也是测试'
  10. }
  11. ]
  12. //JSON 字符串
  13. [{"id":1,"context":"这是测试"},{"id":2,"context":"这也是测试"}]

有时需要对json对象进行存储 例如向sessionStorage,localStorage 存储 如果将JSON对象存入 则会显示 [object Object],[object Object] 这是无法使用的,需要将对象转为String 字符串后进行存储

JSON字符串转换为JSON对象

  1. 1. const obj = eval('(' + str + ')');
  2. 2. const obj = str.parseJSON();
  3. 3. const obj = JSON.parse(str);

将JSON对象转化为JSON字符串

  1. 1. let str=obj.toJSONString();
  2. 2. let str=JSON.stringify(obj);

JavaScript eval() 函数

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。因此请不要为 eval() 函数传递 String 对象来作为参数。

Cookies

上面页面信息共享已经使用了sessionStorage,localStorage但是经过使用发现这两个存储方式 若是页面跳转打开的新页面数据是可以共享的,若重新打开新的标签页则无法做到数据共享。那么就要使用cookies

当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息。

Cookie 的作用就是用于解决 "如何记录客户端的用户信息":

Cookie 以名/值对形式存储,如下所示:

  1. username=Huang Shen

创建Cookie

创建cookie

  1. document.cookie="username=huangshen";

添加过期时间 到Sun, 24 Jan 2021 06:14:05 GMT 时过期自动删除

  1. document.cookie="username=huangshen; expires=Sun, 24 Jan 2021 06:14:05 GMT";

可以使用 path 参数告诉浏览器 cookie 的路径。默认情况下,cookie 属于当前页面。

  1. document.cookie="username=huangshen; expires=Sun, 24 Jan 2021 06:14:05 GMT; path=/";

读取 Cookie

  1. const cookie = document.cookie;

document.cookie 将以字符串的方式返回当前域名下所有的 cookie,类型格式: username=huangshen; username=huangshen1;username2=huangshen2

修改 Cookie

修改 cookie 类似于创建 cookie,旧的 cookie 将被覆盖。

  1. document.cookie="username=huangshen1; expires=Sun, 24 Jan 2021 06:14:05 GMT; path=/";

删除 Cookie

只需要将cookie过期时间 设置 expires 参数为以前的时间 注意 ,删除时不必指定 cookie 的值

  1. document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 GMT";

Cookie 封装


  1. //设置cookie
  2. function setCookie(name, value, time) {
  3. var strsec = getsec(time);
  4. var exp = new Date();
  5. exp.setTime(exp.getTime() + strsec * 1);
  6. document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
  7. }
  8. //这是有设定过期时间的使用示例:
  9. //s20是代表20秒
  10. //h是指小时,如12小时则是:h12
  11. //d是天数,30天则:d30
  12. function getsec(str) {
  13. alert(str);
  14. var str1 = str.substring(1, str.length) * 1;
  15. var str2 = str.substring(0, 1);
  16. if (str2 == "s") {
  17. return str1 * 1000;
  18. } else if (str2 == "h") {
  19. return str1 * 60 * 60 * 1000;
  20. } else if (str2 == "d") {
  21. return str1 * 24 * 60 * 60 * 1000;
  22. }
  23. }
  24. //读取cookies
  25. function getCookie(name) {
  26. var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
  27. console.log(document.cookie);
  28. if (arr = document.cookie.match(reg))
  29. return unescape(arr[2]);
  30. else
  31. return null;
  32. }
  33. //删除cookies
  34. function delCookie(name) {
  35. var exp = new Date();
  36. exp.setTime(exp.getTime() - 1);
  37. var cval = getCookie(name);
  38. if (cval != null)
  39. document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
  40. }
  41. //使用示例
  42. setCookie("name", "hayden", "s20");
  43. getCookie("name");

前台使用Vue的更多相关文章

  1. 6.前台项目vue环境、创建、目录重构、CSS、JS配置

    目录 前台 vue环境 创建项目 重构项目目录 文件修订:目录中非配置文件的多余文件可以移除 App.vue router/index.js Home.vue 全局配置:全局样式.配置文件 globa ...

  2. 前台框架vue.js中怎样嵌入 Echarts 组件?

    目前常用的图标插件有 charts,  Echarts, highcharts.这次将介绍 Echarts 在 Vue 项目中的应用. 一.安装插件 使用 cnpm 安装 Echarts cnpm i ...

  3. 我的音乐盒子(nodejs7 + koa2 + vue + vuex + vue-router)

    你们知道的,nodejs对jser来说,是个好东西,快快的,自从接触nodejs后,总想弄点东西. 这弄个啥了,一天打开百度音乐盒,哟,自己弄一个如何了,好啊好啊. 后台: nodejs 7 + ko ...

  4. nodejs+mongodb+vue前后台配置ueditor

    笔者在做一个个人博客项目的时候需要一个富文本框输入组件与后台进行交互,但是官方配置里面没有关于nodejs的,于是自己查阅资料研究了一下,最后终于应用到了系统中. 一.后台配置 首先是找到了这个项目: ...

  5. 手把手实现微信网页授权和微信支付,附源代码(VUE and thinkPHP)

    wechat github 手把手实现微信网页授权和微信支付,附源代码(VUE and thinkPHP) 概述 公众号开发是痛苦的,痛苦在好多问题开发者文档是没有提到的,是需要你猜的. 在开发过程中 ...

  6. Vue+Element UI 实现视频上传

    一.前言 项目中需要提供一个视频介绍,使用户能够快速.方便的了解如何使用产品以及注意事项. 前台使用Vue+Element UI中的el-upload组件实现视频上传及进度条展示,后台提供视频上传AP ...

  7. Vue框架下实现导入导出Excel、导出PDF

    项目需求:开发一套基于Vue框架的工程档案管理系统,用于工程项目资料的填写.编辑和归档,经调研需支持如下功能: Excel报表的导入.导出 PDF文件的导出 打印表格 经过技术选型,项目组一致决定通过 ...

  8. vue php实战项目开发(一)

    说在前面 项目开发过程中一直在学习,所以记录的过程可能比较乱,打算前台使用vue,后台使用php开发手机端的项目,这里记录遇到的问题和学习的过程 phpstudy环境下搭建虚拟域名,并开启URL重写 ...

  9. luffy项目:基于vue与drf前后台分离项目(2)

    user模块User表 创建user模块 前提:在 luffy 虚拟环境下 1.终端从项目根目录进入apps目录 >: cd luffyapi & cd apps 2.创建app > ...

随机推荐

  1. Promise解析(待完成)

    Promise是一种异步操作的解决方案,将写法复杂的传统的回调函数和监听事件的异步操作,用同步代码的形式表达出来.避免了多级异步操作的回调函数嵌套. 1.主要用于异步计算 2.可以将异步操作队列化,按 ...

  2. CRM系统全方位管理企业

    您在选择一款CRM系统的时候,首先要考虑销售团队的感受和意见.让CRM系统在帮助销售团队优化工作流程的同时,更好地对销售团队进行管理.销售人员每卖出一件商品,要从寻找筛选商机开始,经过沟通客户需求.满 ...

  3. 进程间IPC通信-stop waiting for thing to happen,go out and make them happen!!!

    进程间通信: System V IPC对象: ipcs -q:查看消息队列   ipcs -m:查看共享内存 ipcs -s:查看信号灯集 ipcrm -q:删除消息队列   ipcrm -m:删除共 ...

  4. ruby基础(三)

    类和模块 1.类 类是面向对象中一个重要的术语.我们可以把类看作是对象的抽象, 所有的这类对象都有这些特征.而对象则是类的具体实现,按照类的要求创建的 对象就是该类的对象.类就像对象的雏形一样,决定了 ...

  5. centos下查看网卡,主板,CPU,显卡,硬盘型号等硬件信息

    centos下查看网卡,主板,CPU,显卡,硬盘型号等硬件信息 rose_willow rose_willow 发布于 2016/06/16 11:32 字数 902 阅读 405 收藏 0 点赞 0 ...

  6. nginx 的三种虚拟主机配置方法

    nginx三种虚拟主机配置的方法. 基于端口 在生产环境中一般使用端口或者域名. [root@web01 /etc/nginx/conf.d]# cat web01.conf server { lis ...

  7. S11 Linux系统管理命令

    11.1 lsof:查看进程打开的文件 11.2 uptime:显示系统的运行时间及负载 11.3 free:查看系统内存信息 11.4 iftop:动态显示网络接口流量信息 11.5 vmstat: ...

  8. 使用nuget包下载Entity Framework6.0无法使用模型类与数据库上下文自动生成controller与view

    解决方法:卸载掉原有的6.0版本EF,从控制台安装5.0版本的. >工具>库程序包管理器>程序包管理器控制台.在PM>后面输入安装命令. 命令如下 Install-Packag ...

  9. lvresize 调整LVM逻辑卷的空间大小,可以增大空间和缩小空间

    lvresize 相关命令:lvreduce,lvextend,lvdisplay,lvcreate,lvremove,lvscan   lvresize指令:调整逻辑卷空间大小[语    法]lvr ...

  10. opencv——PCA(主要成分分析)数学原理推导

    引言: 最近一直在学习主成分分析(PCA),所以想把最近学的一点知识整理一下,如果有不对的还请大家帮忙指正,共同学习. 首先我们知道当数据维度太大时,我们通常需要进行降维处理,降维处理的方式有很多种, ...