Vue组件传参prop向下传递、emit向上传递指南

 更新时间:2026年07月01日 09:21:12   作者:富士康质检员张全蛋  
这段文章详细解释了Vue.js中父子组件间数据传递的方式,包括prop向下传递数据和通过emit事件向上传递数据,重点介绍了如何使用props属性和v-bind指令进行数据传递,以及如何利用自定义事件emit实现父子组件间的交互

组件传参

学习了组件用法,就像一种嵌套引用关系,在这个关系中,经常会涉及相互传数据的需求,即父组件传子组件,子组件传父组件。

父、子组件的关系可以总结为: prop向下传递(和事件无关)emit事件(包含事件)向上传递。

比如子组件导入到父组件页面中的某个位置,那么就说明子组件有些功能。但是在父组件里面有些数据需要传递到子组件功能里面,子组件才能去做一些事情。同理子组件传递给父组件。

如下图所示: 所有的组件组成了完整的页面,但是组件里里面的数据与组件之间的数据是相互进行数据传递的。(组件之间存在着相互引用,这就存在了父子关系)

有时候子组件页面的展示,展示什么样的内容是由父组件决定的,这时候父组件给子组件传参的时候就需要通过参数告诉子组件需要展示什么样的内容。

父组件里面:<HelloWorld msg="Welcome to Your Vue.js App"/>
--------------------------------------------------------------------
子组件里面:
<script>
export default {
  name: 'HelloWorld',
//父组件App.vue传给子组件HelloWorld的数据
//谁使用了这个页面就给这个组件传值
  props: {
    msg: String
  }
}
</script>

//然后将要传递的值放在template里面的h1里面去做展示
<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
  </div>
</template>

HelloWorld这个组件(页面),它的标题是由父组件App.vue来决定内容的。

 <HelloWorld msg="父亲组件App 子组件HelloWorld"/>

props 接受父组件传递过来的

