在加载html之前运行脚本vuejs [重复]

Posted

技术标签:

【中文标题】在加载html之前运行脚本vuejs [重复]【英文标题】:run script before html is loaded vuejs [duplicate] 【发布时间】:2021-04-27 15:47:18 【问题描述】:

我想测试用户是否登录,如果没有,他将返回登录页面。 我希望在加载 html(或模板)之前执行检查用户是否登录的脚本。 我试过了

beforeCreate()

和其他东西,但 html 仍然在脚本运行之前加载。 这是我的代码

if(sessionStorage.getItem("email") == undefined) location.href = "/";

编辑 我使用 CLI 制作了这个 vue 项目,所以我没有带有头部和主体的普通 index.html,我可以在 vue 之外的任何地方简单地添加脚本。

【问题讨论】:

【参考方案1】:

使用 javascript 实现安全代码并不是“最佳实践”。如果用户在他们的浏览器中关闭 JavaScript,他们实际上已经绕过了您的安全。

相反,使用服务器端代码来检测当前用户是否登录,如果没有,则将 HTML 重定向发送到登录页面而不是正常的 HTML 内容。

伪代码(因为您没有指定任何服务器端语言):

if(userLogin <> true)
    Return HtmlRedirect("YourLoginPage")
...
Return CuurrentPage

如果用户无权查看,此方法可防止将任何 HTML 发送给用户。

【讨论】:

如果您绝对必须使用 JavaScript,请确保任何重定向代码都在 HTML 页面的 HEAD 中,以便在页面在浏览器中呈现之前执行。 有一个服务器端检查,我没有任何问题或错误,我只是想让它变得更好。我是 vuejs 的新手,所以也许我想念一些东西 如果您已经进行了服务器端检查以防止将 HTML 发送到客户端,那么您添加的任何 JS 代码都将无关紧要,因为它永远不应在客户端浏览器中执行。它只会无缘无故地将未使用的代码添加到每个安全页面 - 诚然,这将是一个小幅增加,不太可能对客户端产生太大影响,但如果代码在未来产生任何错误(随着库和标准的更新) ),那么您创建了一个难以追踪的错误。如果永远无法执行,我建议无需为此添加任何 JS 代码。【参考方案2】:

我同意@Dragonlaird 所说的从客户端处理它不是最佳实践。但是,我认为您必须尝试beforeMountbeforeUpdate 而不是beforeCreate,因为您需要在加载HTML(或模板)之前完成这些工作。根据 Vue.js 文档,

    beforeMount: 它在挂载开始之前被调用:渲染函数即将被第一次调用。 但是这个钩子(beforeMount)在服务端渲染时不会被调用。

    beforeUpdate: 在修补 DOM 之前数据发生变化时调用它。这是在更新之前访问现有 DOM 的好地方,例如删除手动添加的事件监听器。

在服务器端渲染期间也不会调用此钩子,因为只有初始渲染是在服务器端执行的。

更多信息请参考 Vue.js 文档。

https://vuejs.org/v2/api/#Options-Lifecycle-Hooks

【讨论】:

【参考方案3】:

在启动 vue 实例之前尝试检查您的条件是否匹配,并在满足如下条件后启动它:

if(sessionStorage.getItem("email") == undefined) 
   location.href = "/";
 else 
   var app = new Vue(
      el: '#app',
      data: 
         message: 'Hello Vue!'
      
   )

【讨论】:

我使用 CLI 制作了这个 vue 项目,所以我认为我不能使用它,我也在使用路由器。 为什么不能?在 main.js 中添加 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。

以上是关于在加载html之前运行脚本vuejs [重复]的主要内容,如果未能解决你的问题,请参考以下文章

页面加载完成后执行javascript [重复]

在运行 jQuery 之前以模式加载图像 [重复]

在执行之前检查python版本是不是与脚本兼容[重复]

HTML页面中javascript文件的加载顺序[重复]

奇怪和疯狂的 PHP 错误,清除浏览器历史记录后的页面加载导致脚本多次运行 [重复]

在异步延迟问题上运行多个脚本[重复]