VueJS在操作之前处理完整的模板



下午好。

我现在有一个有趣的问题。我们有一个第三方服务器,为静态html内容提供翻译。我需要通过Ajax获取这些内容,并将其显示在Vue组件中。

当前情况
这些翻译是通过类似字典的数据结构获取的,即通过类别和关键字。我们已经集成了一个Vue插件,通过函数t将这些加载到我们的组件中,如下所示:

<template>
<section>
<h1>{{ t('CommonHeaders', 'HomePage') }}</h1>
<p v-html="t('Articles', 'SiteDescription')"></p>
</section>
</template>

目前,这些翻译通过将它们嵌入HTML中而被发送到浏览器,之后我们的客户端水合机制读取它们并将它们添加到Vuex存储中。t函数随后查找翻译并在需要的地方显示它们。这些翻译是被动的,接受数据参数来格式化翻译

我们使用Vue SFC以类似SPA的方式呈现用户流,尽管该网站还不是SPA

问题
为了使其工作,必须在字典中的后端控制器方法中列出页面所需的翻译
这已经变得不可维护,并且发送到前端的数据比所需的要多得多。此外,当页面在发送到浏览器之前构建好时,后端系统没有明确的终点,我们可以连接到浏览器中,以便将翻译添加到HTML中,而内容往往会被复制
后端系统是使用DotNet MVC 4构建的,因此目前我们还没有SSR功能

解决方案(希望如此(
为了更好地维护我们的代码,我希望在vue引擎渲染模板之前,利用插件中的"t"函数通过AJAX调用加载翻译,即通过beforeCreate创建的钩子。问题是Vue实例必须知道子组件模板中需要的翻译,然后才能触发AJAX调用,而我不知道如何实现这一点

顺便说一下,像这样延迟渲染违背了我的直觉,但在这一点上我们似乎没有选择
我计划在翻译客户端缓存一个内容哈希,以防它们被更新,因此希望ajax调用不会经常被需要,只在第一次加载时需要
该站点正在逐渐转换为SPA,届时我将能够通过节点拆分FE并利用SSR。到目前为止,这是我能想到的最好的主意

任何帮助都将不胜感激。

我一直在考虑这个问题,因为目前我只是在AppInit上用加载屏幕向客户端发送一个完整的缓存json,目前还不错,因为没有太多需要翻译的内容,但我正在考虑以下方法:

让翻译vuex模块中的一个数组存储需要translate(数组(的密钥列表。

如果尚未在翻译的存储中,则让t()将键推送到translate,并返回空字符串占位符,直到翻译重新可用。

mounted上,在存储上调度一个fetch方法来执行ajax调用,设置翻译状态,并在完成时清除translate列表。

默认情况下,Vue的行为应在VUEX状态更改时重新呈现,并导致调用模板主体中的t(),并在nextTick上返回匹配值,而不是之前返回的placeholder值。

最新更新