如何在vuejs中绑定html <title>内容?

Alf*_*ang 46 html javascript frontend mvvm vue.js

我正在尝试关于vuejs的演示.现在我希望html标题绑定一个vm字段.

以下是我试过的:

index.html

<!DOCTYPE html>
<html id="html">
<head>
    <title>{{ hello }}</title>
    <script src="lib/requirejs/require.min.js" data-main="app"></script>
</head>
<body>
{{ hello }}
<input v-model="hello" title="hello" />
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

app.js

define([
    'jquery', 'vue'
], function ($, Vue) {
    var vm = new Vue({
        el: 'html',
        data: {
            hello: 'Hello world'
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

但标题似乎没有限制,如何使它工作?

str*_*str 69

由于我更喜欢<title>从视图部分设置,因此基本上有两种方法可以解决它.

使用现有组件

例如,vue-headful:

安装

npm i vue-headful
Run Code Online (Sandbox Code Playgroud)

注册组件:

import Vue from 'vue';
import vueHeadful from 'vue-headful';

Vue.component('vue-headful', vueHeadful);

new Vue({
    // your configuration
});
Run Code Online (Sandbox Code Playgroud)

然后在每个视图中使用vue-headful组件:

<template>
    <div>
        <vue-headful
            title="Title from vue-headful"
            description="Description from vue-headful"
        />
    </div>
</template>
Run Code Online (Sandbox Code Playgroud)

请注意,vue-headful不仅支持标题,还支持多个元标记和文档语言.

创建自己的组件

创建一个vue文件,其中包含:

<script>
    export default {
        name: 'vue-title',
        props: ['title'],
        watch: {
            title: {
                immediate: true,
                handler() {
                    document.title = this.title;
                }
            }
        },
        render () {
        },
    }
</script>
Run Code Online (Sandbox Code Playgroud)

使用注册组件

import titleComponent from './title.component.vue';
Vue.component('vue-title', titleComponent);
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的视图中使用它,例如

<vue-title title="Static Title"></vue-title>
<vue-title :title="dynamic.something + ' - Static'"></vue-title>
Run Code Online (Sandbox Code Playgroud)

  • +1我会选择这个,因为将你的Vue实例挂载到html标签(而不是身体中的隔离包装器)被认为是不好的做法. (4认同)
  • @Jared不,不是。两者实际上都是有效的[lifecycle hooks](https://vuejs.org/v2/guide/instance.html#Instance-Lifecycle-Hooks),但在创建“ mount”之前调用了“ created”。 (3认同)

Mon*_*ded 29

您可以在App.vue文件中使用1行执行此操作,如下所示:

<script>
    export default {
        name: 'app',
        created () {
            document.title = "Look Ma!";
        }
    }
</script>
Run Code Online (Sandbox Code Playgroud)

或者更改<title>标签内容public/index.html

<!DOCTYPE html>
<html>
  <head>
    <title>Look Ma!</title> <!- ------ Here ->
  </head>
...
Run Code Online (Sandbox Code Playgroud)


vbr*_*den 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'
    }
  });
});
Run Code Online (Sandbox Code Playgroud)
<!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>
Run Code Online (Sandbox Code Playgroud)

你可以这样做,使用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>
Run Code Online (Sandbox Code Playgroud)

我也根据你的原始代码尝试了这个,它的工作原理

<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>
Run Code Online (Sandbox Code Playgroud)

  • 你在Vue 2.4.2中得到一个警告:`[Vue警告]:不要将Vue挂载到<html>或<body> - 而是挂载到普通元素. (2认同)