如何使用antdv(Ant Design Vue)创建包含用户输入的自定义下拉菜单|Vue 3)?

z9smfwbn  于 2023-01-31  发布在  Vue.js
关注(0)|答案(2)|浏览(545)

我尝试使用antdv创建一个自定义下拉菜单,但是文档(https://www.antdv.com/components/select/#Custom-dropdown)上显示的示例并没有真正向我展示如何使用用户输入添加它。
我在这里创建了一个示例:https://codesandbox.io/s/custom-dropdown-ant-design-vue-3-2-14-forked-3zm0i7?file=/src/demo.vue),但是在输入值时却遇到了麻烦。如果我在div中使用@mousedown="e => e.preventDefault()",那么我就无法访问a-input。如果我尝试不使用它,那么a-input在我输入任何内容之前就消失了。如果你不想点击链接,下面是代码:

<template>
  <a-select
    v-model:value="value"
    style="width: 120px"
    :options="items.map((item) => ({ value: item }))"
  >
    <template #dropdownRender="{ menuNode: menu }">
      <v-nodes :vnodes="menu" />
      <a-divider style="margin: 4px 0" />
      <!-- <div
        style="padding: 4px 8px;"
        @mousedown="e => e.preventDefault()"
      > -->
      <a-input
        placeholder="add name"
        @mousedown="(e) => e.preventDefault()"
        @change="addItem"
      />
      <!-- </div> -->
    </template>
  </a-select>
</template>

<script>
import { defineComponent, ref } from "vue";

let index = 0;
export default defineComponent({
  components: {
    VNodes: (_, { attrs }) => {
      return attrs.vnodes;
    },
  },
  setup() {
    const items = ref(["jack", "lucy"]);
    const value = ref("lucy");

    const addItem = (name) => {
      console.log("addItem");
      items.value.push(name);
    };
    return {
      items,
      value,
      addItem,
    };
  },
});
</script>
fkvaft9z

fkvaft9z1#

您可以通过添加prop :open来控制select的打开/关闭。您需要重新创建标准行为,即@click:open=true,@change open=false,但在默认情况下,单击a输入时它不会关闭
我还建议只在@keypress.enter上调用addItem,而不是@change,否则每次按键都会调用addItem
updated sandbox

<a-select
  v-model:value="value"
  style="width: 120px"
  :options="items.map((item) => ({ value: item }))"
  :open="open"
  @click="open = true"
  @change="open = false"
>
  <template #dropdownRender="{ menuNode: menu }">
    <v-nodes :vnodes="menu" />
    <a-divider style="margin: 4px 0" />
    <a-input
      v-model:value="inputVal"
      placeholder="add name"
      @keypress.enter="addItem()"
    />
  </template>
</a-select>
setup() {
  const items = ref(["jack", "lucy"]);
  const value = ref("lucy");
  const inputVal = ref("");
  const open = ref(false);

  const addItem = () => {
    items.value.push(inputVal.value);
    inputVal.value = "";
  };
  return {
    items,
    value,
    addItem,
    inputVal,
    open,
  };
}
1cklez4t

1cklez4t2#

您正在阻止<a>标记的默认行为。您可以将"preventDefault()"调用移到"addItem"内部,并改用@focus。

<a-input
        placeholder="add name"
        @focus="e => e.preventDefault()"
        @change="addItem"
      />
const addItem = (e) => {
      e.preventDefault();
      console.log("addItem");
      items.value.push(e.target.value);
    };

相关问题