【问题标题】:Vue.js: Simple click function not firingVue.js:简单的点击功能不触发
【发布时间】:2017-04-05 21:56:31
【问题描述】:

我有一个非常简单的应用程序:

<div id="show_vue">
    <page-change page="bio" @click="changeThePage"></page-change>
    <page-change page="health" @click="changeThePage"></page-change>
    <page-change page="finance" @click="changeThePage"></page-change>
    <page-change page="images" @click="changeThePage"></page-change>
</div>

Vue.component("page-change", {
    template: "<button class='btn btn-success'>Button</button>",
    props: ["page"]
})

var clients = new Vue({
    el: '#show_vue',
    data: {
        currentRoute: window.location.href
    },
    methods: {
        changeThePage: function() {
            console.log("this is working")
        }
    }
})

...但是当我单击&lt;page-change&gt;&lt;/page-change&gt; 按钮时,控制台没有记录任何内容。我知道我遗漏了一些简单的东西,但我没有收到任何错误。

如何让我的点击触发changeThePage

【问题讨论】:

    标签: javascript vue.js vuejs2


    【解决方案1】:

    当你这样做时:

    <page-change page="bio" @click="changeThePage"></page-change>
    

    这意味着您正在等待page-change 组件发出click 事件。

    最佳解决方案(感谢@aeharding):使用 .native 事件修饰符

    <page-change page="bio" @click.native="changeThePage"></page-change>
    

    解决方案 1:从子组件发出点击事件:

    Vue.component("page-change", {
        template: "<button @click='clicked' class='btn btn-success'>Button</button>",
        props: ["page"],
        methods: {
           clicked: function(event) {
             this.$emit('click', this.page, event); 
           }
        }
    })
    

    event 是 Vue 为原生事件传递的默认值,例如 click : DOM event

    解决方案 2:直接从父组件发出:

    Vue.component("page-change", {
        template: "<button class='btn btn-success'>Button {{ page }}</button>",
        props: ["page"]
    })
    
    var clients = new Vue({
        el: '#show_vue',
        data: {
            currentRoute: window.location.href,
            pages: [
              'bio', 'health',
              'finance', 'images'
            ]
        },
        methods: {
            changeThePage: function(page, index) {
                console.log("this is working. Page:", page, '. Index:', index)
            }
        }
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.5/vue.js"></script>
    <div id="show_vue">
    
      <span v-for="(page, index) in pages" :key="index+page"
            @click="changeThePage(page, index)">
      
        <page-change :page="page"></page-change>
        
      </span>
    
    </div>

    【讨论】:

    • 这是触发父级changeThePage 方法的唯一方法吗?我以为有更直接的路线
    • @JeremyThomas 我更新了我的答案:现在你有一个解决方案,在子组件中没有发出。
    • @SLYcee 另一种选择是将changeThePage 方法传递给page-change 组件。但是您的第一种方法是典型的方法。
    【解决方案2】:

    最好的方法是使用.native 事件修饰符。

    例如:

    <my-custom-component @click.native="login()">
      Login
    </my-custom-component>
    

    来源:https://vuejs.org/v2/guide/components.html#Binding-Native-Events-to-Components

    【讨论】:

    • 不幸的是,这对我不起作用。它曾经在 Chrome 上与 @click 一起工作,但在 Safari 上却不行。添加@click.native 对两者都不起作用。知道为什么吗?
    【解决方案3】:

    显然v-on:click 似乎与.native 事件修饰符配合得更好。

    试试page="bio" v-on:click.native="changeThePage()"&gt;&lt;/page-change&gt;。它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多