组件通讯详解

48 阅读2分钟

prop详解

定义:组件上注册的自定义属性 作用:向子组件传递数据 特点:

  • 可以传递任何数量的prop
  • 可以传递任何类型的prop
<template>
  <div id="app">
    <UserInfo
    :username="username"></UserInfo>
    //接收
  </div>
</template>

<script>
import UserInfo from'./components'
export default {
  data(){
    return{
      username:'小帅',
      age:28,
      isSingle:true,
      car:{
        brand:'宝马',
      },
      hobby:['篮球','足球','羽毛球']
    }
  },
  //将return中的数据传回prop
  components:{
    UserInfo
  }

}
</script>
<style>

</style>
<template>
  <div class="userinfo"> 
    <h3>我是个人信息组件</h3>
    <div>姓名:{{username}}</div>
    <div>年纪:</div>
    <div>是否单身:</div>
    <div>座驾:</div>
    <div>
      兴趣爱好:
    </div>
  </div>
</template>

<script>
export default {
prop:['username','age']
}
</script>

<style scoped>
.userinfo{
  width: 300px;
  border: 3px solid #000;
  padding: 20px;

}
</style>

props校验 作用:为组件的prop指定验证要求,不符合要求,控制台就会有错误

  1. 类型校验
  2. 非空校验
  3. 默认值
  4. 自定义校验
props:{
校验的属性名:类型//Number String Boolean
}
//更详细
props:{
校验的属性名:{
  type:类型,//Number String Boolean
  required:true,//是否必填,非空
  default:默认值,//默认值
  validator(value){
  //自定义校验逻辑
  return 是否通过校验
       }
     }
  },

<template>
  <div><div>
    </div></div>
</template>

<script>
export default {
props:{
  w:{
    type:Number,
    require:true,
    default:0,
    validator(value){
      if(value>=0&&value<=100){
        return true
      }else{
        return false
      }
    }
  }
}
}
</script>

<style>

</style>

可以将传的值改为对应的属性值

data&prop的区别

共同点:都可以给组件提供数据 区别:

  • data的数据是自己的 随便改
  • prop的数据是外部的 不能直接改,要遵循单向数据流
<template>
  <div class="base-count">
    <button @click="count--">-</button>
    <span>{{ count }}</span>
    <button @click="count++">+</button>
  </div>
</template>

<script>
export default {
    // 1.自己的数据,随便改(谁的数据谁负责)
    // data(){
    // return {
    //     count:999
    // }
    //2.prop传过来的数据外部的数据
    //不能直接改
    //单向数据流:父组件的prop更新,会单向向下流动,影响到子组件
    props:{
        count:Number
    },
    methods:{
        handleAdd(){
            //子传父 this.$emit(事件名,参数)
            this.$emit('changeCount',this.count+1)

        },
        handleSub(){
            this.$emit('changeCount',this.count-1)

        }
    }


}

</script>

<style>
.base-count{
    margin: 20px;

}
</style>
<template>
  <div id="app">
    <BaseCount
    @changeCount="handleChange"
    :count="count"
    ></BaseCount>
  </div>
</template>

<script>
import BaseCount from './components/BaseCount.vue'
export default {
data (){
  return{
    count:666
  }
},
methods:{
  handleChange(newCount){
    this.count=newCount

  }
},
components:{
  BaseCount
}
}
</script>

<style>

</style>

非父子通信(拓展)-event bus 事件总线

1.创建一个都能访问到的事件总线

import Vue from 'vue'

const Bus =new Vue()

export default Bus

2.在A组件,进行监听Bus的事件

<template>
  <div class="baseA">
    我是A组件
  </div>
</template>

<script>
import Bus from '../utils/EventBus'
export default {
    created(){
        //2.在A组件,进行监听Bus的事件
        Bus.$on('sendMsg',(msg)=>{
            
        })
    }

}
</script>

<style>

</style>

3.B组件触发事件的方式传递参数(发布消息)

  <div class="baseB">
    我是B组件
    <button @click="clickSend">发送通知</button>
  </div>
</template>

<script>
import Bus from '../utils/EventBus'
export default {
    methods:{
        clickSend(){
            Bus.$emit('sendMsg','今日晴天,适合郊游')
        }
    }

}
</script>

<style>

</style>