_
2023/8/31 08:27:411025

在这节课开始之前我们来看考虑一个问题,在多级组件中我们如何来跨级传值。

按照目前我们学习的传值方式可以使用props,但是props只能给子组件传值,如果我们需要从父组件跨级传值给子孙级组件的话,需要一级一级的传递。

就比如下面这个图示:

我们按照上图所示的方式来写代码尝试一下

<script>
  const app = Vue.createApp({
    data() {
      return {
        message: "hello world!"
      }
    },
    template: `<div>
        <child/>
    </div>`
  })

  app.component('child',{
      template:`
        <div>footer子组件</div>
        <deepChild/>
      `
  })

  app.component('deepChild',{
    template:`<div>deepChild孙子级组件</div>`
  })

  const vm = app.mount("#app")
</script>

我们写了两个组件,chid是子组件,deepChild是chid的子组件也就是根组件的孙子级组件。那现在我们想在根组件中传递值给deepChild孙子组件,我们需要先把值传递给chid然后再传递给deepChild。

<script>
  const app = Vue.createApp({
    data() {
      return {
        message: "hello world!"
      }
    },
    template: `<div>
        <child :msg="message"/>
    </div>`
  })

  app.component('child',{
      props:['msg'],
      template:`
        <div>footer子组件</div>
        <deepChild :msg="msg" />
      `
  })

  app.component('deepChild',{
    props: ['msg'],
    template:`<div>deepChild孙子级组件<br>根组件给我传递的msg:{{msg}}</div>`
  })

  const vm = app.mount("#app")
</script>

这样逐级传递,非常的麻烦,如果我们的组件嵌套得更多,更深的话,以这样的方式传递数据的话,想想就要命,维护起来也麻烦,简直就是屎山代码。

provide和inject多级组件传值

vue为我们提供了provide和inject来实现多级组件传值。如下图所示我们可以在根组件里面使用Provde提供数据,然后在孙子级组件使用Inject获取到数据。

我们来看一下代码怎么实现

<script>
  const app = Vue.createApp({
    data() {
      return {
        message: "hello world!"
      }
    },
    provide:{
      msg:"根组件数据"
    },
    template: `<div>
        <child/>
    </div>`
  })

  app.component('child',{
      template:`
        <div>footer子组件</div>
        <deepChild/>
      `
  })

  app.component('deepChild',{
    inject:['msg'],
    template:`<div>deepChild孙子级组件<br>根组件给我传递的msg:{{msg}}</div>`
  })

  const vm = app.mount("#app")
</script>

provide和inject在我们需要多级跨级传递数据时还是很有帮助的,虽然我们这个演示比较简单可能你觉得作用不大,但是当我们组件层级复杂的时候,就能立刻显示出它的优势

视频讲解