vue 父子组件相互传递数据

一 . v-model

v-model可以实现数据的双向绑定,v-model只是语法糖,真正的实现形式:

<input type="text" :value="message" @input="message = $event.target.value">

1.将输入框绑定到message变量上,这只是单向的,改变message的值可以改变input的value,但是改变input的输入不会改变message

2.监听input事件,当输入类内容为不同的输入元素使用不同的属性并抛出不同的事件。

例如:text和textarea元素使用value属性和input事件,checkbox和radio使用checked和change事件,select使用value和change事件。

 

通过上述分析,默认情况下,一个组件上的v-model会把value用作prop且把input用作event。所以当我们在一个自定义组件上使用v-model并不能实现双向绑定,因为自定的组建并没有默认的value和input事件。在使用时,我们需要按照上面那样显示的去声明定义这些东西,可以在定义组件的时候,制定prop的值和监听的事件。

在子组件中:

   // 子组件
    model: {
        prop: 'uname',
        // 随便命名事件,对应下面$emit即可
        event: 'changeXXX'
    },
    props:{
       uname:{
          default:'',
          type:String
       }
    },
    methods: {
        updateVal(val){
        // 修改数据传递给父组件
this.$emit('changeXXX',val) } // 父组件 / name是父组件中的属性 <子组件 v-model="name" ></子组件>

等价于

<子组件 :uname='name' @changeXXX='val => {foo = val}' value='some value'></子组件>

 

二.  .sync修饰符

使用.sync修饰符可以直接将父组件中的数据传递给子组件,并子组件修改数据来改变父组件的状态

//父组件将age传给子组件并使用.sync修饰符。
<MyFooter :age.sync="Fage"></MyFooter>
//子组件
props:['age'],
mounted () { console.log(this.$emit('update:age',1234567)); }

 

三. provide和inject : 跨级访问父组件的数据

他们是配合使用的,provide将父组件中的数据传递给下级,inject在需要子组件或孙组件中注入数据。

通过该方法可以实现跨级访问父组件的数据。

// 父组件 正常引入子组件
  provide() {
    return {
      send: this.val, // 传给子组件
      value: this.data // 传给孙组件
    }
  }

// 子组件

inject: ['send']

// 孙组件
inject: ['value'],

 

四. $attrs

中间件

$attrs其实就是多级组件中的props,他就像一个中间组件,用来传递爷组件给孙组件的数据,使用的时候只需要给父组件的孙组件配置 v-bind=“$attrs”,然后再爷组件中传入孙组件所需的数据,孙组件正常接收。

//父组件
<template>
  <div>
    <Child  :val="val" />
  </div>
</template>
import Child from './child.vue';
export default {
  components: { Child },
  data() {
    return {
      val: '父组件的data'
    }
  }


// 子组件
<template>
  <div>
    <SunChild v-bind="$attrs" />
  </div>
</template>
<script>
import SunChild from './sunChild.vue';
export default {
  components: { SunChild },
}


// 孙组件
<template>
  <div>
    孙子组件--{{val}}
  </div>
</template>
<script>
export default {
  props: ['val'],
}

 

posted @ 2021-12-02 15:19  小黄花呐  阅读(385)  评论(0编辑  收藏  举报