vue前端开发那些事——vue开发遇到的问题

  vue web开发并不是孤立的。它需要众多插件的配合以及其它js框架的支持。本篇想把vue web开发的一些问题,拿出来讨论下。

 1、web界面采用哪个UI框架?项目中引用了layui框架。引入框架的好处就是解决界面风格统一的问题,良好的布局(自适应不同的设备),提供了大量基础组件及模块,如form提交、上传、弹出层。我觉得前台框架的引入,解放了美工的一些工作。以前有bootstrap、现在有layui、element ui(基于vue 2.0)。

 <body>
    <div id="app"></div>
    <script src="/static/layui/layui.all.js" charset="utf-8"></script>
 </body>

我们以非模块化的方式加载。采用哪种方式加载,各有利弊。尽管官方推荐使用模块化加载,但是我觉得直接引用简单啊,用起来简单。当然,对于要求高性能的应用就另当别论了。项目中有弹出框的需要,于是用了layui的弹出层。一开始用的很happy,等测试的时候,在IE和火狐浏览器下,弹出框加载不出来页面。oh,my god。我们看看弹出组件:

export default {
   open: function (options) {

     var defaults = {
       type: 2,
       shade: 0,
       maxmin: false,
       area: ["30%", "63%"],
       title: ‘‘,
       content: ‘‘,
       btnAlign: ‘c‘, //按钮居中

       end: function () {
         if (options.end) {
           options.end();
         }
       }

     };

     var options = $.extend(true, {}, defaults, options);
     layer.open(options);
   }
 }

type:2表示弹出iframe,所以content是一个url。调用的时候,我给传的是vue router中配置的路径,此时url:‘/login’

 {
      name: ‘login‘,
      path: ‘/login‘,
      component: require(‘../indexs/login‘)
  }

所有的vue路由传给弹出层,在IE和火狐下都打不开,只有chrome下完美呈现。我就在网上找了好多解决方案,但是都以失败告终。弹出层的效果,我们还是很想要的,怎么办呢?换个思路。记得之前应用bootstrap的时候,它的弹出层的思路是这样的:要弹出的东西,就在当前页面,只不过是隐藏的。当点击按钮的时候,它才显示出来。我借鉴了这个思路,实现了弹出层,完美兼容各大浏览器。在vue篇中已经阐述过了。

使用layui的tab,也有一个问题,在tab外面,点击按钮,控制tab内部的切换。layui也提供了方法,我用了两处,一处是好的,另一处怎么都切换不了。如下图所示:

填写我的求助,点击“生成求助”按钮,提交数据并切换tab “待应助”。ok,这个没有任何问题。看另外一处:

当我点击右边的“我的求助”,需要切换tab到“我的求助”。这个不管怎样都切换不过来。

2、vue-router

我主要用它来做权限验证:

 name: ‘admin‘,
      path: ‘/admin‘,

      component: require(‘../admin/root‘),
      meta: {
        requiresAdminAuth:true
      },

添加了一个meta对象,在路由的时候“安检”,需要管理员权限的路由,必须检查,没有权限的就跳回到login。

router.beforeEach((to, from, next) => {
  let unLgoin = beforeAction();

  if (to.path === ‘/login‘) {
    next()
  } else if (to.matched.some(r => r.meta.requiresAuth) && unLgoin) {
    next({
      path: ‘/login‘,
      query: {
        redirect: to.fullPath
      }
    })
  } else if (to.matched.some(r => r.meta.requiresAdminAuth) && (unLgoin || !isAdmin())) {
    next({
      path: ‘/login‘,
    })
  } else {
    next()
  }
})

router-view能做出像iframe框架的东西,如后台管理页面中,左侧和顶部一般是固定的部分,而中间的区域是加载不同的页面。

 <div class="layui-body layui-tab-content" style="bottom:0;z-index:1000" :style="readyShowContent?‘top:0;left:0;‘:‘‘">
        <router-view></router-view>
 </div>

当然,这得配合路由表了。

{
      name: ‘admin‘,
      path: ‘/admin‘,

      component: require(‘../admin/root‘),
      meta: {
        requiresAdminAuth:true
      },
      children: [{
          path: ‘/‘,
          component: require(‘../admin/userManage‘)
        },
        {
          path: ‘user‘,
          component: require(‘../admin/userManage‘)
        },
        {
          path: ‘fixContent‘,
          component: require(‘../admin/fixContent‘)
        },
      ]
 }

