vue2 组件传参小结

本文详细介绍了Vue中父组件向子组件传递数据的props、通过refs调用子组件方法,以及子组件通过自定义事件$emit与父组件通信的方式。同时提到了事件中心(eventBus)的概念,用于在不同组件间无层级地传递事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.父组件向子组件传参:自定义属性,props

例子:在页面中,子组件需要拿到父组件里面的数据使用

父组件代码

```父组件```
<template>
  <div>
    <!-- 这是父组件 -->
    <h1>我是父组件</h1>
    <br/>
    <div>
      <!-- 使用子组件 -->
      <child :message="message" :num="4"></child>
    </div>
  </div>
</template>

<script>
// 引入子组件
import child from './child.vue'
export default {
  // 注册子组件
  components: { child },
  comments: {
    child
  },
  data () {
    return {
      message: '我是父组件的数据'
    }
  },
  methods: {},
  mounted () {}
}
</script>

<style lang="scss" scoped>

</style>

子组件代码

```子组件代码```
<template>
  <div>
    <!-- 这是子组件 -->
    <h1>我是子组件</h1>
    <div>子组件中父组件传过来的数据message: {{ message }}; num: {{ num }}</div>
  </div>
</template>

<script>
export default {
  // props接收父组件传递的参数
  props: {
    message: {
      type: String,
      default: ''
    },
    num: {
      type: Number || String,
      default: 0
    }
  }
}
</script>

<style lang="scss" scoped></style>

 效果图

2.父组件向子组件传参:refs

例子:例如列表的新增页面有很多的tab页,每个页面都有提交和保存的按钮,这个时候我通常将这些固定按钮写在父组件,具体页面内容以子组件的形式引入,但是按钮提交前会对页面内容进行校验,在这种情况下,通常由父组件调用子组件的校验规则来进行校验,this.$refs可以获取子组件的实例,调用子组件的方法

通过给引入的子组件添加ref属性,通过this.refs.children可以获取子组件的实例,调用子组件的方法,将需要传递的参数在方法里面传过去,子组件接收就可以了,通过触发某个事件进行传参

父组件

<template>
  <div>
    <!-- 这是父组件 -->
    <h1>我是父组件</h1>
    <h2>childData:{{ childData }}</h2>
    <el-button type="primary" @click="handdleClick">按钮</el-button>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <div>
      <!-- 使用子组件 -->
      <child :message="message" :num="4" ref="children"></child>
    </div>
  </div>
</template>

<script>

// 引入子组件
import child from './child.vue'
export default {
  // 注册子组件
  components: { child },
  comments: {
    child
  },
  data () {
    return {
      message: '我是父组件的数据',
      editQuery: {
        str: '数据1',
        boll: true
      },
      childData: 0
    }
  },
  methods: {
    // 通过给引入的子组件添加ref属性,通过this.refs.children可以获取子组件的实例,调用子组件的方法,将需要传递的参数在方法里面传过去,子组件接收就可以了,通过触发某个事件进行传参
    handdleClick () {
      // 不需要拿到子组件的返回值
      this.$refs.children.getValue(this.editQuery)
      // 需要拿到子组件的返回值在处理
      const childData = this.$refs.children.getValue(this.editQuery)
      this.childData = childData
    }
  },
  mounted () {}
}
</script>

<style lang="scss" scoped>

</style>

子组件

<template>
  <div>
    <!-- 这是子组件 -->
    <h1>我是子组件</h1>
    <div>子组件中父组件传过来的数据message: {{ message }}; num: {{ num }}</div>
    <br/>
    <div>
      我是父组件通过refs传过来的数据:str:{{ query.str }}; Boll: {{ query.boll }}
    </div>
  </div>
</template>

<script>
export default {
  // props接收父组件传递的参数
  props: {
    message: {
      type: String,
      default: ''
    },
    num: {
      type: Number || String,
      default: 0
    }
  },
  data () {
    return {
      query: {
        str: '',
        boll: false
      }
    }
  },
  methods: {
    // 父组件调用的子组件的方法,val为父组件传递的参数,方法可以有返回值,父组件可以接收返回值,例如return 1,父组件则可以接收到返回值为1
    getValue (val) {
      this.query = val
      return 1
    }
  }
}
</script>

<style lang="scss" scoped></style>

 

3.父组件像子组件传参:$children,$parent