先去子组件里面定义props,在props里面定义要向下传递的数据content,然后就可以在该组件里面去使用这个数据了(谁使用这个组件,就得给这个组件传值

任何数据都可以传递过去,content: String,content: Array,content: Object   如果是数组该用v-for指令去遍历就去遍历

<template>
    <div>
        <button type="button" @click="btn()">TestVue</button><br>
        {{ content }}
    </div>    
</template>


<script>
//这里不使用vue2的语法
export default ({
    //定义父组件传递给子组件的数据,属性名字为content,类型为string
    data() {
        return{
        }
    },
    methods:{
        //在js当中使用props数据
        btn(){
            alert("content内容为:" + this.content)
        }
    },
    props:{
        content: String,
    }
})
</script>

然后去父亲组件里面定义要传递的数据。 

<template>
  <img alt="Vue logo" src="./assets/logo.png">
  <Test content="父亲组件App 子组件Test"></Test>
  <HelloWorld msg="父亲组件App 子组件HelloWorld"/>
</template>

上面就是父传子的一个方式,有点像定义了一个标签,然后将属性传递进去,这个属性在子组件里面可以放在模板里面使用或者放在script里面使用都行。

v-bind的方式传参:这样可以通过动态绑定的方式传递进去,子组件可以使用父组件的数据,相当于子组件参数就是父组件里面的html标签的属性。

<template>
  <img alt="Vue logo" src="./assets/logo.png">
  <HelloWorld/>
  <Test :msgTest="inputresult"></Test>
  <div>
    <input v-model="inputresult">
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'
import Test  from './components/Test.vue'
export default {
  name: 'App',
  components: {
    HelloWorld,
    Test
  },
  data(){
    return{
      inputresult: ""
    }
  }
}
</script>



<template>
   <div class="box">{{ msgTest }}</div>
</template>



<script>
  export default {
    data(){
      return {

      }
    },
    props:{
      msgTest: String
    }
  }
</script>


<style scoped>
   .box{
       width: 100px;
       height: 100px;
       background-color: cadetblue;
   }
</style>

emit 子传父  通过事件传递

如果子组件里面的数据发生了变化,父组件要拿到变化的数据,这怎么办?

在子组件里面定义好emit事件名称,在父组件里面使用v-on进行接收。接受的是一个方法,方法并且不能使用括号。

这里的事件名称自定义即可,之前大部分事件都是内置的click keybord:enter这种事件,现在可以在子组件里面去定义自己的事件了。

如果你要监听很多数据,可以将这些数据放在一个对象里面统一做处理。

<template>
    <div>
        <button type="button" @click="btn()">子传父按钮</button><br>
    </div>    
</template>


<script>
//这里不使用vue2的语法
export default ({
    //定义父组件传递给子组件的数据,属性名字为content,类型为string
    data() {
        return{

        }
    },
    methods:{
        btn(){
            //vue自带的emit事件,将数据传递给父组件
            //第一个参数是事件名,第二个参数是数据名称
            this.$emit('childEvent',"子组件事件childEvent传来的数据")
        }
    },
    props:{

    }
})
</script>

在父组件里面定义事件@childEvent对应的处理receive方法

<template>
  <img alt="Vue logo" src="./assets/logo.png">
  <!--监听子组件childEvent事件,绑定receive方法接受子组件传过来的参数,
    然后就是赋值操作,赋值完之后在模板里面显示
  -->
  <Test @childEvent="receive"></Test><br>
  <p style="color:brown">子组件Test传来的数据:{{ TestMsg }}</p>
  <HelloWorld  msg="父亲组件App 子组件HelloWorld" />
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  components: {
    HelloWorld
  },
  data(){
    return{
      TestMsg: ''
    }
  },
  methods:{
    receive(data){
      alert(data)
      this.TestMsg = data
    }
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

总结

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

相关文章

  • 深入理解Vuex的作用

    深入理解Vuex的作用

    这篇文章主要介绍了深入理解Vuex的作用,对Vuex感兴趣的同学,可以参考下
    2021-05-05
  • Vue中组件的数据共享分析讲解

    Vue中组件的数据共享分析讲解

    本文章向大家介绍vue组件中的数据共享,主要包括vue组件中的数据共享使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下
    2022-12-12
  • vue3 中 computed 新用法示例小结

    vue3 中 computed 新用法示例小结

    这篇文章主要介绍 vue3 中 computed 的新用法,对比 vue2 中的写法,让您快速掌握 vue3 中 computed 的新用法,对函数式写法,options 写法相关知识感兴趣的朋友一起看看吧
    2021-11-11
  • 解决vue2+vue-router动态路由添加及路由刷新后消失问题

    解决vue2+vue-router动态路由添加及路由刷新后消失问题

    这篇文章主要介绍了解决vue2+vue-router动态路由添加及路由刷新后消失问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 浅谈vuex为什么不建议在action中修改state

    浅谈vuex为什么不建议在action中修改state

    这篇文章主要介绍了浅谈vuex为什么不建议在action中修改state,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Vue 3.0中jsx语法的使用

    Vue 3.0中jsx语法的使用

    这篇文章主要介绍了Vue 3.0 中 jsx 语法使用,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下
    2020-11-11
  • vue中实现子组件相互切换且数据不丢失的策略详解

    vue中实现子组件相互切换且数据不丢失的策略详解

    项目为数据报表,但是一个父页面中有很多的子页面,而且子页面中不是相互关联,但是数据又有联系,所以本文给大家介绍了vue中如何实现子组件相互切换,而且数据不会丢失,并有详细的代码供大家参考,需要的朋友可以参考下
    2024-03-03
  • vue的diff算法知识点总结

    vue的diff算法知识点总结

    本篇文章给大家分享了关于vue的diff算法的相关知识点总结,有兴趣的朋友参考学习下。
    2018-03-03
  • vue项目中路由跳转页面不变问题及解决

    vue项目中路由跳转页面不变问题及解决

    这篇文章主要介绍了vue项目中路由跳转页面不变问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Vue事件修饰符native、self示例详解

    Vue事件修饰符native、self示例详解

    这篇文章主要给大家介绍了关于Vue事件修饰符native、self的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07

最新评论