Как правильно использовать директиву :key в пользовательском компоненте?

Как можно настроить директиву так, чтобы она срабатывала только на конкретный элемент (фильтр), а не на все элементы сразу? Как использовать атрибут :key для этой цели?
  • 8 июля 2024 г. 9:02
Ответы на вопрос 2
Директива :key используется для определения уникального идентификатора элемента в списке, чтобы Vue мог эффективно обновлять и перерисовывать только те элементы, которые были изменены. 

Чтобы использовать директиву :key в пользовательском компоненте, вы можете просто добавить её к элементу списка или другому элементу, который должен иметь уникальный идентификатор. Например:

```html
<template>
  <div>
    <div v-for="item in items" :key="item.id">
      {{ item.name }}
    </div>
  </div>
</template>
```

Чтобы настроить директиву так, чтобы она срабатывала только на конкретный элемент (фильтр), вам нужно добавить атрибут :key к этому элементу с уникальным идентификатором. Например:

```html
<template>
  <div>
    <input type="text" v-model="filter" :key="filter">
    <div v-for="item in filteredItems" :key="item.id">
      {{ item.name }}
    </div>
  </div>
</template>
```

В этом примере элемент с фильтром будет перерисовываться только при изменении его значения. Элементы списка будут обновляться в соответствии с новым фильтром.
напиши директиву отдельно от компонента и потом повесь на нужный элемент. 
import {Directive, DirectiveBinding} from "vue";

export const clickOutside: Directive<HTMLElement, string> = {
    mounted(el: HTMLElement, bind: DirectiveBinding) {
        if(bind.value) {
            window.addEventListener('click', (e) => {
                if(!el.contains(<HTMLElement>e.target)) {
                   bind.value()
                }
            })
        }
    },
    unmounted: function (el: HTMLElement, bind: DirectiveBinding) {
        if(bind.value) {
            window.removeEventListener('click', (e) => {
                if(!el.contains(<HTMLElement>e.target)) {
                    bind.value()
                }
            })
        }
    }
}

Это общая директива. И затем вешаешь на любой компонент какой нужен на корневой div

<div v-click-outside="() => isFilterOpen = false">
   ....
 </div>


А твоя директива закрывает все сразу компоненты, потому что это логично. Если она работает на всех твоих фильтрах, то клик вне конкретного фильтра - его закрывает. Соответственно если у тебя открыты все сразу фильтры и ты кликнешь ГДЕ УГОДНО на странице, то закроются все фильтры сразу.
Конечно, если кликнуть на фильтре вместо "где угодно", то закроются все фильтры кроме того, на котором ты кликнул
Похожие вопросы