【问题标题】:Vue.js custom component with HTML <select> and v-model (W3C compliant)带有 HTML <select> 和 v-model 的 Vue.js 自定义组件(符合 W3C)
【发布时间】:2020-02-19 07:22:01
【问题描述】:

我是 Vue.js 的新手(使用 Nuxt.js),我想要实现的是拥有一个可以在任何地方重复使用并且符合 W3C 的 Select 组件。

在@Jasmonate 答案的帮助下,我设法创建了这个组件,它正在工作。但是value 属性在源代码中仍然可见,因此不符合 W3C。也许问题出在项目的其他地方?!

父组件

<custom-select
  :options="options"
  v-model="selectedOption"
></custom-select>
<span>Selected : {{ selectedOption }}</span>

<script>
  data() {
    return {
      selectedOption: "A",
      options: [
        { label: "One", value: "A" },
        { label: "Two", value: "B" },
        { label: "Three", value: "C" }
      ],
    };
  }
</script>

自定义选择.vue

<template>
  <select :value="value" @input="clicked">
    <option
      v-for="option in options"
      :key="option.label"
      :value="option.value"
    >
      {{ option.label }}
    </option>
  </select>
</template>

<script>
  export default {
    props: {
      value: {
        required: true
      },
      options: {
        type: Array,
        required: true
      }
    },
    methods: {
      clicked($event) {
        this.$emit("input", $event.target.value);
      }
    }
  };
</script>

我阅读了那些文档页面:

还浏览了网络以找到自定义组件中的 v-model 示例,但它始终与输入标签有关。我发现的关于使用 v-model 进行自定义选择的唯一示例实际上并不是一个选择标签,例如 StackOverflow 上的 Vue Select 插件或 this thread

【问题讨论】:

  • 你有什么问题?您是否尝试创建一个在内部使用&lt;select&gt; 的自定义表单组件?如果是这样,您能展示一下您的尝试吗?
  • 您好,感谢您的快速回答,很抱歉我的母语不是英语,我可能没有很好地解释自己。我正在尝试仅创建自定义 Select 组件。我将编辑我的第一条消息以添加我尝试过的众多代码中的一个。

标签: vue.js html-select nuxt.js w3c-validation v-model


【解决方案1】:

v-model 是语法糖。默认情况下,该值是一个名为 value 的 prop,并且每当发出事件 input 时,它都会更改(双向绑定)。

此外,v-model 绑定在 select 元素上,而不是 option

您的代码可以这样修改:

<template>
  <select :value="value" @input="clicked">
    <option
      v-for="option in options"
      :key="option.label"
      :value="option.value"
    >
      {{ option.label }}
    </option>
  </select>
</template>

<script>
  export default {
    props: {
      value: {
        required: true
      },
      options: {
        type: Array,
        required: true
      }
    },
    methods: {
      clicked($event) {
        this.$emit('input', $event.target.value);
      }
    }
  };
</script>

此处的文档:https://vuejs.org/v2/guide/components.html#Using-v-model-on-Components

您还可以更改v-model 使用的道具名称和事件名称,请参阅:https://vuejs.org/v2/guide/components-custom-events.html#Customizing-Component-v-model

【讨论】:

  • 嗨@Jasmonate,感谢您的回答。我在第一条消息中编辑了代码,但它仍然不起作用。我可能不明白选项中的option.value、道具中的value$event 之间的联系:s $event 拍摄option.value 还是我想在方法中做更多的事情?在 Vue.js 示例中,他们写了 $event.target.value 如果我直接在父组件中执行 html-select 标记,selectedOption 会正确更新。
  • 嗨,很抱歉造成混乱,我已经有一段时间没有使用原生 select 了。我已经确定了答案。
  • 不用担心@Jasmonate,感谢您花时间帮助我!所以我用你的更正修改了我的代码,是的,它有效。但是,如果我想要一个 W3C 有效代码,它不接受选择标签上的值。 Error: Attribute value not allowed on element select at this point. &lt;select value="A" data-v-e3eecde6&gt;&lt;option&gt;...所以不知道有没有别的办法呢?
  • Vue 使用虚拟 dom,如果组件属性被声明为 props,则应该从 HTML 元素属性中剥离组件属性。我试图在我的本地环境(vue@2.6.0)中重现这一点,并且value 属性已从&lt;select&gt; 中删除。确保已将 value 添加到组件中的 props 对象中。
  • 如果你想去掉所有额外的属性,你可以试试这个:vuejs.org/v2/api/#inheritAttrs 例子:export default { inheritAttrs: false, data() { ... } }
猜你喜欢
  • 1970-01-01
  • 2017-11-14
  • 2020-09-24
  • 2021-03-30
  • 2018-06-04
  • 2019-05-07
  • 2017-11-07
  • 2020-07-18
  • 1970-01-01
相关资源
最近更新 更多