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

Posted

技术标签:

【中文标题】VueJS 在操作之前处理完整的模板【英文标题】:VueJS Process complete template before operations 【发布时间】:2020-06-01 14:27:51 【问题描述】:

下午好。

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

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

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

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

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

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

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

附带说明,像这样延迟渲染违背了我的所有直觉,但看起来我们目前没有选择余地。 我计划使用内容哈希缓存翻译客户端,以防它们被更新,因此希望不会经常需要 ajax 调用,仅在首次加载时。 该站点正在逐渐转换为 SPA,此时我将能够拆分 FE 并通过节点使用 s-s-r。直到那时,尽管这是我能想到的最好的主意。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我一直在考虑这个问题,因为目前我只是在 App Init 上将整个缓存的 json 发送到带有加载屏幕的客户端,目前还不错,因为没有太多要翻译但正在考虑否则采用以下方法:

在翻译vuex模块中有一个数组存储需要translate(数组)的键列表。

t() 将键推到translate(如果尚未在已翻译 存储中并返回空字符串占位符 直到翻译可重新获得。

mounted 上在 store 上调度 fetch 方法以执行 ajax 调用并设置翻译状态并在完成时清除 translate 列表。

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

【讨论】:

这或多或少符合我的想法。但我的问题是,我不一定想在每个组件的挂载钩子中发送一个 fetch 方法,而是想将所有组件所需的所有翻译分组在一个请求中。这仅在初始加载时,之后异步加载的任何组件都必须执行额外的fetch 在这种情况下,只需将 ajax 调用放在 setTimeout 中,每次 fetchdispatched 时首先调用 clearTimeout,所以从多个组件快速调用 fetch 会取消请求直到申请解决。这将为您提供一个有效的缓冲区,以允许在发出最终 ajax 请求之前构建更大的密钥列表。

以上是关于VueJS 在操作之前处理完整的模板的主要内容,如果未能解决你的问题,请参考以下文章

在模板内的 vuejs 组件中导入和使用类

webpack模板之大文件优化

Python+OpenCV图像处理之模板匹配

vuejs开发组件分享之H5图片上传压缩及拍照旋转的问题处理

将 VueJs 组件添加到 Django 模板中

VueJS - 在模板中将属性从一个组件传递到另一个组件