Обмен сообщениями компонента Vue.js, продолжение
danholloran.me
Итак, вчера я написал об обмене сообщениями компонентов Vue.js. Это в некотором роде продолжение, так что вам захочется прочитать первую Обмен сообщениями компонентов Vue.js.
Я предположил, что запуск события общего элемента, будь то тело или основной экземпляр Vue.js, на самом деле не имеет значения. Однако я как бы задумался об этом, и это сработало бы, но может возникнуть проблема, если на одной странице есть несколько экземпляров одного и того же компонента. В примере с компонентом оповещения, если по какой-то причине один компонент оповещения находится в заголовке, а другой — в нижнем колонтитуле, предупреждающее сообщение будет добавлено к обоим.
У меня была идея, которая, как я думал, может решить эту проблему, разрешив что-то вроде свойства компонента события. Независимо от того, передаете ли вы ему полное значение или, может быть, просто суффикс. По умолчанию это может быть имя-события, и если вы передадите его имя-события-2, то это событие сработает при передаче тех же данных, что и имя-события. В качестве суффикса, возможно, вы могли бы передать my-custom-suffix, и тогда событие, которое будет запущено, будет чем-то вроде event-name/my-custom-suffix.
// Full event <alert :messages.sync="messages" :event="event-name-2" ></alert> // Event suffix <alert :messages.sync="messages" :event-suffix="event-name-2" ></alert>
Затем вы можете прослушивать событие, следуя примеру, который я использовал в предыдущем посте, используя предложенные вспомогательные функции. Однако не стесняйтесь слушать эти события, поскольку здесь не происходит ничего волшебного.
// In component 1 (full event) componentFireEvent('event-name-2', 'event-details'); // In component 2 (full event) // this.even = 'event-name-2' componentSubscribe(this.event, function( eventDetails ) { // Do whatever you need to do now. }); // In component 1 (event suffix) componentFireEvent('event-name-2', 'event-details'); // In component 2 (event suffix) // this.even = 'event-name-2' componentSubscribe('event-name/' + this.event, function( eventDetails ) { // Do whatever you need to do now. });
Таким образом, вы можете захотеть быть немного более описательным при именовании своих свойств, однако это в основном описывает, как это может работать. Тогда в случае с Alert, который я использую, мне не понадобится это свойство, поскольку на самом деле их не должно быть больше одного на странице. Однако этот вариант использования может развиваться, и тогда я мог бы использовать эту стратегию.
Ведь этого я до сих пор не могу отделаться от ощущения, что мне чего-то не хватает. Что где-то эта проблема решена. Возможно, это было решено в другой среде Javascript, такой как Vue.js. Тем не менее, я думаю, что это довольно надежное решение, и вам не нужно документировать возможности для имен событий. Это должно быть легко, ваш разработчик документирует все с удивительной точностью, верно… верно?
Я мог бы представить себе ситуацию, когда ваш компонент имеет несколько событий, и это может не очень хорошо масштабироваться. Однако в этой ситуации проблема может заключаться скорее в том, как компонент построен. Это определенно интересная проблема, с которой я никогда раньше не сталкивался.