不前后端分离写 VUE,页面是不是会有多个 createApp 行为?

2021-05-29 22:13:03 +08:00
 Felldeadbird

最近在尝试写 VUE,因为旧项目无法做到前后端分离,依旧是基于后端渲染模板模式。

一般项目,会分 页眉、侧栏,内容和页脚。在后端来说,这几块拆分好,然后用 JQ 去写一套逻辑即可。

我尝试用 VUE 去编写,VUE 要求在 createApp({...数据逻辑..}) 中就要声明好了。如果我用到 element UI 的布局划分,

//先注册页眉
header = Vue.createApp({..逻辑和组件..}).use('ElementPlus').mount('#header');

//在注册侧栏
sidebar = Vue.createApp({..逻辑和组件..}).use('ElementPlus').mount('#sidebar');

//最后注册布局
app = Vue.createApp({..逻辑和组件..}).use('ElementPlus').mount('#app');

这是其中一个解决办法,还有另外一种,组件

//在页眉文件 header.php 声明
<script>
   const app = Vue.createApp({});
   
   app.use(ElementPlus);
   
   app.component('header', {})
</script>

//sidebar.php 侧栏
<script>
   app.component('sidebar', {})
</script>

//content.php 内容
<script>
   app.component('sidebar', {})
</script>

//footer.php 页脚
<script>
   app.mount("#app");
</script>

感觉很别扭,因为我要将后端的模板变量,转换为 Javascript 的标量,数组或对象。

不知道有没有后端有其他更优雅的解决办法呢?

3361 次点击
所在节点    Vue.js
11 条回复
Roxk
2021-05-29 23:12:37 +08:00
后端渲染时,把前端所需要的数据挂在一个全局变量上(比如 window.__pagedata_header={data:1};window.__pagedata_sidebar={data:1}),然后前端在一个 script 里去拿 window.__pagedata_header 和 window.__pagedata_sidebar 塞进 createApp 中,不知道是否可以?
zhyt0520
2021-05-30 00:45:25 +08:00
建议参考 inertiajs
https://inertiajs.com/
echowuhao
2021-05-30 01:32:30 +08:00
可以考虑 vue 的弟弟 https://github.com/alpinejs/alpine
xiaomingVTEX
2021-05-30 01:37:49 +08:00
IvanLi127
2021-05-30 09:51:47 +08:00
我觉得无法分离的,还想直接上 vue,直接把页眉页脚内容什么的全丢到一个 div 下面 然后 vue 挂这个 div 就好了。。。另外有多个 vue 实例也不是什么问题吧
rykinia
2021-05-30 10:08:20 +08:00
用 vue 的组件是正确的方式,但应该写一个 main-page.vue ,然后用 vue 自己引入 component/header.vue, component/siderbar.vue 等组件,页面完全由 vue 管理,后端只负责提供数据。而不是依然用后端来分别 include.
rykinia
2021-05-30 10:19:16 +08:00
@rykinia 突然想起来这是前端打包的写法,无视吧 -.-
xiaoyiyu
2021-05-30 22:11:33 +08:00
不用吧,前后端不分离但是可以分离 js 文件,js 文件写在 php 之外。如果有后端生成的 js 变量,定义在 php 的 script 标签里,分离的 js 放在最后引入就可以吧
Felldeadbird
2021-05-30 22:28:50 +08:00
@xiaoyiyu 这个做法考虑过。要提前写好总提的 JS 方法,不然其他人接手维护,改动起来很容易出现 BUG 。
Rache1
2021-05-31 09:25:22 +08:00
@zhyt0520 感觉这种开发方式很奇怪 😂 虽然现在在用类似的
TomVista
2021-06-01 10:00:12 +08:00
<div id='app'>
<template />
</div>

<script>

const data = %data%

new Vue({
el: "#app",
data,
methods:{}
}
</script>

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/780075

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX