@tostershmoster

Почему не обновляется элемент на странице?

Не обновляется элемент
<NavbarLink
  v-for="(page, index) in publishedPages"
  :key="index"
  :page="page"
  :index="index"
></NavbarLink>


Первоначально отрисовывается нормально и при обновлении страницы тоже появляются новые данные.
При нажатии на кнопку срабатывает
bus.$emit('page-updated', {
    index,
    page,
  });


в консоли все данные обновляются и в publishedPages в консоли тоже появляются изменения. но данные на странице обновляются только после нажатия F5

// NavBar.vue
<template>
  <nav :class="[`navbar-${theme} bg-${theme}`, 'navbar', 'navbar-expand-lg']">
    <div class="container-fluid">
      <a href="#" class="navbar-brand">My Vue</a>
      <ul class="navbar-nav me-auto mb-2 mb-lg-0">
        <!-- тут ничего не меняется -->
        <NavbarLink
          v-for="(page, index) in publishedPages"
          :key="index"
          :page="page"
          :index="index"
        ></NavbarLink>

        <li>
          <router-link to="/pages" class="nav-link" aria-current="page" active-class="active">
            Pages
          </router-link>
        </li>
      </ul>

      <form class="d-flex">
        <button class="btn btn-primary" @click.prevent="changeTheme()">Toggle Dark Mode</button>
      </form>
    </div>
  </nav>
</template>

<script>
import NavbarLink from '../components/NavbarLink';

export default {
  components: {
    NavbarLink,
  },

  inject: ['$pages', '$bus'],

  created() {
    this.getThemeSetting();

    this.pages = this.$pages.getAllPages();

    this.$bus.$on('page-updated', () => {
      this.pages = this.$pages.getAllPages();
      console.log(this.pages); // тут изменения есть
    });
  },

  computed: {
    publishedPages() {
      console.log('publishedPages');
      const newPages = Array.isArray(this.pages) ? this.pages.filter((p) => p.published) : [];
      console.log(newPages); // тут тоже есть изменения
      return newPages;
    },
  },

  data() {
    return {
      theme: 'light',
      pages: [],
    };
  },

  methods: {
    // ...    
  },
};
</script>


// NavbarLink.vue
<template>
  <li>
    <router-link
      :to="`/${index}`"
      class="nav-link"
      active-class="active"
      aria-current="page"
      :title="`This link goes to the ${page.link.text} page`"
    >
      {{ page.link.text }}
    </router-link>
  </li>
</template>

<script>
export default {
  props: ['page', 'index'],
};
</script>


// Events.js
const events = new Map();

export default {
  $on(eventName, fn) {
    console.log('on');
    console.log(events);
    if (!events.has(eventName)) {
      events.set(eventName, []);
    }

    events.get(eventName).push(fn);
  },

  // eslint-disable-next-line no-unused-vars
  $off(eventName, fn) {
    throw { message: 'Not implemented' };
  },

  $emit(eventName, data) {
    console.log(events);
    if (events.has(eventName)) {
      console.log('emit');
      events.get(eventName).forEach((fn) => fn(data));
    }
  },
};


upd:
// в localStorage данные есть, зачем так сделано не понятно, но это работает
// там массив из таких элементов
//  {
//    "link": { "text": "Home", "url": "index.html" },
//    "pageTitle": "Home page",
//    "content": "This is the Home content",
//    "published": true
//  },
const pagesKey = 'pages';

const pagesJson = localStorage.getItem(pagesKey);
const pagesStore = JSON.parse(pagesJson);

export default {
  getAllPages() {
    return pagesStore;
  },

  // ...
};


upd:
работает с
:key="Math.random()"
но нужно ли создавать такие ключи? плюсы такого подхода не гуглятся
  • Вопрос задан
  • 106 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы