vue组件之间传参有三种传参方式'父传子','子传父','非父子组件之间传值'

父传子

  • 父组件
<template>
<CounterCom :num="5"></CounterCom>
</template> <script>
import CounterCom from './components/CounterCom.vue'
export default{
components:{CounterCom}, // 引用组件
data(){
return{
msg:"vue-脚手架写大项目",
}
}
}
</script> <style scoped>
</style>
  • 子组件
<template>
<div>{{num}}<div>
</template> <script>
export default{
props:{
"num":{
type: Number,
default:1
},
"age":{
type: Number,
required:true
}
},
}
</script> <style scoped>
</style>
  • type: 子组件接收的值可以为Number、String、Boolen、Array、Object、Function,也可以接收多种类型值如: [Number,String]

  • default:

    1.default定义默认值,如果父组件有传值,则用父值渲染。如果父组件没有传值,则使用默认值

    2.父子组件传值时default不能直接定义成空数组或空对象,需要用工厂函数return返回一个默认值

<script>
export default{
props:{
num :{
type: Array,
default: function () {
return {}
}
},
changePage: {
type: Array,
default: () => {}
}
},
}
</script>
  • required: required为true时定义为必传项,

  • 自定义验证函数

为 props 属性指定 自定义的验证函数 ,从而 对 prop 属性的值进行更加精确的控制

export default {
props : {
D : {
fun(value) {
//这个函数表示:D必须匹配'aa','bb','cc'里其中一个
//fun函数返回为true表示验证通过,false则表示验证失败
return ['aa','bb','cc'].indexOf(value) !== -1
}
},
},
}

子组件传父组件

  • 子组件
<template>
<div>
<h2>{{name}}</h2>
<h2>{{age}}</h2>
<button @click="giveName">点我传递姓名</button>
</div>
</template> <script>
export default {
name:'Student',
props:['receive'],
data(){
return{
name:'张三',
age:18
}
},
methods:{
giveName(){
// 调用自定义事件,传入参数
this.$emit('getName',this.name)
}
}
}
</script>
  • 父组件
<template>
<CounterCom @getName= ""></CounterCom>
</template> <script>
import CounterCom from './components/CounterCom.vue'
export default{
components:{CounterCom}, // 引用组件
data(){
return{
name: ""
}
},
methods:{
giveName(e){
this.name = e
}
}
}
</script>

总结: 子传父主要通过 this.$emit()方法传值,其中有两个参数,第参数一个为传递事件名称,第二个为传递的参数,父组件通过v-bind事件接收子组件传递过来的值

非父子组件之间传值

非父子组件之间传值,需要定义个公共实例文件bus.js,作为中间仓库来传值,不然路由组件之间达不到传值的效果。

bus文件可以理解为组件A和B的父组件,组件A注册一个事件上浮给bus文件,组件B在bus文件下监听事件

// bus.js
import Vue from 'vue'
export default new Vue()
<template>
<div>
A组件:
<span>{{elementValue}}</span>
<input type="button" value="点击触发" @click="elementByValue">
</div>
</template> <script>
import Bus from './bus'
export default {
name: 'ChildInfo',
data () {
return {
elementValue: 10
}
},
methods: {
elementByValue: function () {
Bus.$emit('val', this.elementValue)
}
}
}
</script> <style scoped> </style>

<template>
<div>
B组件:
<span>{{elementValue}}</span>
</div>
</template> <script>
import Bus from './bus'
export default {
name: 'ChildInfo2',
data () {
return {
elementValue: 0
}
},
mounted: function () {
var that = this
// 用$on事件来接收参数
Bus.$on('val', (data) => {
that.elementValue = data
})
},
methods: {
}
}
</script> <style scoped> </style>

vue中非父子组件之间通信除了使用bus总线,也可以使用vuex,两者适用场景不同。

bus适合小项目、数据被更少组件使用的项目,对于中大型项目 数据在很多组件之间使用的情况 bus就不太适用了。bus其实就是一个发布订阅模式,利用vue的自定义事件机制,在触发的地方通过$emit向外发布一个事件,在需要监听的页面,通过$on监听事件。

