前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >远古项目里的一些挣扎

远古项目里的一些挣扎

作者头像
饼干_
发布2022-09-19 15:19:41
3720
发布2022-09-19 15:19:41
举报
文章被收录于专栏:饼干的前端专栏

theme: channing-cyan

前言

最近接手了一个前后端没分离的项目,java作为后端,使用jsp当做模板来书写前端代码,并且用jq做各种操作,各种离奇写法和jq的辣眼睛操作以及臃肿的写法,这波给我看的属实头疼,但作为一个合格的前端开发者遇到困难就去克服他吧。

这个项目可以说是十几年前的古董项目了,页面跳转都是通过请求后台获取渲染好的dom结构直接展示在页面上。除了首页和登录,没有其他的地址。也就是说无论在哪个页面点击浏览器的返回都是返回到登录页,这点体验实际是非常糟糕的。然后由于页面填充数据都是依靠jq去操作DOM,所以导致表格从渲染出来到填充数据至少会有一秒的延迟。但是由于项目实在过于庞大,只依靠我一个人重构简直天方夜谭,并且还要在此基础上做新需求,于是我决定若是新增页面就使用Vue来书写,若是老页面则继续迭代。(其实我只是不想写jq而已)

在jsp中引入Vue

前面也说了,由于实际地址只有首页和登录页,首页作为主入口的jsp,我们可以在这里通过cdn引入vue相关的资源,由于老项目又要兼顾IE,只好引进Vue2.x来兼顾IE。

代码语言:javascript
复制
<!--这是element相关的资源(做demo用的) -->
<link rel="stylesheet" href="https://unpkg.com/element-ui@2.13.2/lib/theme-chalk/index.css">
<script src="https://unpkg.com/element-ui@2.13.2/lib/index.js"></script>
<!--引进Vue -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

引进后就可以在其他页面快乐的使用Vue的写法咯,由于引进了element,你也可以直接使用他的组件:

代码语言:javascript
复制
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
</head>

<body>
    <div id="app">
        <div>{{ msg }}</div>
        <div v-for="item in list">{{ item }}</div>
        <el-table :data="tableData" style="width: 100%">
            <el-table-column prop="date" label="日期" width="180"/>
            <el-table-column prop="name" label="姓名" width="180"/>
            <el-table-column prop="address" label="地址"/>
        </el-table>
        <el-button type="primary" @click="confirm">确定</el-button>
    </div>
    <script>
        new Vue({
            el: '#app',
            data(){
                    tableData: [
                        {
                            date: "2016-05-02",
                            name: "王小虎",
                            address: "上海市普陀区金沙江路 1518 弄",
                        },
                        {
                            date: "2016-05-04",
                            name: "王小虎",
                            address: "上海市普陀区金沙江路 1517 弄",
                        },
                        {
                            date: "2016-05-01",
                            name: "王小虎",
                            address: "上海市普陀区金沙江路 1519 弄",
                        },
                        {
                            date: "2016-05-03",
                            name: "王小虎",
                            address: "上海市普陀区金沙江路 1516 弄",
                        },
                    ],
                msg: 'hello Vue',
                list: ["早上", "中午", "下午"],
            },
            methods:{
                confirm() {
                    console.log(this.msg, '-welcome-')
                }
            }
        })
    </script>
</body>
</html>

看看效果:

怎么样?是不是看上去还不错?接下来你可能想问那我要复用一些自己封装的组件怎么搞呢?由于我们在页面中都是通过 new Vue 的方式将其挂载在指定DOM上面,我们封装公共组件时可以通过指定el来挂载到对于DOM上,所以在使用组件时我们只需要这样:

代码语言:javascript
复制
<!-- 引入组件 -->
<script src = "./1.js"></script>
<!-- 使用组件 -->
<div id='compontents'></div>

这就相当于一个占位符,我们封装组件时使用js来封装即可:

代码语言:javascript
复制
// 1.js
new Vue({
    el: 'compontents',
    template: `
        <div>
            <div>{{ this.msg }}</div>
        </div>
    `,
    data() {
        return {
            msg: '1122332121'
        }
    }
})

有人可能要问,为什么不直接写.vue文件?我也想写,我们在页面中引入时需要通过vue-loader编译成相应的js文件,但是vue-loader通过cdn方式引入并使用时会报错(这个我没有深入去看)。总之一言难尽,又迫于项目排期压力,只能想出临时方案去解决这个问题。我也想过使用jsx来书写相应的模板部分,但是也没有那么顺利,没法一下成型去使用他,只能用这种写法了。

组件通讯

现在有个新问题,我组件之间该怎么去通讯?

由于我是通过div标签来充当占位符,导致props并不知道从哪里传入进去(如果有大佬知道请赐教),我也是想了挺多办法,但都不太如意,最后只有一种简单粗暴的方法来解决:我直接在主入口定义了一个全局对象,并且通过不同模块功能划分开来,这样就大幅降低重名的概率:

代码语言:javascript
复制
// 在主入口(html)中:
var vue_data = {
    // 商品分类
    shop: {
        a: 111
    },
    // 商品详情
    detail: {
        a: 111
    }
}

使用时:

代码语言:javascript
复制
// 1.html
console.log(vue_data.shop.a) // 111
vue_data.shop.a = 222

// 2.html
console.log(vue_data.shop.a) // 222
vue_data.shop.a = 333

//再回到1.html
console.log(vue_data.shop.a) // 333

使用这种方式缺点也很明显:因为你无法确定哪里更改了数据源,所以出问题时,你得挨个查找。

结尾

由于技术的老旧,网上的解决方案也是少之又少或者不靠谱的,就总结一篇文章输出给大家看看,帮助那些在苦于在老项目挣扎的人。

暂时就这些了,后续再补充吧。

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3a0413kj31mo0

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • theme: channing-cyan
  • 前言
  • 在jsp中引入Vue
  • 组件通讯
    • 结尾
    相关产品与服务
    云开发 CloudBase
    云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档