vue组件之间传值的几种方式

2023年1月2日10:56:12

vue组件传值

父子组件之间传值。几种常见方式

vue组件之间传值的几种方式

第一种方式(父传子)

父组件

<m-child :childMsg="parentMsg"></m-child>
//在父组件中的子组件<m-child>上面绑定一个msg,此时已经把父组件的值绑定在子组件上
data(){
	return{
		//父组件的数据
		parentMsg:[]
	}
}

注意:数据绑定的时候记得加 如果后面的数据是字符串则不用加 双引号 如果实在要加 的时候写法 :msg=“‘i am item’” ,因为 :msg 默认把后面的识别变量,所以后面记得在字符串里面单引号,直接msg默认是字符串,后面不用加

子组件(mChild)
通过子组件props属性继承父组件的值,在通过渲染模板渲染出来{{msg}}

<p>{{childMsg}}</p>
props:{
	childMsg:{
		type:String,  //类型可以定义
		default:''  //默认是空值
		// type:Object,  default () {return {}}
	}
}

第二种方法(子传父)

简单说明一下思路,虽然很绕但很好理解,多琢磨几次,
子传父通过事件方法来传值,首先在子组件定义一个方法,当方法执行的时候调用this.$emit('自定义的方法名','要给父组件的值')的方法来提交值,在通过父组件中的子组件通过v-on或者@来绑定刚才的方法,当这个方法执行的时候后面会触发另外一个方法,在这个方法中的第一个参数就是传过来的值,然后可以处理这个值

父组件

<p>{{msg}}</p>
//将父组件中的子组件标签绑定事件,@子给父的事件=父组件中的事件
<m-child @childFnGetParent="parentFn"></m-child>
data(){
	return {
		mag:''
	}
}
methods:{
//自定义父组件的方法,val就是子给父的值,第一个参数
	parentFn(val){
	//让父组件中的数据等于子给父的,这样msg就是传过来的值
		this.msg=val
	}
}

子组件(mChild)

<button @click="childFn">

methods:{
	childFn(){
	//自定意见$emit,传给父组件的事件名跟值
		this.$emit("childFnGetParent",'要传入的值')
	}
}

父传子第二种方法($children/ $parent)

这种方法就不多解释了,挺容易理解的,实在不理解可以打印this.

c

h

i

l

d

r

e

n

/

t

h

i

s

.

children/this.

children/this.parent 就可以获取到信息

mounted(){
	this.$children/this.$parent //获取子组件或者父组件的组件信息
}

父传子的第三种方法(ref)
在父组件中的子组件m-child中添加一个ref=“事件名“

<button @click='togo'>
<m-child ref="childFn"></m-child>
mounted(){
	//这种是可以通过方法来取得子组件的值
	toGo() {
		//得到的就是childFn这个子组件,childFn相当于组件名,假如这个组件中有data数据
		//则写法就是this.$refs.childFn.data,而子组件无非就是定义数据即可
			console.log('我是接受参数的', this.$refs.childFn);
		}

	this.$refs.childFn
}

这种方式跟第二种相似只不过他自己起了个事件名,方便查找

非父子组件传值

传值思想其实是一致的,先使用$on定义一个全局事件,后面写个回调函数,触发这个事件执行的方法,可以接参数bus.$on('msg',val=>{ }),msg就是全局事件,然后在想要获取这个全局事件里面的值就调用他,不过这时候不是 this.

e

m

i

t

b

u

s

.

emit 而是 bus.

emitbus.emit

  • 事件总线
    首先创建一个公共文件夹 util
    其次在创建一个js文件 例如bus.js

bus.js下面的代码

import Vue from 'vue'
export default new Vue()

这是两个组件传值,在互相传值各组件中引入bus.js文件
import bus from "../bus.js"
在A组件中通过$emit调用自定义函数并且传参


	<template>
  <div>
    A组件:
    <span>{{elementValue}}</span>
    <input type="button" value="点击触发" @click="elementByValue">
  </div>
</template>
<script>
  // 引入公共的bug,来做为中间传达的工具
  import Bus from './bus.js'
  export default {
    data () {
      return {
        elementValue: 4
      }
    },
    methods: {
      elementByValue: function () {
        Bus.$emit('val', this.elementValue)
      }
    }
  }
</script>

B组件 用$on事件来接收参数

<template>
  <div>
    B组件:
    <input type="button" value="点击触发" @click="getData">
    <span>{{name}}</span>
  </div>
</template>
<script>
  import Bus from './bus.js'
  export default {
    data () {
      return {
        name: 0
      }
    },
    mounted: function () {
      var vm = this
      // 用$on事件来接收参数
      Bus.$on('val', (data) => {
        console.log(data)
        vm.name = data
      })
    },
    methods: {
      getData: function () {
        this.name++
      }
    }
  }
</script>

只是全局组件传值,单个组件调用

然后在所有需要用到这个文件下面的数据只需要导入这个文件就行

APP.vue下面定义一个方法

//全局中定义的方法名
methods:{
	passMsg(){
	//注意这里的写法 
		bus.$emit('msg','要传入的数数据')//自定义事件都用emit
	}
}
//子组件利用勾子函数监听事件
mounted(){
	bus.$on('msg',(val)=>{
		
	})
}
注意的是 在页面销毁的时候需要吧bus销毁掉
 destroyed() {
    bus.$off("child2", this.destroyedMessage);
  }
  • $ attrs / listeners
    解决多级组件间传值的问题

attrs

App.vue下面定义数据并且把想要的数据全部绑定到相应的子组件上面
然后在在其父组件上面绑定一个v-bind=‘$attrs’ 注意这里不能简写,如果本身有的数据跟vue的数据名相同时,他会自动过滤

listeners

是通过监听事件来实现的

provide 和 inject 传值

用于祖先与后代传值
这篇文章也不错后面的几种传值方式这里面有详解

  • 作者:小菜鸟学代码··
  • 原文链接:https://blog.csdn.net/weixin_48255917/article/details/109615043
    更新时间:2023年1月2日10:56:12 ,共 2852 字。