另外一个问题是router兼容性问题,在IE下面,a链接带有vue路由的,都打不开,如果换成router-link的时候,就可以正常打开链接。当界面的改动量太大的时候,我们还是采用其它的改法,检测浏览器是否为IE:

export default {
    mounted() {
        function checkIE() {
            return ‘-ms-scroll-limit‘ in document.documentElement.style && ‘-ms-ime-align‘ in document.documentElement.style
        }
        if (checkIE()) {
            window.addEventListener(‘hashchange‘, () => {
                var currentPath = window.location.hash.slice(1);
                if (this.$route.path !== currentPath) {
                    this.$router.push(currentPath)
                }
            }, false)
        }
    }
};

放到App.vue中。

3、vue中http请求

vue是一个纯前端的框架,需要webapi支持数据。通过http请求webapi就行了。我们既可以用jquery ajax请求,也可以使用axios请求,我们项目中选择了后者。axios里有个拦截器挺好的,它可以在请求发送前,添加请求头及一些工作。

const requestInterceptor=axios.interceptors.request.use(
  config => {
    config.data = JSON.stringify(config.data);
    config.headers = {
      ‘Content-Type‘:‘application/json‘,
      ‘Authorization‘:‘Bearer ‘+getStore(‘token‘),
       xhrFields: {
         withCredentials: true
      },
      ‘Pragma‘: ‘no-cache‘,
      ‘Cache-Control‘: ‘no-cache‘
  }
    return config;
  },
  error => {
    return Promise.reject(err);
  }
);

这个拦截器做了两件事情:

a、请求data:把js对象转为json字符串

b、请求头:添加了数据发送格式,token验证、IE下get有缓存,所以加了‘Cache-Control’和‘Pragma’

拦截器在请求的时候,也可以根据情况去掉:

/**
 * post请求
 * @param url
 * @param data
 * @param  isRemoveInterceptor  是否移除拦截器
 * @returns {Promise}
 */

 export function post(url,data = {},isRemoveInterceptor=false){
   if(isRemoveInterceptor){
     axios.interceptors.request.eject(requestInterceptor);
   }
   return new Promise((resolve,reject) => {
     axios.post(axios.defaults.baseURL+url,data)
          .then(response => {
            resolve(response.data);
          },err => {
            reject(err)
          })
   })
 }

4、vuex + local Storage

有了vuex,为什么还需要local Storage?这是因为vuex相当于一个“娇弱”的内存数据库,如果F5刷新的话,它的数据会丢失。在使用过程中,vuex不能跨域多个标签页共享数据。这时候,可以采用h5的api  localStorage,它可以实现数据持久化。我们在登录的时候使用了vuex保持状态。如果其它页面需要判断当前用户是否登录,可以直接通过vuex获取,vuex为空的话,就去storage中去查看。用户登录的状态不能长期保持,因为涉及网站安全问题,所以得实现登录过期的方法,迫使用户重新登录。

5、kindeditor

  在结合vue使用的时候,遇到跨域上传文件的问题,按照网上的好多办法都解决不了。我们的项目不涉及这个问题,我是在本地调试的时候遇到的。

好了,今天就到这里,周末快乐!

原文地址:https://www.cnblogs.com/wangqiang3311/p/10084302.html

时间: 2024-08-29 23:29:50

vue前端开发那些事——vue开发遇到的问题的相关文章

前端开发之走进Vue.js

Vue.js作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式.本文旨在帮助大家认识Vue.js,了解Vue.js的开发流程,并进一步理解如何通过Vue.js来构建一个中大型的前端项目,同时做好相应的部署与优化工作. 文章将以PPT图片附加文字介绍的形式展开,不会涉及知识点的具体代码,点到为止.有兴趣的同学可以查看相应的文档进行了解. Vue.js简介 从上图的介绍中我们不难发现Vue.js是一款轻量级的以数据驱动的前端JS框架,其和jQuery最大的

【前端vue开发架构】vue开发单页项目架构总结

