返回

从Vue组件入手解析跨级组件间数据传递的奥秘

前端

组件及其全局与局部之分

组件是构建Vue应用程序的基本元素。组件可以是全局的,也可以是局部的。全局组件可以在任何地方使用,而局部组件只能在定义它们的Vue实例中使用。

父子组件间传值

父子组件间的数据传递是Vue组件间数据传递最常见的情况。父组件可以向下传递数据到子组件,子组件也可以向上传递数据到父组件。

父向子传值

父组件向子组件传值可以使用props。props是只读的,子组件不能修改props的值。

<template>
  <div>
    <child-component :message="message"></child-component>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello from parent!'
    }
  }
}
</script>
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  props: ['message']
}
</script>

子向父传值

子组件向父组件传值可以使用自定义事件。自定义事件是子组件派发的,父组件监听这些事件并作出相应反应。

<template>
  <div>
    <button @click="sendMessage">Send message</button>
  </div>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message', 'Hello from child!')
    }
  }
}
</script>
<template>
  <div>
    <child-component @message="handleMessage"></child-component>
  </div>
</template>

<script>
export default {
  methods: {
    handleMessage(message) {
      console.log(message)
    }
  }
}
</script>

父子组件间传递非props属性

在某些情况下,我们需要在父子组件间传递非props属性。例如,我们可能需要在子组件中访问父组件的data属性。我们可以使用$parent属性来访问父组件的实例。

<template>
  <div>
    <child-component></child-component>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello from parent!'
    }
  }
}
</script>
<template>
  <div>
    <p>{{ $parent.message }}</p>
  </div>
</template>

<script>
export default {
}
</script>

关系型组件间传值

关系型组件间的数据传递是指在不直接嵌套的情况下,组件之间的数据传递。例如,我们可以通过父组件进行数据中转,或者使用root和children属性来访问其他组件的实例。

通过父组件进行数据中转

我们可以通过父组件来中转数据。例如,我们可以将数据存储在父组件的data属性中,然后将这些数据传递给子组件。

<template>
  <div>
    <child-component :data="data"></child-component>
  </div>
</template>

<script>
export default {
  data() {
    return {
      data: {
        message: 'Hello from parent!'
      }
    }
  }
}
</script>
<template>
  <div>
    <p>{{ data.message }}</p>
  </div>
</template>

<script>
export default {
  props: ['data']
}
</script>

使用root和children属性

我们可以使用root属性来访问根组件的实例,使用children属性来访问子组件的实例。例如,我们可以使用$root属性来将数据广播到所有子组件。

<template>
  <div>
    <child-component></child-component>
    <child-component></child-component>
  </div>
</template>

<script>
export default {
  mounted() {
    this.$root.$emit('message', 'Hello from root!')
  }
}
</script>
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  mounted() {
    this.$on('message', (message) => {
      console.log(message)
    })
  }
}
</script>

总结

本文介绍了Vue组件间数据传递的多种方式,包括全局组件和局部组件、父子组件间传值、父向子传值和子向父传值等。我们还探讨了父子组件间如何通过props传递非props属性,以及如何实现关系型组件间的数据传递。希望本文能为Vue开发者提供关于组件间数据传递的实用指南和深刻理解。