Перестает работать привязка связанного элемента select store - это ошибка? или мой код?

Выбор элемента, привязанного к объекту состояния, теряет привязку обновления.

Я делаю некоторые исследования с lit-html и различными комбинациями маршрутизации / магазина и столкнулся с этим странным поведением. Я использовал стек-блиц от create-lit-app.

У меня есть меню, которое заполняется из массива объекта store.state. Эти ссылки обновляют атрибут currentPage в магазине.

Навигация самостоятельно прослушивает хранилище и устанавливает атрибут [active], если он соответствует currentPage магазина.

События клика обновляют магазин. Это все работает нормально.

В другом элементе (hello-world) у меня есть поле выбора. Поле выбора заполняется тем же массивом в объекте store.state. Атрибут [selected] устанавливается, если опция соответствует атрибуту currentPage. Это тоже отлично работает.

Я также поместил пару тегов p, которые отображают currentPage для здравомыслия... или безумия... пока не уверен.

Теперь, когда я возвращаюсь к использованию меню, состояние изменяется, и меню [active] работает, как и обновления тега p в другом (hello-world) элементе. Однако элемент select не обновляется. Я могу использовать select для обновления состояния, но привязка к select, похоже, перестала работать все вместе.

Я пробовал super.update() и this.update() после поиска похожих проблем, но до сих пор нет сыра. Мне интересно, является ли это функцией уродливого анти-паттерна с моей стороны, или это может быть ошибка RC.

class HelloWorld extends LitElement {

constructor() {
    super();
    store.subscribe(() => super.update());
}

_updatePage(e) {
  console.log(e.target.value);
  store.update(s => s.currentPage = e.target.value);
}

render() {

    return html`
  <p class="app-intro">
    Current page: ${store.state.currentPage}
  </p>
  <select @change=${(e) => this._updatePage(e)}>
    ${store.state.navItems.map(navItem => {
      return html`<option ?selected=${store.state.currentPage===navItem.page}>${navItem.page}</option>`
      })
    }
  </select>

        <p class="app-intro">
            Current page: ${store.state.currentPage}
        </p>
    `;
}

}

Я хочу иметь возможность обновлять состояние из любой точки приложения и обновлять всех подписчиков.

0 ответов

Я предлагаю установить свойства вашего элемента при обновлении магазина, чтобы ваш элемент не был тесно связан со структурой магазина.

В противном случае вы можете использовать this.requestUpdate() вызвать обновление. update() это просто обратный вызов жизненного цикла, который вызывается LitElement внутренне.

Другие вопросы по тегам