概要: jsp代表了传统的开发服务模式,让数据在服务端渲染完毕发送给浏览器。Vue代表着现代化的前端开发模式。对比两者的不同可以更好的理解web前端开发。本文开始将从目录结构,代码复用,路由,增删改查等方面进行对比。然后简单的了解下Nuxt(服务端渲染)。最后写当项目中遇到jq和vue 共同使用时候的解决方法。

一.对比目录结构

1.jsp

jsp
jsp传统页面目录结构

2.vue 目录结构

在这里插入图片描述

2.复用代码的对比

2.1 jsp复用
<%@include file="/WEB-INF/include-head.jsp" %>
<%@include file="/WEB-INF/modal-menu-add.jsp"%>
<%@include file="/WEB-INF/modal-menu-edit.jsp"%>
<%@include file="/WEB-INF/modal-menu-confirm.jsp"%>

将公共的头尾抽取出来公共的部分,然后使用include标签嵌入

2.2 vue组件复用

vue通过封装components嵌入页面直接使用
比如下方分页组件的应用

<template>
  <a-pagination v-model="current" :total="50" show-less-items />
</template>
<script>
export default {
  data() {
    return {
      current: 2,
    };
  },
};
</script>

3.路由的对比

3.1 jsp

1.js实现

 <script type="text/javascript">
            function next(){
                window.location = "page2.jsp";
            }
 </script>

2.jsp自带的forword标签来实现跳转

  <jsp:forward page="page2.jsp" />

3.重定向

 response.sendRedirect("page2.jsp"); 
3.2vue路由
const mainRoutes = {
  path: '/',
  component: _import('main'),
  name: 'main',
  redirect: { name: 'home' },
  meta: { title: '主入口整体布局' },
  children: [
    { path: '/home', component: _import('common/home'), name: 'home', meta: { title: '首页' } },
    { path: '/theme', component: _import('common/theme'), name: 'theme', meta: { title: '主题' } },
    { path: '/demo-echarts', component: _import('demo/echarts'), name: 'demo-echarts', meta: { title: 'demo-echarts', isTab: true } },
    { path: '/demo-ueditor', component: _import('demo/ueditor'), name: 'demo-ueditor', meta: { title: 'demo-ueditor', isTab: true } },
    { path: '/product-attrupdate', component: _import('modules/product/attrupdate'), name: 'attr-update', meta: { title: '规格维护', isTab: true } }
  ],
}

通过路由的方式来实现页面的跳转。

4.编辑页面 回显出现的差异

4.1 vue解决回显问题

通常的解决方案是在管理界面写上调出所有数据的data,进入增删改查子组件后,在需要回显的地方emit调用父组件的方法取值;

 // 父组件的处理回显的函数
   async getSelectTeam() {
   	  //父组件获取数据,写入方法,供子组件调用
      await this.getData();
    },


   <!-- 编辑 进入时候将值放入editItem 然后可以获得初始值,在提交的时候防止后续的bug
   		使用父子组件传值的方式 -->
      <activity-edit
        :editItem="editItem"
        :editVisible="editVisible"
        @closeModal="closeModal"
        @getDetail="getDetail"
        @getSelectTeam="getSelectTeam"
      />