vue组件之间的传参的更多相关文章

  1. 【vue】父向子组件传参、子组件向父传参

    1.父向子组件传参 App.vue为父,引入componetA组件之后,则可以在App.vue中使用标签(注意驼峰写法要改成componet-a写法,因为html对大小写不敏感,componenta与 ...

  2. vue组件之间传值方式解析

    vue组件之间传值方式解析一.父组件传到子组件 1.父组件parent代码如下: <template> <div class="parent"> <h ...

  3. vue组件之间的传值——中央事件总线与跨组件之间的通信($attrs、$listeners)

    vue组件之间的通信有很多种方式,最常用到的就是父子组件之间的传值,但是当项目工程比较大的时候,就会出现兄弟组件之间的传值,跨级组件之间的传值.不可否认,这些都可以类似父子组件一级一级的转换传递,但是 ...

  4. vue 组件之间互相传值:兄弟组件通信

    vue 组件之间互相传值:兄弟组件通信我们在项目中经常会遇到兄弟组件通信的情况.在大型项目中我们可以通过引入 vuex 轻松管理各组件之间通信问题,但在一些小型的项目中,我们就没有必要去引入 vuex ...

  5. vue组件之间传值

    父组件向子组件传值 父组件可以在引用子组件时,通过属性绑定(v-bind:)的形式,把数据传递给子组件.在子组件的props中定义后即可使用数据 <div id="app"& ...

  6. react router @4 和 vue路由 详解(六)vue怎么通过路由传参?

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 8.vue怎么通过路由传参? a.通配符传参数 //在定义路由的时候 { path: ' ...

  7. vuex-- Vue.的中心化状态管理方案(vue 组件之间的通信简化机制)

    vuex-- Vue.的中心化状态管理方案(vue 组件之间的通信简化机制) 如果你在使用 vue.js , 那么我想你可能会对 vue 组件之间的通信感到崩溃 .vuex就是为了解决组件通信问题的. ...

  8. 前端面试 vue 部分 (5)——VUE组件之间通信的方式有哪些

    VUE组件之间通信的方式有哪些(SSS) 常见使用场景可以分为三类: 父子通信: null 父向子传递数据是通过 props ,子向父是通过 $emit / $on $emit / $bus Vuex ...

  9. Vue 组件之间通信 All in One

    Vue 组件之间通信 All in One 组件间通信 1. 父子组件之间通信 https://stackblitz.com/edit/vue-parent-child-commutation?fil ...

  10. vue 组件之间相互传值 父传子 子传父

    1.父传子 把要传入的值放到父标签里  子组件使用props接收 父写法 子写法 2.子传父 子组件: childrenOnclick() { // 发布自定义事件 this.$emit(" ...

随机推荐

  1. S-HR类加载器的区别

    S-HR的addon和sp下的jar包是由不同的类加载器来加载的: 1.如果/root/kingdee/eas/server/lib/sp的包的路径引用的是/root/kingdee/eas/serv ...

  2. iOS 防止charles抓包

    方案一:检查手机Wifi是否设置了代理     public func fetchHttpProxy() -> Bool {        guard let proxy = CFNetwork ...

  3. 088_BatchApex_Callout

    global class BatchSync implements Database.Batchable<sObject>, Database.AllowsCallouts { publi ...

  4. PYTHON中的CONCURRENT.FUTURES模块

    一 : 概述 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor: 进程池,提供异 ...

  5. 人眼对led灯的闪烁识别度:写单片机的时候,小于15ms,我们人眼视为常亮

    人眼对于每11毫秒闪烁一次约83赫兹基本感觉不到,每15毫秒闪烁一次约66赫兹轻微频闪. 所以写单片机的时候,小于15ms,我们人眼视为常亮

  6. Docker私服(Registry)

    Docker Registry安装 #拉取镜像 docker pull registry #创建文件夹 mkdir -p /var/my_registry #启动容器 docker run -d -- ...

  7. Newtonsoft.Json高级用法--转载至 焰尾迭 随笔

    本人只做搬运工,以这方便自己学习的态度!以下内容均为拷贝! 如有不适请联系本人! 本文原作者:焰尾迭 本文地址:http://www.cnblogs.com/yanweidie/p/4605212.h ...

  8. Flink1.11 解决 No ExecutorFactory found to execute the application

    在使用Flink1.11的时候写了个本地Test 运行的时候发现报错了,具体如下 Exception in thread "main" java.lang.IllegalState ...

  9. VS Code第一部分--创建

    第一步:Win键+R  cmd 打开之后  输入 vue ui 运行结束后  会显示一个仪表盘页面 点击左下方的更多 点击项目管理器 点击创建  输入自己创建的文件夹地址  按回车保存 点击下方的创建 ...

  10. 如何给img标签指定默认显示的图片?(已解决)

    1. 使用场景 页面上有很多图片,或者图片很大,这都会使加载的时候出现大片空白,影响用户体验. 2. 解决办法 在CSS里给img指定默认显示的图片,以下是代码: { //**** backgroun ...