vue中的$parent和$child

在 Vue 中, $parent 表示当前组件的父组件实例,而 $children 表示当前组件的直接子组件实例集合(是一个无序的数组)。
 
通过 $parent ,子组件可以访问父组件的属性和方法。例如在子组件的方法中,可以使用 this.$parent.xxx 来获取父组件的属性或调用父组件的方法。
 
而父组件可以通过 $children 来获取子组件的实例,从而访问子组件的属性或调用子组件的方法。但需要注意的是, $children 并不保证顺序,也不是响应式的。如果要获取特定子组件的属性或调用方法,通常更好的做法是使用 $refs 。
 
以下是一个示例,展示了父组件向子组件传值,以及子组件调用父组件方法的过程:
 
父组件:
 
<template>
  <div>
    <h1>父组件</h1>
    <h-child></h-child> 
  </div>
</template>

<script>
// 引入子组件
import HChild from './HChild.vue' 
export default {
  name: 'Parent',
  components: {
    HChild
  },
  data() {
    return {
      msg: 'data from parent' 
    }
  },
  methods: {
    fun() {
      console.log('parent fun') 
    }
  }
}
</script>
 
 
子组件:
 
<template>
  <div>
    <h1>子组件</h1>
    <button @click="showParent">调用父组件的数据和方法</button> 
  </div>
</template>

<script>
export default {
  name: 'HChild',
  methods: {
    showParent() {
      // 获取到所有的子组件
      console.log(this.$parent) 
      // 获取指定子组件中的指定数据
      console.log(this.$parent.msg) 
      // 调用子组件的方法
      this.$parent.fun() 
    }
  }
}
</script>
 
 引入子组件的过程:
 
要引入子组件,首先需要在父组件的选项中进行声明。例如,使用  import  语句导入子组件,并在  components  选项中注册子组件:
 
import ChildComponent from './ChildComponent.vue'; 

export default {
  name: 'ParentComponent',
  components: {
    ChildComponent 
  },
  // 其他组件选项
}
 
 
然后,就可以在父组件的模板中使用  <ChildComponent>  标签来插入子组件了:
 
<template>
  <div>
    <!-- 使用子组件 -->
    <ChildComponent /> 
  </div>
</template>
 
另外,在 Vue 中还有一些方法可以在父组件中访问子组件或在子组件中访问父组件,比如使用  $refs 、 $parent  等。
 
 $refs  通常用于在父组件中直接操作子组件的实例,可以给子组件添加  ref  属性,然后通过  this.$refs.refName  来访问子组件。
 
而  $parent  则可以让子组件访问其父组件的实例。但需要注意的是,尽管可以这样访问,在实际开发中应尽量避免子组件直接依赖父组件的数据,因为这可能会导致组件之间的耦合度过高,不利于代码的维护和复用。
 
同时, $children  也可以获取子组件的集合,但它不是响应式的,且不保证顺序,使用时需要注意这些限制。并且,在 Vue 3 中已不推荐使用  $children ,更建议使用  $refs  来获取子组件实例。
 
例如,在父组件中通过  $refs  访问子组件的方法:
 
父组件模板:
 
<template>
  <div>
    <ChildComponent ref="childRef" /> 
  </div>
</template>
 
 
父组件脚本:
 
export default {
  methods: {
    callChildMethod() {
      this.$refs.childRef.childMethod(); // 调用子组件的方法
    }
  }
}
 
 
子组件:
 
javascript  复制
export default {
  methods: {
    childMethod() {
      // 子组件的方法
    }
  }
}

在上述示例中,子组件通过 this.$parent 获取到父组件实例,进而访问父组件的 msg 属性和 fun 方法。
 
需注意,尽量避免过度使用 $parent 和 $children 来进行组件通信,因为这样会增加组件之间的耦合性。在实际开发中,根据具体的需求和场景,可以选择更合适的通信方式,例如 props 传递、自定义事件、使用 Vuex 状态管理等。这些方式可以使组件之间的关系更加清晰、可维护性更高。同时,在钩子函数 mounted 中无法获取到父组件中的数据和方法。

如果换成$refs

以下是一个使用  $refs  在 Vue 中获取子组件属性或调用子组件方法的示例代码:
 
父组件:
 
<template>
  <div>
    <h1>父组件</h1>
    <child-component ref="childRef"></child-component> 
    <button @click="callChildMethod">调用子组件方法</button>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  name: 'ParentComponent',
  components: {
    ChildComponent
  },
  methods: {
    callChildMethod() {
      // 通过 $refs 调用子组件的方法
      this.$refs.childRef.childMethod();
    }
  }
}
</script>
 
 
子组件  ChildComponent.vue :
 
<template>
  <div>
    <h2>子组件</h2>
  </div>
</template>

<script>
export default {
  name: 'ChildComponent',
  methods: {
    childMethod() {
      console.log('子组件方法被调用');
    }
  }
}
</script>
 

 

 

 

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值