【问题标题】:what is the best way to dynamically show/hide elements base on filtering an array in vuejs基于过滤vuejs中的数组动态显示/隐藏元素的最佳方法是什么
【发布时间】:2020-09-19 12:47:15
【问题描述】:

我想在 vuejs 中基于多项选择显示/隐藏一些元素,目前,我正在使用方法,我很想知道有没有更好的方法来做到这一点?像计算属性?以及如何做到这一点?

代码沙箱示例:

https://codesandbox.io/s/dynamic-filter-bp72r?file=/src/pages/Index.vue

<q-select
      filled
      outlined
      dense
      multiple
      options-dense
      v-model="groupBy.fields"
      :options="reporterlocationGroupByFileldOptions"
      label="fields"
      emit-value
      map-options
      option-value="value"
      option-label="name"
      color="orange"
    />

<!-- elements to show/hide -->
    <q-select
      v-if="visibleFilter('province')"
      filled
      outlined
      dense
      options-dense
      v-model="filtering.provinceId"
      :options="provinceOptions"
      label="province"
      emit-value
      map-options
      option-value="id"
      option-label="name"
      class="q-my-sm"
      color="red"
    />
    <q-select
      v-if="visibleFilter('city')"
      filled
      outlined
      dense
      options-dense
      v-model="filtering.cityId"
      :options="cityOptions"
      label="city"
      emit-value
      map-options
      option-value="id"
      option-label="name"
      class="q-my-sm"
      color="green"
    />

我目前使用方法的解决方案:

data() {
  return {
    filtering: {
      provinceId: '',
      cityId: ''
    },
    reporterlocationGroupByFileldOptions: [
      { name: 'province', orderByDesc: 'province', value: 'province' },
      { name: 'city', orderByDesc: 'city', value: 'city' }
    ]
  }
},
methods: {
    visibleFilter(filterName) {
      var field = this.groupBy.fields.find(x => x === filterName)
      if (field) return true
      return false
    }
  }

【问题讨论】:

  • 请在问题中添加一些相关代码以创建minimal reproducible example。通过查看代码足以理解问题。如果外部链接被删除或无法访问,这个问题将没有未来价值

标签: javascript vue.js


【解决方案1】:

您可以 v-for 覆盖 groupBy 属性中的字段属性,并将您的选项和 v-model 移动到同一对象下:

  filtering: {
    provinceId: {
     value: '',
     option: yourOptions
    },
    cityId: {
     value: '',
     option: yourOptions
    },
    sectionId: {
     value: '',
     option: yourOptions
    },
  },

   <div class="col-xs-12 q-mb-sx" v-for="field in groupBy.fields">
    <q-select
      :key="field"
      filled
      outlined
      dense
      options-dense
      v-model="filtering[field].value"
      :options="filtering[field].option"
      label="green"
      emit-value
      map-options
      option-value="id"
      option-label="name"
      class="q-my-sm"
      color="green"
    />
  </div>

PS 你的代码中有错字,“fileds”而不是“fields”

【讨论】:

  • 感谢您的想法,但他们不会有相同的 v-model 和 :options,我用不同的 v-model 和选项更新了我的代码沙箱示例,感谢您指出“文件”
  • 你仍然可以成功。 v-model = v-model="filtering[field]" - 使用 v-for="field in fields"
  • 谢谢,这是个好主意,但这不是一个通用的解决方案,因为我可能需要在不同的地方显示/隐藏不同的元素类型。
  • 我认为这是最好的解决方案。因为您可以使用相同的逻辑 v-if 输出您的组件,在字段中的某处放置一个“显示”属性。
  • 是的,这是我的示例的最佳解决方案,但假设我有 3 个不同的部分,一个部分 (A) 位于页面右侧,其他部分 (B, C) 位于左边,我有 10 个元素要显示/隐藏,每个元素都有特定的部分(A 或 B 或 C)要放入。
猜你喜欢
  • 2015-11-30
  • 2011-06-23
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 2022-07-27
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
相关资源
最近更新 更多