vue中组件传参的几种常用方法举例

 更新时间:2023年08月23日 09:23:37   作者:寻源千鹤  
这篇文章主要给大家介绍了关于vue中组件传参的几种常用方法,Vue组件传参方也是面试最常考的内容,文中通过代码实例介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下

1.父子组件

  • Props:通过在父组件中定义props属性,将数据传递给子组件。子组件通过props属性接收数据。例如:
// 父组件
<template>
  <child-component :message="hello"></child-component>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      hello: 'Hello World!'
    }
  }
}
</script>
// 子组件
<template>
  <div>{{ message }}</div>
</template>
<script>
export default {
  props: {
    message: String
  }
}
</script>
  • $emit:通过在子组件中触发事件,将数据传递给父组件。父组件通过在子组件上监听事件,接收数据。例如:
// 子组件
<template>
  <button @click="sendMessage">Send Message</button>
</template>
<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message-sent', 'Hello World!')
    }
  }
}
</script>
// 父组件
<template>
  <child-component @message-sent="handleMessage"></child-component>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
  components: {
    ChildComponent
  },
  methods: {
    handleMessage(message) {
      console.log(message) // 'Hello World!'
    }
  }
}
</script>
  • Provide/Inject:通过在父组件中提供数据,让子孙组件可以注入数据。例如:
// 父组件
<template>
  <div>
    <provide-message :message="hello">
      <child-component></child-component>
    </provide-message>
  </div>
</template>
<script>
import ProvideMessage from './ProvideMessage.vue'
import ChildComponent from './ChildComponent.vue'
export default {
  components: {
    ProvideMessage,
    ChildComponent
  },
  data() {
    return {
      hello: 'Hello World!'
    }
  }
}
</script>
// ProvideMessage组件
<template>
  <div>
    <slot></slot>
  </div>
</template>
<script>
export default {
  provide() {
    return {
      message: this.message
    }
  },
  props: {
    message: String
  }
}
</script>
// 子组件
<template>
  <div>{{ message }}</div>
</template>
<script>
export default {
  inject: ['message']
}
</script>

以上是Vue中组件传参的三种常用方法,分别是Props、$emit和Provide/Inject。通过这些方法,我们可以在组件之间传递数据,实现组件之间的通信。

2.兄弟组件

  • 通过共同的父组件传递数据:如果两个兄弟组件有共同的父组件,可以通过在父组件中定义数据,然后通过props属性分别传递给两个兄弟组件。例如:
// 父组件
<template>
  <div>
    <child-component-1 :message="hello"></child-component-1>
    <child-component-2 :message="world"></child-component-2>
  </div>
</template>
<script>
import ChildComponent1 from './ChildComponent1.vue'
import ChildComponent2 from './ChildComponent2.vue'
export default {
  components: {
    ChildComponent1,
    ChildComponent2
  },
  data() {
    return {
      hello: 'Hello',
      world: 'World'
    }
  }
}
</script>
// ChildComponent1组件
<template>
  <div>{{ message }}!</div>
</template>
<script>
export default {
  props: {
    message: String
  }
}
</script>
// ChildComponent2组件
<template>
  <div>{{ message }}!</div>
</template>
<script>
export default {
  props: {
    message: String
  }
}
</script>
  • 通过事件总线传递数据:可以在Vue实例中创建一个事件总线,然后在兄弟组件中分别触发和监听事件,从而实现数据传递。例如:
// Vue实例
<script>
export default {
  data() {
    return {
      message: ''
    }
  },
  created() {
    this.$on('message-sent', (message) => {
      this.message = message
    })
  }
}
</script>
// ChildComponent1组件
<template>
  <button @click="sendMessage">Send Message</button>
</template>
<script>
export default {
  methods: {
    sendMessage() {
      this.$root.$emit('message-sent', 'Hello')
    }
  }
}
</script>
// ChildComponent2组件
<template>
  <div>{{ message }} World!</div>
</template>
<script>
export default {
  computed: {
    message() {
      return this.$root.message
    }
  }
}
</script>
  • 通过Vuex状态管理传递数据:可以使用Vuex来管理应用程序的状态,从而实现兄弟组件之间的数据传递。例如:
