答案 0 :(得分:57)
由于我更倾向于从视图部分设置<title>
,因此基本上有两种方法可以解决它。
例如,vue-headful:
安装
npm i vue-headful
注册组件:
import Vue from 'vue'; import vueHeadful from 'vue-headful'; Vue.component('vue-headful', vueHeadful); new Vue({ // your configuration });
然后在每个视图中使用vue-headful组件:
<template> <div> <vue-headful title="Title from vue-headful" description="Description from vue-headful" /> </div> </template>
请注意,vue-headful不仅支持标题,还支持多个元标记和文档语言。
创建一个包含以下内容的vue文件:
<script>
export default {
name: 'vue-title',
props: ['title'],
watch: {
title: {
immediate: true,
handler() {
document.title = this.title;
}
}
},
render () {
},
}
</script>
使用
注册组件import titleComponent from './title.component.vue';
Vue.component('vue-title', titleComponent);
然后你可以在你的观点中使用它,例如
<vue-title title="Static Title"></vue-title>
<vue-title :title="dynamic.something + ' - Static'"></vue-title>
答案 1 :(得分:15)
您可以在App.vue文件中使用1行执行此操作,如下所示:
struct Records {
string Name;
string ID;
char Gender;
string Phone_Num;
Records *Next;
};
void SortRecords(Records* Item, Records* head, Records** Set_Head){
Records* Runner = head;
if (head == NULL){
*Set_Head = Item;
}else if (Item->ID<head->ID){
Item->Next=head;
}else{
while(Item->ID>head->ID){
if(Item->ID > Runner->ID && Runner->Next==NULL){
Runner->Next=Item;
break;
}else if(Item->ID<Runner->Next->ID){
Item->Next=Runner->Next;
Runner->Next=Item;
Runner=Item;
cout<<Runner->Next->Name<<endl;
break;
}else{
Runner=Runner->Next;
}
}
}
或更改<script>
export default {
name: 'app',
created () {
document.title = "Look Ma!";
}
}
</script>
<title>
代码内容
public/index.html
答案 2 :(得分:6)
这个答案适用于vue 1.x
使用requirejs。
define([
'https://cdn.jsdelivr.net/vue/latest/vue.js'
], function(Vue) {
var vm = new Vue({
el: 'html',
data: {
hello: 'Hello world'
}
});
});
<!DOCTYPE html>
<html id="html">
<head>
<title>{{ hello }}</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.2.0/require.js" data-main="app"></script>
</head>
<body>
{{ hello }}
<input v-model="hello" title="hello" />
</body>
</html>
你可以这样做,使用ready函数设置初始值,并观察数据更改时的更新。
<html>
<head>
<title>Replace Me</title>
</head>
<body>
<script src="https://cdn.jsdelivr.net/vue/latest/vue.js"></script>
<div id="app">
<input v-model="title">
</div>
<script>
new Vue({
el: '#app',
ready: function () {
document.title = this.title
},
data: {
title: 'My Title'
},
watch: {
title: function (val, old) {
document.title = val
}
}
})
</script>
</body>
</html>
我也根据您的原始代码尝试了这个并且它可以正常工作
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<script src="https://cdn.jsdelivr.net/vue/latest/vue.js"></script>
<div id="app">
<input v-model="title">
</div>
<script>
new Vue({
el: 'html',
data: {
title: 'My Title'
}
})
</script>
</body>
</html>
答案 3 :(得分:2)
可以异步编辑和更新标题和元标记。
您可以使用状态管理,使用vuex为SEO创建商店并相应地更新每个部分。
或者您可以轻松地自行更新元素
created: function() {
ajax().then(function(data){
document.title = data.title
document.head.querySelector('meta[name=description]').content = data.description
})
}
答案 4 :(得分:1)
如果您正在使用 Vuex 并希望 <title>
成为您应用程序状态的一部分,那么:
pageTitle
状态变量mapState()
watch
在模板中,可能添加 immediate: true
立即触发观察者document.title = pageTitle
这将允许您使用 Vuex 管理标题并使它们保持同步。我发现它对 SPA 很有用。
通过这样做,您不必弄乱您的原始 HTML 模板,因为大多数情况下 Vue 根模板驻留在 <body>
中。
这适用于 Vue 2.x。
答案 5 :(得分:0)
只是在这里报时。我已经读到VueJS与元数据无关,因此我会在“ VueJS”领域之外进行此类操作。
基本上像下面这样制作普通的js服务。在这里,您可以添加所有处理元数据的功能,例如Open Graph数据。
meta.js
export setTitle(title) {
document.title = title
}
现在,我们可以在main中导入服务,然后将其提供给应用程序中需要它的任何组件。我什至可以在其他项目中使用我的meta
服务,这些项目使用诸如React或Angular之类的不同框架。便携性超酷!
main.js
import meta from './meta'
new Vue({
router,
render: h => h(App),
provide: {
meta: meta
}
}).$mount('#app')
此处组件将注入其要使用的元服务。
someView.vue
export default {
name: 'someView',
inject: ['meta'],
data: function() {
returns {
title: 'Cool title'
}
},
created: function() {
this.meta.setTitle(this.title);
}
}
通过这种方式将元服务与应用程序分离,因为不同的父组件可以provide
个meta
服务的不同版本。现在,您可以实施各种策略,以查看哪种策略最适合您,或者每个组件采用不同的策略。
基本上,注入会沿组件层次结构行进,并从提供它的第一个父级那里获得meta
服务。只要元服务遵循正确的接口,您就可以做到。
与去耦非常酷
答案 6 :(得分:0)
router.beforeEach((to, from, next) => {
let mohican = to.path; if (mohican == '/') mohican = 'Home'
document.title = mohican.replace('/','');
next();
return;
});
答案 7 :(得分:0)
我有一个应用程序工具栏组件,它对我的 SPA 网站的所有页面都是通用的,并且嵌套在 App.vue 中。在每个页面中,我使用 Vuex 存储更新页面的 created 钩子中的常用工具栏标题:
//in every page.vue
created() {
this.$store.commit('toolBar', { pageTitle: this.pageTitle, ... })
},
为了自动更新网站标题(以及工具栏标题),我在商店中使用了这个修改:
//store.js
toolBar(state,val){
document.title = val.pageTitle
state.toolBar = val
},
同样,我使用相同的机制来更新,例如SEO 元数据