简体   繁体   English

quasar q-select 使用过滤器事件作为常用功能不起作用

[英]quasar q-select use filter event as a common function not work

I try this @filter event example我试试这个@filter 事件示例

https://quasar.dev/vue-components/select#example--basic-filtering https://quasar.dev/vue-components/select#example--basic-filtering

can work能行得通

Index.vue索引.vue

<template>
  <q-select
    :options="options"
    @filter="filter"
    v-model="model"
    use-input
  ></q-select>
</template>

<script>
import { defineComponent } from "vue";
import { computed, reactive, toRefs, ref } from "vue";
const selectedOptions = ["Google", "Facebook", "Twitter", "Apple", "Oracle"];

export default defineComponent({
  name: "PageIndex",
  setup() {
    let state = reactive({
      model: null,
      options: selectedOptions,
    });

    const filter = (val, update, abort) => {
      update(() => {
        const needle = val.toLowerCase()
        state.options = selectedOptions.filter(v => v.toLowerCase().indexOf(needle) > -1)
      })
    }

    return {
      filter,
      selectedOptions,
      ...toRefs(state),
    };
  },
});
</script>

I want to do common function from utils/filter.js but not work我想从 utils/filter.js 做常用功能但不工作

Index.vue索引.vue

<template>
  <q-select
    use-input
    :options="options"
    @filter="
      (val, update, abort) =>
        filter(val, update, abort, selectedOptions, options)
    "
    v-model="model"
  >  </q-select>
</template>

<script>
import { defineComponent } from "vue";
import { computed, reactive, toRefs, ref } from "vue";
import { filter } from "../utils/filter";
const selectedOptions = ["Google", "Facebook", "Twitter", "Apple", "Oracle1"];

export default defineComponent({
  name: "PageIndex",
  setup() {
    let state = reactive({
      model: null,
      options: selectedOptions,
    });

    return {
      filter,
      selectedOptions,
      ...toRefs(state),
    };
  },
});
</script>

utils/filter.js实用程序/filter.js

export function filter(val, update, abort, from, to) {
  update(() => {
    const needle = val.toLowerCase()
    to.value = from.filter((v) => v.toLowerCase().indexOf(needle) > -1)
  })
}

What to do to get filtering to work ?怎样做才能使过滤工作?

work version https://codesandbox.io/s/blissful-brattain-vd085n?file=/src/pages/Index.vue工作版https://codesandbox.io/s/blissful-brattain-vd085n?file=/src/pages/Index.vue

not work version https://codesandbox.io/s/blissful-brattain-vd085nv2-forked-feiv7v?file=/src/pages/Index.vue不工作版本https://codesandbox.io/s/blissful-brattain-vd085nv2-forked-feiv7v?file=/src/pages/Index.vue

finally I pass this to function and change it最后我把它传递给函数并改变它

@filter="(val, update, abort) => filter(val, update, abort, selectedOptions, 'options' ,this)"

filter.js过滤器.js

export const filter = (val, update, abort, from, key, vm) => {
  update(() => {
    const needle = val.toLowerCase()
    vm[key] = from.filter((v) => v.toLowerCase().indexOf(needle) > -1)
  })
}

Better practice after asking v2 vertion询问 v2 版本后更好的做法

@filter="filterHandler"

const filterHandler = (val, update) => {
      update(() => {
        options.value = filter(val, oriOptions)
      })
    }

//filter.js
export const filter = (val, options) => {
  if (val === '') return options
  const needle = val.toLowerCase()
  return options.filter((v) => v.toLowerCase().indexOf(needle) > -1)
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM