Почему API интерактивности WordPress нуждается в контексте?

WordPress Interactive API был официально выпущен в версии WordPress 6.5. Изучая эту новую функцию, я нахожу ее интригующей, но некоторые аспекты меня несколько озадачивают, особенно в отношении использования контекста.

Мой главный вопрос: в чем смысл использования контекста в дополнение к состоянию? Не будет ли достаточно использовать только состояние?

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

import { getContext } from "@wordpress/interactivity";
 
const otherPluginContext = getContext( "otherPlugin" );

Более того, кажется возможным создавать частные состояния, как показано здесь:

const { state } = store("myPlugin/private", {
  state: {
      messages: [ "private message" ]
    } 
  },
  { lock: true }
);

// The following call throws an Error!
store( "myPlugin/private", { /* store part */ } );

Учитывая эти возможности, мне интересно узнать о конкретных преимуществах и вариантах использования контекста в WordPress Interactive API. Может ли кто-нибудь прояснить различия между состоянием и контекстом и объяснить сценарии, в которых использование контекста было бы предпочтительнее, чем использование только состояния?

Как убрать количество товаров в категории WooCommerce
Как убрать количество товаров в категории WooCommerce
По умолчанию WooCommerce показывает количество товаров рядом с категорией, как показано ниже.
0
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Допустим, у вас есть три одинаковых блока на странице, каждый из которых использует API интерактивности. В этом сценарии они будут использовать одно и то же хранилище, но иметь разные индивидуальные свойства, например идентификатор.

<button
  data-wp-interactive = "namespace/storename"
  data-wp-context='{"id":1}'
  data-wp-on--click = "actions.toggle"
>Click me</button>

Теперь предположим, что мы хотим обновить глобальное состояние, добавив или удалив блок, по которому мы щелкнули. С помощью getContext() мы можем выяснить, какой из блоков вызвал действие, и прочитать контекст этого блока, чтобы использовать его с глобальным состоянием.

const { state } = store('namespace/storename', {
  state: {
    clickedBlocks: []
  },
  actions: {
    toggle: () => {
      const context = getContext();

      const index = state.clickedBlocks.findIndex(
        (block) => block === context.id
      );

      if (index === -1) {
        state.clickedBlocks = [...state.clickedBlocks, context.id];
      } else {
        state.clickedBlocks = state.clickedBlocks.toSpliced(index, 1);
      }
    }
  }
});

Без getContext() мы бы не знали, какой из блоков вызвал действие toggle.

Спасибо за ваш ответ. Однако я считаю, что мы можем использовать три отдельных состояния вместо одного общего состояния.

Byeongin Yoon 11.07.2024 05:43

Ага! Теперь я понимаю. Используя getContext(), нам не нужно знать конкретное название штата. Это означает, что нам не нужно передавать имя состояния в мир JavaScript. Функция getContext() автоматически находит для нас локальный контекст. Однако если мы используем три отдельных состояния, нам нужно будет передать пространство имен каждого состояния в соответствующий файл view.js (в мире JavaScript). Потому что мы используем один и тот же блок. То же самое, но с тремя дублированными блоками.

Byeongin Yoon 11.07.2024 05:50

Не могли бы вы также проверить этот вопрос? stackoverflow.com/questions/78733862/…

Byeongin Yoon 11.07.2024 08:26

Пожалуйста, отметьте ответ как принятый, если он отвечает на вопрос. Я посмотрю на твой следующий вопрос

Emiel Zuurbier 11.07.2024 17:28

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