一条程序龙o^v^o 2022-06-08 00:36 采纳率: 0%
浏览 129

vue子传父不报错但触发不了父组件事件

vue子传父 不报错但触发不了父组件事件

这图真好看

img

最近学习vue的组件之间数据传递,发现了一个问题。
需求:将子组件中的input里的内容传给父组件显示


我的实现方式,不报错,但无法触发父组件的 transContent()

<body>
    <div id="app">
        <parent></parent><!-- parent组件 -->
    </div>
    <!-- parent组件内容 -->
    <template id="tmpParent">
        <div>
            <child @childFn="transContent"></child> <!--  parent组件 里面的 child组件 -->
            子组件传来的值:{{msg}}
        </div>
    </template>
    <!-- child组件内容 -->
    <template id="tmpChild">
        <div>
            <button @click="click">send</button>
            <input type="text" v-model="msg">
        </div>
    </template>
    <!-- 本地 -->
    <script src="./vue2.6.14.js"></script>
    <script>
        // 注册父组件
        Vue.component('parent', {
            template: '#tmpParent',
            data() {
                return {
                    msg: ''
                }
            },
            methods: {
                transContent(childMsg) {
                    this.msg = childMsg
                    console.log(this.msg);
                }
            }
        });
        // 注册子组件
        Vue.component('child', {
            template: '#tmpChild',
            data() {
                return {
                    msg: '子组件中的消息'
                }
            },
            methods: {
                click() {
                    this.$emit('childFn', this.msg);
                    console.log(this.msg);
                }
            }
        });
       // 实例 vue
       let vm = new Vue({el: '#app'});
    </script>
</body>

img


书上的实现方法,可以运行

<body>
    <div id="app">
        <parent></parent><!-- parent组件 -->
    </div>
    <!-- parent组件内容 -->
    <!-- <template id="tmpParent">
        <div> -->
            <!--  parent组件 里面的 child组件 -->
            <!-- <child @childFn="transContent"></child> 
            子组件传来的值:{{msg}}
        </div>
    </template> -->
    <!-- child组件内容 -->
    <template id="tmpChild">
        <div>
            <button @click="click">send</button>
            <input type="text" v-model="msg">
        </div>
    </template>
    <!-- 本地 -->
    <script src="./vue2.6.14.js"></script>
    <script>
        // 注册父组件
        Vue.component('parent', {
            template: `<div>
            <child @childFn="transContent"></child> <!--  parent组件 里面的 child组件 -->
            子组件传来的值:{{msg}}
        </div>`,
            data() {
                return {
                    msg: ''
                }
            },
            methods: {
                transContent(childMsg) {
                    this.msg = childMsg
                    console.log(this.msg);
                }
            }
        });
        // 注册子组件
        Vue.component('child', {
            template: '#tmpChild',
            data() {
                return {
                    msg: '子组件中的消息'
                }
            },
            methods: {
                click() {
                    this.$emit('childFn', this.msg);
                    console.log(this.msg);
                }
            }
        });
       // 实例 vue
       let vm = new Vue({el: '#app'});
    </script>
</body>

img


  • 写回答

4条回答 默认 最新

  • 几何心凉 2022年度博客之星前端领域TOP 1 2022-06-08 09:15
    关注

    题主您好,按照你的方法你可以将this.$emit('childFn', this.msg);替换成this.$emit('childfn', this.msg);就可以了,原因很简单 v-on 事件监听器在 DOM 模板中会被自动转换为全小写 (因为 HTML 是大小写不敏感的),所以 @childFn 将会变成 v-on:childfn ——导致 childFn不可能被监听到。

    或者我们也可以直接将this.$emit('childFn', this.msg);替换成tthis.$parent.transContent();也可以实现;直接调用父组件的方法

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月8日

悬赏问题

  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题