Vue中的父子组件传值及传方法

 更新时间:2023年11月18日 09:29:14   作者:Cherry☼  
这篇文章主要介绍了Vue中的父子组件传值及传方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

传值

父组件传值给子组件

// 父组件
<template>
    <div>
        <!-- 父组件中引入子组件,并传入子组件内需要的值 -->
        <child :message="father"></child>
    </div>
</template>
<script>
    import child from './child'
    export default {
        data() {
            return {
                //定义需要传入的值
                father: '传给子组件的值'
            }
        },
        components: {
            child
        }
    }
</script>


// 子组件
<template>
    <div>
        <div>{{message}}</div>
    </div>
</template>
<script>
    export default {
        //在子组件中注册props,并使用父组件中传递过来的数据
        props: {
            message: String
        },
    }
</script>

子组件传值给父组件

// 父组件
<template>
    <div>
    <!--自定义事件child,事件名为parent(parent事件用于接收子组件传递过来的值)-->
        <parent @child="parent"></parent >
    </div>
</template>
<script>
    export default {
        data: {
            message: ''
        },
        methods: {
            parent(val) {
                this.message = val;
            }
        }
    }
</script>

// 子组件
<template>
    <div>
    <!--点击按钮触发send事件,把message传给父组件-->
        <button @click="send">Send</button>
    </div>
</template>

<script>
export default {
    data() {
        return {
            message: '我是子组件的消息'
        }
    },
    methods: {
        sendMes() {
            this.$emit('child', this.message);
        }
    }
}
</script>

调用方法

父组件调用子组件的方法

// 父组件
<template>
  <div @click="handleParent">
    <children ref="mychild"></children>
  </div>
</template>

<script>
  import children from 'children.vue'
  export default {
    components: {
      children
    },
    methods:{
      handleParent() {
        this.$refs.mychild.childMethod();
      }
    }
  }
</script>

// 子组件
<template>
  <div></div>
</template>

<script>
  export default {
    methods:{
      childMethod() {
        console.log('My name is child')
      }
    }
  }
</script>

子组件调用父组件的方法

// 父组件
<template>
  <div>
       <child @listenChild="showFrom"></child>
       <div>{{ value }}</div>
  </div>
</template>

<script>
import child from './compontents/child.vue'
export default {
    components:{child},
    data () {
        return {
        value:''
        }
    },
    methods: {
        showFrom(data){
            this.value = data
        },
    }
}
</script>

//子组件
<template>
  <button @click="send()">
     我是子组件,点击我向父组件传值
  </button>
</template>

<script>
  export default {
    data(){
      return {
        message:'子组件的数据'
      }
    },
    methods:{
      send() {
        this.$emit("listenChild",this.message)
      }
    }
  }
</script>

非父子组件

广播自定义事件

handleClick(){
    //response为要传的值
    this.$root.$emit('change',response)
}

处理自定义事件

handleClick(){
    this.$root.$on('change',(item)=>{
        console.log(item) //item就是广播事件的response
    })
}

有时候会发生事件只被 emit 触发了一次,但是回调函数却被执行了多次的现象。这种现象往往发生在页面跳转退出后重新进入的时候。

产生原因:

this.root.Bus.root.Bus. root.Bus.on 实际是向 Bus 容器中添加一个事件监听器,当页面跳转时,原来的 vue 组件被注销,但是原来 vue 组件向 Bus 容器中添加的事件监听器并不会被移除。

因此,当下次进入这个 vue 组件对应的页面时,执行到 this. root.Bus.root.Bus. root.Bus.on 时,又会向 Bus 容器中添加一个重复的事件监听器,以此类推,导致 Bus 容器中有很多个一模一样的事件监听器,从而导致事件只被触发一次,但是回调函数被执行多次的现象。

解决方案:

在 vue 组件的 beforeDetory 钩子函数中将本 vue 组件往 Bus 容器中添加的时间监听器全部手动移除。

//在vue对象的methods域中定义个函数专门移除事件监听器
offListener() {
    this.$root.Bus.off("事件名");
    this.$root.Bus.off("事件名");
    this.$root.Bus.off("事件名");
},

//在beforeDestroy钩子中调用此函数
beforeDestroy() {
    this.offListener();
},

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue中axios封装使用的完整教程

    vue中axios封装使用的完整教程

    这篇文章主要给大家介绍了关于vue中axios封装使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • vue3中$refs的基本使用方法

    vue3中$refs的基本使用方法

    在Vue中一般很少会用到直接操作DOM,但不可避免有时候需要用到,这时我们可以通过ref和$refs这两个来实现,下面这篇文章主要给大家介绍了关于vue3中$refs的基本使用方法,需要的朋友可以参考下
    2022-03-03
  • Ant Design Vue resetFields表单重置不生效问题及解决

    Ant Design Vue resetFields表单重置不生效问题及解决

    这篇文章主要介绍了Ant Design Vue resetFields 表单重置不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 详解在vue-cli项目中使用mockjs(请求数据删除数据)

    详解在vue-cli项目中使用mockjs(请求数据删除数据)

    本篇文章主要介绍了在vue-cli项目中使用mockjs(请求数据删除数据),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • vue el-upload上传文件的示例代码

    vue el-upload上传文件的示例代码

    这篇文章主要介绍了vue el-upload上传文件的示例代码,帮助大家更好的理解和使用vue,感兴趣的朋友可以了解下
    2020-12-12
  • Vue判断字符串(或数组)中是否包含某个元素的多种方法

    Vue判断字符串(或数组)中是否包含某个元素的多种方法

    在我们前端日常开发中经常会遇到判断一个字符串中是否包含某个元素的需求,下面这篇文章主要给大家介绍了关于Vue判断字符串(或数组)中是否包含某个元素的多种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • vue中的循环遍历对象、数组和字符串

    vue中的循环遍历对象、数组和字符串

    这篇文章主要介绍了vue中的循环遍历对象、数组和字符串,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • vue登录注册实例详解

    vue登录注册实例详解

    在本篇内容里小编给大家分享的是关于vue登录注册的相关实例内容以及写法分析,有需要朋友们可以学习下。
    2019-09-09
  • VueJS页面渲染之后如何调用函数

    VueJS页面渲染之后如何调用函数

    这篇文章主要介绍了VueJS页面渲染之后如何调用函数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • vue中provide、inject的使用方法案例详解

    vue中provide、inject的使用方法案例详解

    本教程是介绍如何在vue中使用provide和inject,在 Vue 中,provide 和 inject 是用于实现祖先组件向后代组件传递数据的一种方式,对vue中provide、inject的使用方法感兴趣的朋友一起看看吧
    2024-02-02

最新评论