// Vuex store
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
    message: ''
  },
  mutations: {
    setMessage(state, message) {
      state.message = message
    }
  }
})
// ChildComponent1组件
<template>
  <button @click="sendMessage">Send Message</button>
</template>
<script>
export default {
  methods: {
    sendMessage() {
      this.$store.commit('setMessage', 'Hello')
    }
  }
}
</script>
// ChildComponent2组件
<template>
  <div>{{ message }} World!</div>
</template>
<script>
export default {
  computed: {
    message() {
      return this.$store.state.message
    }
  }
}
</script>

以上是Vue中兄弟组件传参的三种常用方法,分别是通过共同的父组件传递数据、通过事件总线传递数据和通过Vuex状态管理传递数据。根据具体的场景和需求,选择合适的方法来实现兄弟组件之间的数据传递。

3.祖先后代

  • 通过props和 e m i t 传递数据:祖先组件可以通过 p r o p s 属性将数据传递给中间组件,中间组件再通过 p r o p s 属性将数据传递给后代组件。后代组件可以通过 emit传递数据:祖先组件可以通过props属性将数据传递给中间组件,中间组件再通过props属性将数据传递给后代组件。后代组件可以通过 emit传递数据:祖先组件可以通过props属性将数据传递给中间组件,中间组件再通过props属性将数据传递给后代组件。后代组件可以通过emit事件将数据传递回祖先组件。例如:
// 祖先组件
<template>
  <div>
    <middle-component :message="hello"></middle-component>
  </div>
</template>
<script>
import MiddleComponent from './MiddleComponent.vue'
export default {
  components: {
    MiddleComponent
  },
  data() {
    return {
      hello: 'Hello'
    }
  }
}
</script>
// 中间组件
<template>
  <div>
    <child-component :message="message" @message-sent="sendMessage"></child-component>
  </div>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
  components: {
    ChildComponent
  },
  props: {
    message: String
  },
  methods: {
    sendMessage(message) {
      this.$emit('message-sent', message)
    }
  }
}
</script>
// 后代组件
<template>
  <div>{{ message }} World!</div>
</template>
<script>
export default {
  props: {
    message: String
  }
}
</script>
  • 通过provide和inject传递数据:祖先组件可以通过provide方法提供数据,后代组件可以通过inject方法注入数据。例如:
// 祖先组件
<template>
  <div>
    <middle-component>
      <child-component></child-component>
    </middle-component>
  </div>
</template>
<script>
import MiddleComponent from './MiddleComponent.vue'
export default {
  components: {
    MiddleComponent
  },
  provide() {
    return {
      message: 'Hello'
    }
  }
}
</script>
// 中间组件
<template>
  <div>
    <slot></slot>
  </div>
</template>
// 后代组件
<template>
  <div>{{ message }} World!</div>
</template>
<script>
export default {
  inject: ['message']
}
</script>
  • 通过Vuex状态管理传递数据:祖先组件和后代组件都可以通过Vuex来管理应用程序的状态,从而实现数据传递。例如:
// Vuex store
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
    message: 'Hello'
  },
  mutations: {
    setMessage(state, message) {
      state.message = message
    }
  }
})
// 祖先组件
<template>
  <div>
    <middle-component>
      <child-component></child-component>
    </middle-component>
  </div>
</template>
<script>
import MiddleComponent from './MiddleComponent.vue'
export default {
  components: {
    MiddleComponent
  }
}
</script>
// 中间组件
<template>
  <div>
    <slot></slot>
  </div>
</template>
// 后代组件
<template>
  <div>{{ message }} World!</div>
</template>
<script>
export default {
  computed: {
    message() {
      return this.$store.state.message
    }
  }
}
</script>

以上是Vue中祖先组件和后代组件传递数据的三种常用方法,分别是通过props和$emit传递数据、通过provide和inject传递数据和通过Vuex状态管理传递数据。根据具体的场景和需求,选择合适的方法来实现祖先组件和后代组件之间的数据传递。

4.参数传递和插槽之间的联系

在Vue中,传参和插槽是两个不同的概念,但它们之间有一定的关系。

传参是指在组件之间传递数据,可以通过props和$emit、provide和inject、Vuex等方式实现。传参的目的是让组件之间可以共享数据,从而实现组件之间的通信。

