在Vue.js中,如何在选择所显示的元素时,如何在选择时将事件射击?

Posted

技术标签:

【中文标题】在Vue.js中,如何在选择所显示的元素时,如何在选择时将事件射击?【英文标题】:In Vue.js, how can I get an event to fire in a select when the displayed element is chosen? 【发布时间】:2019-12-03 07:25:03 【问题描述】:

这是一个小提琴示例:

https://jsfiddle.net/40fxcuqd/

最初,它显示“Carl”

如果我选择 Carol、Clara 等,则会触发一个事件并将数据打印到控制台。

但如果我单击下拉菜单并选择“Carl”,则不会触发任何事件,也不会向控制台打印任何内容。

我使用的事件是@input:

<select v-model="selectedPerson" @input="myEvent()">

如何在每次选择某项时触发一个事件,即使它的值相同?

编辑:

澄清一下,最初选择“Carl”时:

然后下拉菜单打开:

然后再次选择 Carl,我希望触发一个事件并打印到控制台。我目前的问题是没有触发任何事件,并且没有任何内容打印到控制台。

【问题讨论】:

我在 Chrome 和 Firefox 中试过,对我来说效果很好。 也许您可以将事件更改为@change 以获取新的选定数据。 【参考方案1】:

真的很老套,但能胜任,我用过@clickevent.detailevent.which

new Vue(
  el: '#app',
  template: `
        <div>
            <select v-model="selectedPerson" @input="myEvent($event)" @click="myEvent($event)">
                <option v-for="person in people" :value="person.key" :selected="person.key == selectedPerson">person.name</option>
            </select>
        </div>
    `,
  data: 
    people: [
        key: 1,
        name: "Carl"
      ,
      
        key: 2,
        name: "Carol"
      ,
      
        key: 3,
        name: "Clara"
      ,
      
        key: 4,
        name: "John"
      ,
      
        key: 5,
        name: "Jacob"
      ,
      
        key: 6,
        name: "Mark"
      ,
      
        key: 7,
        name: "Steve"
      
    ],
    selectedPerson: 1
  ,
  methods: 
    myEvent: function(e) 
      if (e.detail == 0)//if (e.which == 0)
        console.log(e.type, this.selectedPerson);
    
  
);
body 
  margin: 20px;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;


.as-console-wrapper 
  height: 39px;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.js"></script>
<div id="app"></div>

使用数据的一种不那么老套的方式:

new Vue(
  el: '#app',
  template: `
        <div>
            <select v-model="selectedPerson" @input="myEvent($event)" @click="myEvent($event)">
                <option v-for="person in people" :value="person.key" :selected="person.key == selectedPerson">person.name</option>
            </select>
        </div>
    `,
  data: 
    people: [
        key: 1,
        name: "Carl"
      ,
      
        key: 2,
        name: "Carol"
      ,
      
        key: 3,
        name: "Clara"
      ,
      
        key: 4,
        name: "John"
      ,
      
        key: 5,
        name: "Jacob"
      ,
      
        key: 6,
        name: "Mark"
      ,
      
        key: 7,
        name: "Steve"
      
    ],
    selectedPerson: 1,
    prev: 0,
    isChanged: false
  ,
  methods: 
    myEvent: function(e) 
      if (e.type == "input" || (e.type == "click" && !this.isChanged && (this.prev == this.selectedPerson || this.prev == 0))) 
        this.isChanged = true;
        this.prev = 0;
       else if (e.type == "click" && this.isChanged) 
        console.log(e.type, this.selectedPerson);
        this.prev = this.selectedPerson;
        this.isChanged = false;
      
    
  
);
body 
  margin: 20px;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;


.as-console-wrapper 
  height: 39px;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.js"></script>
<div id="app"></div>

【讨论】:

代码在有或没有@input="myEvent($event)" 的情况下都有效。请确认。另外,我不确定e.which 是如何在这里完成这项工作的。另外,似乎e.which 是non standard 应该在答案中提及。 是的,它可以在没有 input 事件的情况下工作,但 OP 在问题中有它,所以我将它包括在内 e.whichMouseEvent 中唯一的属性,我可以利用它来获得点击在selectoption 之间进行区分的结果,将包括您提到的所有内容在答案中:) e.which 是如何做到的呢?我以为数字 0 意味着它是左键单击?这有什么区别? @RashadSaleh UIEvent.detail 具有相同的行为【参考方案2】:

一种解决方法是在焦点时将 selected 设置为未使用的值,然后无论选择哪个选项都会触发 change 事件。

<select 
    v-model="selectedPerson" 
    ref="s" 
    @focus="selectedPerson = 0" 
    @change="myEvent()"
>

见小提琴:https://jsfiddle.net/tne1wp3q/

虽然它并不完美,每次点击都会触发 change 事件多次,如果没有选择任何选项,它可能会留空。需要更多代码来过滤这些行为。

【讨论】:

【参考方案3】:

这是因为默认选择的选项是 1,那么当你点击 Carl 时没有任何变化,你必须使用 @change 事件,如果你想在点击时获取 Carl 值,应该在选择选项上使用占位符。

new Vue(
    el: '#app',
    template: `
        <div>
            <select v-model="selectedPerson" @change="myEvent()">
                <option :value="null" disabled hidden>Select option</option>
                <option v-for="person in people" :value="person.key" :selected="person.key == selectedPerson">person.name</option>
            </select>
        </div>
    `,
    data: 
        people: [
            key: 1, name: "Carl",
            key: 2, name: "Carol",
            key: 3, name: "Clara",
            key: 4, name: "John",
            key: 5, name: "Jacob",
            key: 6, name: "Mark",
            key: 7, name: "Steve"
        ],
        selectedPerson: null
    ,
    methods: 
    myEvent: function() 
    console.log(this.selectedPerson);
    
    
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app"></div>

【讨论】:

【参考方案4】:

当您更改下拉列表时,您将获得人员数组的索引,您可以执行类似的操作来获取价值

    myEvent: function() 
    console.log(this.people[this.selectedPerson].name);
    
   

【讨论】:

公平地说,当我运行这个小提琴时,当我选择 Carl 时出现错误,或者给我的名字完全错误。

以上是关于在Vue.js中,如何在选择所显示的元素时,如何在选择时将事件射击?的主要内容,如果未能解决你的问题,请参考以下文章

在 Vue.js 中,如何选择组件的节点元素? $refs 可能吗?

VUE.JS 在 FOR 循环中选择一个元素

如何在 Vue.js 中从 JSON 数据创建选择元素?

Vue js如何选择数组中的项目

根据vue js中的选项选择在不同的div中显示数据

如何使用 vue.js 创建适用于单个元素的显示更多/更少按钮?