// 再提交的时候调用父组件方法解决回显问题
handleSubmit(e) {
      e.preventDefault();
      this.form.validateFieldsAndScroll(async (err, values) => {
        if (!err) {
          try {
            if (!this.verificationTime()) return;
            const params = { param: values };
            const res = await update(params);
            const { data, msg, code } = res.data;
            if (code === 200) {
              this.$message.success('修改成功');
              this.$emit('getSelectTeam');
            } else {
              throw msg;
            }
            this.$emit('closeModal');
          } catch (error) {
            this.$emit('closeModal');
            this.$message.error(error || '修改失败');
          }
        }
      });
4.2 jsp编辑页面的回显

点击修改按钮后提交获取到的数据然后重新生成树状结构;

 		// 修改的模态框”修改按钮“的单击事件
        $("#menuEditBtn").click(function () {
            var name = $.trim($("#menuEditModal [name=name]").val());
            var url = $.trim($("#menuEditModal [name=url]").val());
            var icon = $("#menuEditModal [name=icon]:checked").val();
            $.ajax({
                url:"menu/edit.json",
                type:"post",
                "data":{
                    "id":window.id,
                    "name":name,
                    "url":url,
                    "icon":icon
                },
                dataType:"json",
                success:function (response) {
                    if(response.result == "SUCCESS"){
                        layer.msg("操作成功!");
                        // 重新生成树形结构
                        generateTree();
                    }
                    if (response.result == "FAILED"){
                        layer.msg("操作失败!");
                    }
                },
                error:function (response) {
                    layer.msg(response.status + " " + response.statusText);
                }

            });

向后台重新生成数据后返回;

// 封装生成树形结构的代码
function generateTree(){
    $.ajax({
        url:"menu/do/get.json",
        type:"post",
        dataType:"json",
        success:function (response) {
            if (response.result == "SUCCESS"){
                var setting = {
                    view:{
                        "addDiyDom":myAddDiyDom,
                        "addHoverDom":myAddHoverDom,
                        "removeHoverDom":myRemoveHoverDom
                    },
                    data:{
                        key:{     
                            url: "NotExist"
                        }
                    }
                };
                var zNodes = response.data;
                $.fn.zTree.init($("#treeDemo"), setting, zNodes);
            }
            if (response.result == "FAILED")
                layer.msg("操作失败"+response.message)
        },
        error:function (response) {
            layer.msg("statusCode="+response.status + " message="+response.statusText);
        }
    });

其他小方面的对比: jq的数据获取方面使用dom的方式来获取数据,而vue使用虚拟dom 来绑定数据,jq面对动态生成的时候使用拼接html字符串的形式改变页面,vue 虚拟dom完成拼接入新的代码片段。

5.Nuxt 页面的处理方案

nuxt是nodejs的一个框架。在服务端做技术的渲染,将数据一次性返回给浏览器。
使用服务端渲染还需要对node有一定的了解,通常情况下使用用Express执行Nuxt,使用服务端渲染主要使用Vue 后的两大问题:

1、seo问题,有利于搜索引擎蜘蛛抓取网站内容。

2、首屏加载过慢问题,打开首页需要加载很多资源,通过服务端渲染可以加速首屏渲染。

同样服务端渲染也会有弊端,主要是根据自己的业务场景来选择适合方式,由于服务端渲染前端页面,必将会给服务器增加压力。
vue后端渲染主要插件:vue-server-renderer

// nuxt
const {
  Nuxt,
  Builder
} = require('nuxt') // 引入核心构建属性
 
// 判断开发环境
const isProd = (process.env.NODE_ENV === 'production')
const port = process.env.PORT || 80
 
// 引入nuxt配置
const config = require('./nuxt.config.js')
config.dev = !isProd;
const nuxt = new Nuxt(config);
 
// 判断生产模式 dev(开发者模式)表示重新构建 ;pro(生产模式)表示直接从yanr build的文件直接执行
if (config.dev) {
  new Builder(nuxt).build()
    .then(listen)
    .catch((error) => {
      console.error(error)
      process.exit(1)
    })
} else {
  listen()
}复制代码

参考博文:https://blog.csdn.net/weixin_33720956/article/details/87959135

6.jq 与vue共同使用

项目有有可能会出现jq 和vue都需要使用的情况。具体的结合思路是 Vue 渲染完所有的 HTML组件之后再通过 JQuery 处理,而使用 JQuery 时应避免直接操作 DOM ,但是应用动画是允许的。

6.1 mounted 情况

//**注意** mounted 不会保证所有的子组件也都一起被挂载。
//如果你希望等到整个视图都渲染完毕,可以在 mounted 内部使用 vm.$nextTick:
mounted: function () {
  this.$nextTick(function () {
    //JQ
  })
}

6.2 载入页面的情况下:

$(document).ready(function () {
    //先执行vue
    var app = new Vue({
        el: '#app',
        data: {
        hello: 'Hello Vue',
    }
  $(function () {})
    //再jQ
}) 

第六部分参考博文:https://www.jianshu.com/p/ddab3ac9ab25

Logo

前往低代码交流专区

更多推荐