【问题标题】:VueJS and dynamic titlesVueJS 和动态标题
【发布时间】:2019-01-26 00:58:12
【问题描述】:

尝试使用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:无法设置未定义的属性“标题”

所以 this.metaInfo 是未定义的...

我的头衔需要基于 XHR 请求的响应。

【问题讨论】:

    标签: vue.js vuejs2 vue-component vue-router


    【解决方案1】:

    这是我的解决方案:

    我的 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' };
    },
    

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

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

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

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

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

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

      metaInfo() {
          return {
              title: this.example.name,
          };
      },
    
      mounted() {
          const obj = {
              name: 'Sally',
              age: 1337,
          };
    
          this.example = obj;
      },
    

    【讨论】:

      【解决方案2】:

      你需要使用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;
                  });
              }
          },
          //  ...
      

      【讨论】:

      • 也许请确保您使用的是最新版本的 vue-meta 并正确使用它。否则,您在该软件包中发现了一个错误。见github.com/declandewet/…
      • 也许你是对的,我正在使用 vuejs 2.5 current latest 而 vue-meta is for 2.0 没有注意到,但也许是这种情况......
      • 答案保持不变,但更新的异步文档可在 vue-meta.nuxtjs.org/faq/async-action.html
      【解决方案3】:

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

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

      【讨论】:

      • 不,在这种情况下,即使是默认标题也不会设置。问题是我无法设置自定义标题。
      猜你喜欢
      • 2020-09-02
      • 1970-01-01
      • 2019-12-27
      • 2019-06-13
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 2019-03-02
      相关资源
      最近更新 更多