如何在html head部分使用Vue全局变量?

问题描述 投票:0回答:2

我在我的网站中使用 Vue 版本

2.6.11
。我根据我的src/main.js文件中的
这个问题
设置了一些全局变量,如下所示:

/* global variables */
Vue.prototype.$frontUrl = "http://localhost:8080/";
Vue.prototype.$backUrl = "http://localhost:3500/";

如果我在我的 Vue viewscomponents 中使用它们,就像这个表单标签中的

this.$backUrl
一样,效果很好:

<form novalidate class="row pl-md-5" :action="this.$backUrl + 'sql'" method="post"> 
<!-- some input tags ... -->
</form>

但我想在我的

public/index.html
文件中使用它们,如下代码:

<!DOCTYPE html>
<html>
<head>

  <!-- og meta tags -->
    <meta name="type" property="og:type" content="website">
    <meta name="image" property="og:image" :content='this.$backUrl + "img/images/portfolio-preview.png"'>
    <meta name="url" property="og:url" content="">
    
</head>
</html>

它不起作用。它不会给我任何错误,但不使用 Vue 全局变量值。如果我在浏览器中看到我的页面源代码,它会显示给我

<meta name="image" property="og:image" :content='this.$backUrl + "img/images/portfolio-preview.png"'>
。谁能帮助我如何在我的 index.html 头部部分使用这些变量?

vue.js global-variables meta-tags
2个回答
0
投票

我解决了这个问题,感谢 Joshua Bemenderfer 的 如何使用 Vue.js 和 vue-router 更新页面标题和元数据,我从中借用了一些代码:

创建定义文件definitions.js

export default {
  urlTest: "localhost:8080"
}

为了保持代码逻辑,您需要更改全局变量定义,如下所示:

import def from '../definitions.js'
Vue.prototype.$frontUrl = def.urlTest
//Only if you really need to store as a global

然后在您定义路径的 vue-router 上:

import HomeView from '../views/HomeView.vue'
import definitions from '../config/definitions.js'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [{
    path: '/',
    meta: {
      title: "Home",
      metaTags: [{
        //<meta name="image" property="og:image" :content='this.$backUrl + "img/images/portfolio-preview.png"'>
        name: 'image',
        property: 'og:image',
        content: definitions.urlTest + "/img/images/portfolio-preview.png"
      }]
    },
    name: 'home',
    component: HomeView
  }]
})

// This callback runs before every route change, including on page load.
router.beforeEach((to, from, next) => {
  // This goes through the matched routes from last to first, finding the closest route with a title.
  // e.g., if we have `/some/deep/nested/route` and `/some`, `/deep`, and `/nested` have titles,
  // `/nested`'s will be chosen.

  const nearestWithTitle = to.matched.slice().reverse().find(r => r.meta && r.meta.title);

  // Find the nearest route element with meta tags.
  const nearestWithMeta = to.matched.slice().reverse().find(r => r.meta && r.meta.metaTags);

  const previousNearestWithMeta = from.matched.slice().reverse().find(r => r.meta && r.meta.metaTags);
  // If a route with a title was found, set the document (page) title to that value.
  if (nearestWithTitle) {
    document.title = nearestWithTitle.meta.title;
  } else if (previousNearestWithMeta) {
    document.title = previousNearestWithMeta.meta.title;
  }

  // Remove any stale meta tags from the document using the key attribute we set below.
  Array.from(document.querySelectorAll('[data-vue-router-controlled]')).map(el => el.parentNode.removeChild(el));

  // Skip rendering meta tags if there are none.
  if (!nearestWithMeta) return next();

  // Turn the meta tag definitions into actual elements in the head.
  nearestWithMeta.meta.metaTags.map(tagDef => {
      const tag = document.createElement('meta');

      Object.keys(tagDef).forEach(key => {
        tag.setAttribute(key, tagDef[key]);
      });

      // We use this to track which meta tags we create so we don't interfere with other ones.
      tag.setAttribute('data-vue-router-controlled', '');

      return tag;
    })
    // Add the meta tags to the document head.
    .forEach(tag => document.head.appendChild(tag));

  next();
});

这是 Vue3 的,但方法和路由器路径定义具有相同的格式。如需更详细的说明,请查看顶部的链接。


0
投票

我终于在Vue CLI环境变量的帮助下找到了解决方案。我将全局变量值保存在项目根目录下的

.env
文件中,如下代码所示:

.env 文件:

VUE_APP_BACK_URL=http://localhost:3500/

然后我更改了包含全局变量的

src/main.js
文件,如下代码所示:

main.js:

Vue.prototype.$backUrl = process.env.VUE_APP_BACK_URL;

这样我就不需要更改使用此全局变量的其他组件和视图。最后,对于 html head 标签,我使用了

.env
文件中定义的变量 directly,如下面的代码所示:

<!DOCTYPE html>
<html>
  <head>
  
    <!-- og meta tags -->
    <meta name="type" property="og:type" content="website">
    <meta name="image" property="og:image" content='<%= process.env.VUE_APP_BACK_URL + "img/images/portfolio-preview.png"%>'>
    <meta name="url" property="og:url" content="<%= process.env.VUE_APP_BACK_URL %>">
  
  </head>
 </html>
© www.soinside.com 2019 - 2024. All rights reserved.