VueJS——处理动态生成的下拉列表中的下拉状态

VueJS -- handle dropdown state in dynamically generated list of dropdowns

我正在尝试处理动态生成列表中多个下拉列表的 open/close 状态和值。对于单个下拉菜单,data() 中的 "isOpen" 变量有效,但在列表中,所有下拉菜单(可以预见)通过相同的单击打开和关闭,并且它们选择的值相同。也就是说,好像它们都是相同的下拉列表。

我不确定如何使用外部列表的键来区分所有下拉列表和/或确保它们都具有与之关联的唯一值。任何帮助都是极好的。

// main list
<div
  class="main-list"
  v-for="(item, index) in list"
  :key="index"
>
  <div class="list-item">
    <h1>Item Title</h1>
    <p>Description</p>

    // dropdown for this item in above v-for
    <div
      @click="isOpen = !isOpen"
      :class="{ 'is-open': isOpen }"
      class="dropdown-wrap"
      :key="index"
    >
      <div class="dropdown-title">
        {{ selectedLocation ? selectedLocation.location_name : "Select Location" }}
      </div>
      <ul class="locations-list">
        <li
          class="location"
          v-for="(item, index) in locations"
          :key="index"
          @click="setLocation(item)"
        >
          <a
            class="location-link"
            :aria-label="item.location_name"
          >
            {{ item.location_name }}
          </a>
        </li>
      </ul>
    </div>


  </div>
</div>

我认为您必须将 isOpen 设置为对所有点击都是唯一的。这样您就可以管理所有下拉菜单

喜欢.. isOpen[index] 否则你知道

原因是您声明 isOpen 属于 mainList.vue 的方式,但它应该属于每个下拉列表并且独立于组件。

最佳做法是您需要创建另一个 Vue 组件调用 Dropdown 并将所有逻辑移至那里

Dropdown.vue

<template>
 <div class="list-item">
    <h1>Item Title</h1>
    <p>Description</p>

    // dropdown for this item in above v-for
    <div
      @click="isOpen = !isOpen"
      :class="{ 'is-open': isOpen }"
      class="dropdown-wrap"
      :key="index"
    >
      <div class="dropdown-title">
        {{ selectedLocation ? selectedLocation.location_name : "Select Location" }}
      </div>
      <ul class="locations-list">
        <li
          class="location"
          v-for="(item, index) in locations"
          :key="index"
          @click="setLocation(item)"
        >
          <a
            class="location-link"
            :aria-label="item.location_name"
          >
            {{ item.location_name }}
          </a>
        </li>
      </ul>
    </div>


  </div>
</template>

请记得把所有相关的data/methods从mainList移到Dropdown.vue(比如isOpen,selectedLocation,.....)

那么在mainlist.vue,中你只需要调用

<div
  class="main-list"
  v-for="(item, index) in list"
  :key="index"
>
 <drop-down />
</div>

现在每个 Dropdown 应该使用独立 isOpen 而不是相互依赖