为营销活动设计的前端架构 主要的技术栈为 Vuejs,Webpack,请自行阅读如下技术或者框架的文档: 一.基础说明: node (https://nodejs.org/en/) npm (https://www.npmjs.com) webpack (https://github.com/webpack/webpack) vuejs (https://vuejs.org) babel (https://babeljs.io) 其他的比如sass等CSS预编译器,都可以先不考虑. 下面对以上涉

vue前端项目开发环境搭建并用npm方式运行

1.下载node.js http://nodejs.cn/download/ 推荐下载 .mis安装包,下一步下一步... 安装完后,通过cmd控制台输入node -v 弹出版本号即成功 2.通过node.js中内置的npm(包/依赖)插件来下载其他开发所需的环境 注意:如设置了代理限制,可通过cmd控制台输入npm config set proxy=http://代理服务器地址:8080 设置代理(网络有代理限制时下载不到依赖包时,按需设置) npm config delete proxy 为

Vue+Node+MongoDB高级全栈开发

第1章 本地与服务器环境准备介绍微信公众号/小程序/域名/服务器的申请选购流程,在本地与线上服务器分别对项目的运行环境进行搭建部署,如 Node.js/Vue/Yarn/PM2/Nginx/MongoDB 等等,同时会来简单介绍下从本地通过 PM2 利用 Git 仓库直接往线上服务器部署以及 Nginx 端口映射解析特定域名的实现流程,最终准备好本地线上和外部业务环境为开发...1-1 导学1-2 课程简介1-3 申请认证公众服务号与小程序1-4 选购域名与备案解析域名1-5 选购配置服务器1-

Vue全家桶+Egg从0开发大型项目(一)搭建项目

前言 因为要开发本科毕设,做一个校友交流平台,正好想记录下整个开发过程,同时也分享给各位.当然那些需求调研的,前期设计的就省略啦. 项目大概是一个全栈的项目,使用的IDE是vscode(期间涉及一些插件.配置推荐),大概的项目技术栈: vue + vue-router + vuex + vue-i18n + element-ui + egg + sequelize 前端就用vue-cli3来搭建,后端就用egg-init来搭建,比较简单,官方文档也比较详细. 项目技术栈 前端: 前端MVVM框架

Haytham个人博客开发日志 -- Flask+Vue基于token的登录状态与路由管理

指路牌 符合一下关键词,这篇博客有可能会对你有帮助 不使用工厂函数的Flask应用 不使用蓝本的Flask应用 Flask跨域配置 基于Token的登录状态管理 Flask+Vue Vue路由拦截 Axios 钩子 适用场景 这是一篇个人博客搭建的记录博客,也是一篇关于Flask和Vue的简单"工具书",最后的代码会包含Web开发中常用的功能.(不全,只是使用频率相对高的) 环境 系统: 无关 Flask(Python3) Vue(Node.js) 参考 <Flask Web开发

Vue全家桶之组件化开发

作者 | Jeskson 掘金 | https://juejin.im/user/5a16e1f3f265da43128096cb 学习组件化开发,首先掌握组件化的开发思想,组件的注册方式,组件间的数据交互方式,组件插槽的用法,vue调式工具的用法,组件的方式来实现业务逻辑功能. 组件化开发思想,组件注册,组件调式,组件间的数据交互,组件插槽 组件化规范,就是多的可能性重用 全局组件注册语法 Vue.component(组件名称, { data: 组件数据, template: 组件模板内容 }

vue.js拓展篇(10):测试开发与调试

内容 第15章:测试开发与调试 任何实际项目的开发,除了功能性代码的完成,规范的开发流程和严谨的测试都是不可或缺的.合理使用工具将事半功倍. 1.ESLint ESLint是Lint语法检查工具,避免的低级的bug和不统一的代码风格.它比JSLint好的地方是可配置.细粒度的,每一条规则都是一个插件.4 ESLint的项目配置有两种基本方法: 第一种,JS注解的方式将配置信息直接加到文件里. 第二种,package.json { "env":{ "browser":

vue插件开发流程详解-从开发到发布至npm(一)

vue的插件开发 1.本地开发 1.1 初始化本地开发项目 我们采用vue-cli,初始化一个vue 项目.这个不做详解,请移步到 这里,查看具体详细.初始化后就是这样的项目结构: 其他的文件目录不是本节内容重点,不做详解,请移步这里查看. 1.2 test.js 的内容 ,这是插件的入口文件 关于为什么需要在install这个方法这里添加我们的方法,可以参考官网.https://cn.vuejs.org/v2/guide/plugins.html  这里只是用了其中的一部分的内容. test.