插槽是指在组件中定义一个或多个插槽,然后在使用该组件时,可以在插槽中插入任意内容。插槽的目的是让组件更加灵活,可以根据使用场景动态地插入不同的内容。

传参和插槽之间的关系在于,传参可以用来控制插槽中的内容。例如,可以通过props属性将数据传递给子组件,在子组件中使用插槽来展示这些数据。又例如,可以通过$emit事件将子组件中的数据传递给父组件,在父组件中使用插槽来展示这些数据。

下面是一个示例,演示了如何通过传参和插槽来控制组件中的内容:

// 父组件
<template>
  <div>
    <child-component :message="hello">
      <template #default="{ message }">
        <div>{{ message }} World!</div>
      </template>
    </child-component>
  </div>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      hello: 'Hello'
    }
  }
}
</script>
// 子组件
<template>
  <div>
    <slot :message="message"></slot>
  </div>
</template>
<script>
export default {
  props: {
    message: String
  },
  data() {
    return {
      message: this.message
    }
  }
}
</script>

在上面的示例中,父组件通过props属性将数据传递给子组件,子组件通过插槽将数据传递给父组件。具体来说,父组件将数据hello传递给子组件,子组件将数据message传递给插槽,父组件通过插槽接收数据并展示在页面上。

总之,传参和插槽是两个不同的概念,但它们之间有一定的关系。传参可以用来控制插槽中的内容,从而实现组件之间的通信和动态渲染。

总结

到此这篇关于vue中组件传参的几种常用方法的文章就介绍到这了,更多相关vue组件传参内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解vue-cli项目在IE浏览器打开报错解决方法

    详解vue-cli项目在IE浏览器打开报错解决方法

    这篇文章主要介绍了详解vue-cli项目在IE浏览器打开报错解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • vue中使用axios post上传头像/图片并实时显示到页面的方法

    vue中使用axios post上传头像/图片并实时显示到页面的方法

    今天小编就为大家分享一篇vue中使用axios post上传头像/图片并实时显示到页面的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Vue3中Element-Plus分页(Pagination)组件的使用

    Vue3中Element-Plus分页(Pagination)组件的使用

    Element-Plus分页(Pagination)组件在开发过程中数据展示会经常使用到,同时分页功能也会添加到页面中,下面我们就来学习一下它的具体使用,需要的可以参考一下
    2023-11-11
  • 详解Nuxt内导航栏的两种实现方式

    详解Nuxt内导航栏的两种实现方式

    这篇文章主要介绍了详解Nuxt内导航栏的两种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Vue2.x Todo之自定义指令实现自动聚焦的方法

    Vue2.x Todo之自定义指令实现自动聚焦的方法

    我们希望用户双击 todo 进入编辑状态后输入框自动获取焦点,而不是需要先手动点一下。这篇文章主要介绍了Vue 2.x Todo之自定义指令实现自动聚焦,非常具有实用价值,需要的朋友可以参考下
    2019-01-01
  • ant design vue中table表格滚动加载实现思路

    ant design vue中table表格滚动加载实现思路

    在处理一写数据量特别大的情况下,我们不能把后端的数据一次性全部拿到前端在table表格中展示,为了考虑性能优化,使用了滚动加载表格数据,这篇文章主要介绍了ant design vue中table表格滚动加载实现思路,需要的朋友可以参考下
    2024-07-07
  • vue3整合SpringSecurity加JWT实现登录认证

    vue3整合SpringSecurity加JWT实现登录认证

    本文主要介绍了vue3整合SpringSecurity加JWT实现登录认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Element中el-form表单举例详解

    Element中el-form表单举例详解

    Form组件提供了表单验证的功能,只需要通过属性传入约定的验证规则,并将Form-Item的属性设置为需校验的字段名即可,下面这篇文章主要给大家介绍了关于Element中el-form表单的相关资料,需要的朋友可以参考下
    2023-01-01
  • vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】

    vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】

    这篇文章主要介绍了vue 使用插槽分发内容操作,结合实例形式总结分析了vue.js使用单个插槽、具名插槽、作用域插槽相关操作技巧与注意事项,需要的朋友可以参考下
    2020-03-03
  • vue实现无缝轮播效果(跑马灯)

    vue实现无缝轮播效果(跑马灯)

    这篇文章主要为大家详细介绍了vue实现无缝轮播效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05

最新评论