【问题标题】:Not able to emit an event to a parent component from child component in Vuejs无法从 Vuejs 中的子组件向父组件发出事件
【发布时间】:2018-09-30 23:00:27
【问题描述】:

我的父组件从 api 获取一个字符串数组的数据,然后将其传递给子组件。在子组件中,我将来自父组件的数据显示为下拉列表,当我从下拉列表中选择特定项目时,我希望它设置特定变量。 我使用了 $emit 和 $event,如文档中所示,但它不起作用。请查看我的代码并告诉我哪里出错了。

父组件App.vue

<template>
    <div id="app">
        <nlp-vision-catalog v-bind:cataloglist="catalogs"  v-on:listenClick="setcatalogselected($event)" ></nlp-vision-catalog>
    </div>
</template>

<script>
    import NlpVisionCatalog from './components/NlpVisionCatalog'
    import axios from 'axios'

    export default {
        name: 'App',
        components: {
            NlpVisionCatalog
        },
        data (){
            return {
            catalogs :[],
            catalog_selected : ""
        }
    },
    methods:{
        fetchcatalogs(){
                axios.get("http://localhost:5000/clients")
                .then((resp)=>{this.catalogs.push.apply(this.catalogs,
                   resp.data.response.results.client_name);
                }).catch((err)=>{
                    console.log(err);
                })
        },
        setcatalogselected(catalog){
        this.catalog_selected = catalog;
    )}
},
    created(){
        this.fetchcatalogs()
    }
}
</script>
<style></style>

我的子组件是 NlpVisionCatalog.vue

enter code here
<template>
<div>
    <h3>Select Catalog</h3>
    <select>
        <option v-for="item in cataloglist">
            <p v-on:click="emitbackthecatalog(item)"> {{ item }} </p>
        </option>
    </select>
</div>
</template>

<script>
export default{
    name : 'NlpVisionCatalog',
    props: ['cataloglist'],
    data (){
        return {
            comp: ""
        }
    },
    methods:{
        emitbackthecatalog(catalog_name){
            this.$emit('listenClick',catalog_name);
        }
    }
};
</script>

<style>
</style>

我到底哪里出错了? ps- http://localhost:5000/clients 是在我的系统上运行的 api。

【问题讨论】:

    标签: javascript vue.js vuejs2 vue-component


    【解决方案1】:

    问题出在您的子组件选择元素中

    将您的代码更改为喜欢在选择元素中使用 onChange 函数

     <h3>Select Catalog</h3>
        <select v-model="selected" v-on:change="emitbackthecatalog(selected)">
            <option v-for="item in cataloglist" :value="item" :key="item" >
               {{ item }}
            </option>
        </select>
    
    
    
    data (){
        return {
            selected: ""
        }
      },
      methods:{
        emitbackthecatalog(catalog_name){
            this.$emit('listenclick',catalog_name);
        }
      }
    

    在你的父组件中

    <nlp-vision-catalog v-bind:cataloglist="catalogs"  v-on:listenclick="setcatalogselected($event)" ></nlp-vision-catalog>
    

    查看演示link

    【讨论】:

    • 非常感谢!!那行得通:)你能解释一下为什么我的方式失败了,而你的方式确实有效。我是 Vuejs 新手。
    • select 元素需要绑定一个值来进行绑定,我们必须使用 v-model。然后只有我们会得到选择了什么值。并且每次选项元素发生变化时,select元素都会触发onchange函数,它会向父组件发出listenclick
    • 最后一个问题。您已经使用了 v-bind:value="item" 和 v-bind:key="item" 。你到底为什么用它?是不是每次我们使用v-for指令的时候都要用到
    • v-bind:value 如果您在 v-for 中使用对象数组,则并非在每种情况下都需要它,那么它是必要的。 v-bind:key 是必要的。即使数组值更改或删除,它也会正确渲染 dom。你可以检查这个link
    猜你喜欢
    • 2021-02-12
    • 2020-10-06
    • 2021-07-26
    • 2018-09-30
    • 2021-11-07
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2021-04-10
    相关资源
    最近更新 更多