开发者问题收集

VueJS 和动态标题

2018-08-19
8573

尝试使用 vue-meta

我不明白如何根据 XHR 响应设置标题。到目前为止,我有:

<script>
    export default {
        name: 'Model',
        data() {
            return {
                model: [],
            }
        },
        metaInfo: {
            title: 'Default Title',
            titleTemplate: '%s - site slogan'
        },
        methods: {
            getModels() {
                window.axios.get(`/api/${this.$route.params.manufacturer}/${this.$route.params.model}`).then((response) => {
                    this.model = response.data;
                    this.metaInfo.title = response.data.model_name; // THIS NOT WORKING
                });
            }
        },
        watch: {
            $route(to, from) {
                if ( to.name === 'model' ) {
                    this.getModels();
                }
            },
        },
        created() {
            this.getModels();
        }
    }
</script>

当我尝试设置

this.metaInfo.title = response.data.model_name;

获取错误:未捕获(在承诺中)TypeError:无法设置未定义的属性“title”

所以 this.metaInfo 未定义...

我需要我的标题基于 XHR 请求的响应。

3个回答

您需要使用 metaInfo 的函数形式并让其从反应数据中获取更新

<script>
export default {
    data() {
        return {
            title: "Default Title",
            // ...
        };
    },
    metaInfo() {
        return {
            title: this.title,
            // ...
        };
    },
    methods: {
        getModels() {
            window.axios.get("url...").then((response) => {
                this.title = response.data.model_name;
            });
        }
    },
    //  ...
Stephen Thomas
2018-08-20

这是我的解决方案:

我的 SPA 应用中有一个根组件: App.vue ,其中包含以下代码:

export default {
    /**
     * Sets page meta info, such as default and page-specific page titles.
     */
    metaInfo() {
        return {
            titleTemplate(titleChunk) {
                const suffix = "Marvin Rodank's dank site";
                return titleChunk ? `${titleChunk} - ${suffix}` : suffix;
            },
        };
    },

};

这为所有页面设置了我的默认页面标题,之后, Stephen Thomas 的回答包含关键逻辑。

对于所有具有静态页面标题的页面,这很容易:

metaInfo() {
    return { title: 'List examples' };
},

但动态页面标题更难,但一旦你意识到页面分两个阶段加载,它仍然很容易:

  • 阶段 1:浏览器显示默认页面标题

  • 阶段 2:使用动态标题更新页面标题

    metaInfo() {
    return {
    title: this.example.name,
    };
    },
    

在那里的动态标题示例中,我的子组件从 API 端点获取对象 this.example ,因此需要注意的是,当 this.example 填充时, this.$metaInfo().title 会自动更新。

您可以使用如下代码进行测试:

  metaInfo() {
      return {
          title: this.example.name,
      };
  },

  mounted() {
      const obj = {
          name: 'Sally',
          age: 1337,
      };

      this.example = obj;
  },
agm1984
2020-10-12

我假设您在 vue 实例上的方法内调用 this.metaInfo.title = response.data.model_name; 。我看到的问题是您应该将 metaInfo 对象放在 data() 的返回对象内。像这样:

data() {
  return {
    model: [],
      metaInfo: {
        title: 'Default Title',
        titleTemplate: '%s - site slogan'
     },
  };
},
Mattias
2018-08-19