当需要拿到所有子组件的时候才会通过this.$children,返回的是一个存放所有子组件的数组,很少用到

this.$parent获取当前组件的父组件,很少用到就不举例子了

4.子组件向父组件传参: 自定义事件,emit

当一个页面中,子组件的数据改变了,需要吧这个数据同步到父组件中使用,可以使用自定义事件与this.$emit来实现,例子:假设一个页面有两块组成,父组件和子组件,父组件为具体内容,可以修改,子组件为审批的流程组件,当我们修改了父组件中的数据,想通过审批页面的按钮来保存的时候,通常就会用到this.$emit,点击子组件中的审批按钮,在其方法里面调用this.$emit的方法来调用父组件的数据需改的方法。

父组件

<template>
  <div>
    <!-- 这是父组件 -->
    <h1>我是父组件</h1>
    <h2>childData:{{ childData }}</h2>
    <el-button type="primary" @click="handdleClick">按钮</el-button>
    <div>子组件传递过来的数据 {{ arr }}</div>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <div>
      <!-- 使用子组件 -->
      <!-- getData为自定义事件 -->
      <child :message="message" :num="4" ref="children" @getData="getData"></child>
    </div>
  </div>
</template>

<script>

// 引入子组件
import child from './child.vue'
export default {
  // 注册子组件
  components: { child },
  comments: {
    child
  },
  data () {
    return {
      message: '我是父组件的数据',
      editQuery: {
        str: '数据1',
        boll: true
      },
      childData: 0,
      arr: []
    }
  },
  methods: {
    // 通过给引入的子组件添加ref属性,通过this.refs.children可以获取子组件的实例,调用子组件的方法,将需要传递的参数在方法里面传过去,子组件接收就可以了,通过触发某个事件进行传参
    handdleClick () {
      // 不需要拿到子组件的返回值
      this.$refs.children.getValue(this.editQuery)
      // 需要拿到子组件的返回值在处理
      const childData = this.$refs.children.getValue(this.editQuery)
      this.childData = childData
    },
    // 子组件调用父组件的自定义方法
    getData (val) {
      this.arr = val
    }
  },
  mounted () {}
}
</script>

<style lang="scss" scoped>

</style>

子组件

<template>
  <div>
    <!-- 这是子组件 -->
    <h1>我是子组件</h1>
    <div>子组件中父组件传过来的数据message: {{ message }}; num: {{ num }}</div>
    <br/>
    <div>
      我是父组件通过refs传过来的数据:str:{{ query.str }}; Boll: {{ query.boll }}
    </div>
    <br/>
    <el-button @click="approve">审批按钮</el-button>
  </div>
</template>

<script>
export default {
  // props接收父组件传递的参数
  props: {
    message: {
      type: String,
      default: ''
    },
    num: {
      type: Number || String,
      default: 0
    }
  },
  data () {
    return {
      query: {
        str: '',
        boll: false
      },
      strData: [1, 2, 3]
    }
  },
  methods: {
    // 父组件调用的子组件的方法,val为父组件传递的参数,方法可以有返回值,父组件可以接收返回值,例如return 1,父组件则可以接收到返回值为1
    getValue (val) {
      this.query = val
      return 1
    },
    // 审批
    approve () {
      // 调用父组件的自定义方法,第二个参数为传递的参数
      this.$emit('getData', this.strData)
    }
  }
}
</script>

<style lang="scss" scoped></style>

 

 

5.事件中心总线:eventBus(不考虑组件层级)

1.定义
import Vue from 'vue'
 
// main.js 中
 
// 第一种定义方式
Vue.prototype.$eventBus = new Vue()
 
 
// 第二种定义方式
window.eventBus = new Vue();


2.触发事件
//使用方式一定义时
// params 多个参数
this.$eventBus.$emit('eventName', param1,param2,...)
 
 
//使用方式二定义时
eventBus.$emit('eventName', param1,param2,...)


3.监听事件

//使用方式一定义时
this.$eventBus.$on('eventName', (param1,param2,...)=>{
    //需要执行 逻辑代码
    // params 多个参数
})
 
 
//使用方式二定义时
eventBus.$on('eventName', (param1,param2,...)=>{
    //需要执行 逻辑代码
})


4.移除事件
//使用方式一定义时
this.$eventBus.$off('eventName');
 
//使用方式二定义时
eventBus.$off('eventName');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值