wickinats
@wickinats

Как правильно обозначить Title у динамических страниц во VueJS?

// Router
{
    path: '/user/:id',
    name: 'User',
    component: User,

    meta: { title: ЗДЕСЬ НУЖНО ОБОЗНАЧИТЬ ID пользователя }
 }


Также хотелось бы узнать о том, как наиболее правильно указать title страницы во Vue? Сейчас использую следующую конструкцию.
// App.vue
  import Menu from './components/Menu'

  export default {
    name: 'Artefact',
    components: {
      Menu
    },

    computed: {
      pageTitle() { return this.$route.meta.title; }
    },

    watch: {
      pageTitle: (val) => {
        document.title = val;
      }
    }, created() {
      document.title = this.$route.meta.title;
    }
  }
  • Вопрос задан
  • 5954 просмотра
Решения вопроса 3
@Dimasik30
Использовать vue-meta
Ответ написан
Комментировать
cashalot
@cashalot
Если я вам помог - пометьте мой ответ как решение
Vue-headful. Вставляешь в любой компонент и он сам меняет и тайтл, и описание, если надо
https://github.com/troxler/vue-headful/blob/master...
Ответ написан
Комментировать
wickinats
@wickinats Автор вопроса
>> После тестов выяснилось, что это подходит только для статики.

Спасибо за ответы. Только сейчас зашёл на данный ресурс и только недавно закончил реализацию вот такого простого метода изменения Title через vue-компоненту с css-директивой display, выставленной в none.

<template>
  <div>

  </div>
</template>

<script>
export default {
  name: 'Title',
  props: {
    name: String
  },

  beforeMount() { document.title = this.name },
  beforeUpdate() { document.title = this.name }
}
</script>

<style lang="scss" scoped>
  div { display: none; }
</style>


>>> Новый скрипт для динамического изменения Title:
<!-- Title.vue -->
<template>
  <div>
    {{ Title }}
  </div>
</template>

<script>
  import { mapState } from 'vuex'

  export default {
    name: 'Title',
    computed: mapState([ 'Title' ]),

    beforeMount() { document.title = this.Title },
    beforeUpdate() { document.title = this.Title }
  }
</script>

<style lang="scss" scoped>
  div { display: none; }
</style>


// App.vue
  import Menu from './components/Menu'
  import { mapState } from 'vuex';


  export default {
    name: 'Artefact',
    components: {
      Menu
    },
    
    computed: mapState([ 'Title' ]),
    watch: {
      Title(value) { document.title = value; } 
    }, created() {
      document.title = this.Title;
    }
  }


// Store
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    Title: 'SSS+'
  }
})
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@StasSych
Developer
Почему бы не использовать router.beforeEach
Это вас избавит и от competed i от watch
https://router.vuejs.org/ru/guide/advanced/navigat...
Ответ написан
Комментировать
@Ibishka
// App.vue
  import Menu from './components/Menu'

  export default {
    name: 'Artefact',
    components: {
      Menu
    },
    methods: {
      getPost() {
        fetch('db.json')
          .then(res => res.json())
          .then(users=> {
document.title = `user ${users.id}`;
.......
        })
      }
    },
    created() {
      this.getPost()
    }
  }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы