0
点赞
收藏
分享

微信扫一扫

Vue3【组件传递(数据_Props、多种数据类型、Props效验 )组件事件(配合 v-model 使用 、组件数据传递、透传 Attribute) 】(四)-全面详解(学习总结---从入门到深化)


Vue3【组件传递(数据_Props、多种数据类型、Props效验 )组件事件(配合 v-model 使用 、组件数据传递、透传 Attribute) 】(四)-全面详解(学习总结---从入门到深化)_vue.js

 

👏作者简介:大家好,我是小童,Java开发工程师,博客博主,Java领域新星创作者
📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人 

组件传递数据_Props

Vue3【组件传递(数据_Props、多种数据类型、Props效验 )组件事件(配合 v-model 使用 、组件数据传递、透传 Attribute) 】(四)-全面详解(学习总结---从入门到深化)_前端_02

组件与组件之间不是完全独立的,而是有交集的,那就是组件与组件之间是可以传递数据的 

传递数据的解决方案就是 props

<template>
    <h3>ComponentA</h3>
    <ComponentB title="传递数据"/>
</template>
<script>
import ComponentB from "./ComponentB.vue"
export default {
    components:{
        ComponentB
   }
}
</script>

<template>
    <h3>ComponentB</h3>
    <p>{{ title }}</p>
</template>
<script>
export default {
    props:["title"]
}
</script>

动态数据传递

<template>
    <h3>ComponentA</h3>
    <ComponentB :title="message"/>
</template>
<script>
  import ComponentB from "./ComponentB.vue"
  export default {
    data(){
        return{
            message:"动态数据"
       }
   },
    components:{
        ComponentB
   }
}
</script>

注意事项:

props

实时效果反馈

1. 下列实现组件之间传递数据,接受数据组件的中的关键字是:

A data

B methods

C watch

D props 

组件传递多种数据类型 

Vue3【组件传递(数据_Props、多种数据类型、Props效验 )组件事件(配合 v-model 使用 、组件数据传递、透传 Attribute) 】(四)-全面详解(学习总结---从入门到深化)_自定义事件_03

通过 props

但实际上任何类型的值都可以作为 props 的值被传递 

Number 

<template>
    <h3>ComponentA</h3>
    <ComponentB :age="age"/>
</template>
<script>
  import ComponentB from "./ComponentB.vue"
  export default {
    data(){
        return{
            age:20
       }
   },
    components:{
        ComponentB
   }
}
</script>

<template>
    <h3>ComponentB</h3>
    <p>{{ age }}</p>
</template>
<script>
export default {
    props:["age"]
}
</script>

Array

<template>
    <h3>ComponentA</h3>
    <ComponentB :names="names"/>
</template>
<script>
  import ComponentB from "./ComponentB.vue"
  export default {
    data(){
        return{
            names:["iwen","ime","frank"]
       }
   },
    components:{
        ComponentB
   }
}
</script>

<template>
    <h3>ComponentB</h3>
    <p v-for="(item,index) of names" :key="index">{{ item }}</p>
</template>
<script>
  export default {
    props:["names"]
  }
</script>

Object

<template>
    <h3>ComponentA</h3>
    <ComponentB :userInfo="userInfo"/>
</template>
<script>
  import ComponentB from "./ComponentB.vue"
  export default {
    data(){
        return{
            userInfo:{
                name:"iwen",
                age:20
           }
       }
   },
    components:{
        ComponentB
   }
}
</script>

<template>
    <h3>ComponentB</h3>
    <p>{{ userInfo.name }}</p>
    <p>{{ userInfo.age }}</p>
</template>
<script>
 export default {
    props:["userInfo"]
 }
</script>

实时效果反馈

1. props

A 只能接受字符串类型

B 只能接受数组类型 

C 只能接受对象类型

D 任何类型

组件传递Props效验 

Vue3【组件传递(数据_Props、多种数据类型、Props效验 )组件事件(配合 v-model 使用 、组件数据传递、透传 Attribute) 】(四)-全面详解(学习总结---从入门到深化)_传递数据_04

Vue 组件可以更细致地声明对传入的 props 的校验要求

<template>
  <h3>ComponentA</h3>
  <ComponentB title="Props效验" :userInfo="userInfo"/>
</template>
<script>
import ComponentB from "./ComponentB.vue"
export default {
    data(){
        return{
            userInfo:{
                name:"iwen",
                age:20
           }
       }
   },
    components:{
        ComponentB
   }
}
</script>

<template>
    <h3>ComponentB</h3>
    <p>{{ title }}</p>
    <p>{{ userInfo.name }}</p>
    <p>{{ userInfo.age }}</p>
</template>
<script>
export default {
    props:{
        title:{
            type:String
         },
        userInfo:{
            type:Object
       }
   }
}
</script>

 默认值

<template>
    <h3>ComponentB</h3>
    <p>{{ title }}</p>
    <p>{{ userInfo.name }}</p>
    <p>{{ userInfo.age }}</p>
    <p>{{ age }}</p>
</template>
<script>
 export default {
    props:{
        title:{
            type:String
       },
        userInfo:{
            type:Object,
            default(){
                return {}
           }
       },
        age:{
            type:Number,
            default:20
       }
   }
}
</script>

必选项

<template>
    <h3>ComponentB</h3>
    <p>{{ title }}</p>
    <p>{{ userInfo.name }}</p>
    <p>{{ userInfo.age }}</p>
    <p>{{ age }}</p>
</template>
<script>
 export default {
    props:{
        title:{
            type:String,
            required:true
       },
        userInfo:{
            type:Object,
            // 对象或者数组应当用工厂函数返回
            default(){
                return {}
           }
       },
        age:{
            type:Number,
            default:20
       }
   }
}
</script>

温馨提示

警告!prop 是只读的!

<template>
    <h3>ComponentB</h3>
    <p>{{ title }}</p>
    <button @click="updateHandle">修改数据</button>
</template>
<script>
 export default {
    props:{
        title:{
            type:String,
            required:true
       }
   },
    updateHandle(){
        // 警告!prop 是只读的!
        this.title = "不允许修改"
   }
}
</script>

 实时效果反馈

1. props 传递数据,下列那个是效验 props 的必选项:

A default

B type

C

D props

组件事件 

Vue3【组件传递(数据_Props、多种数据类型、Props效验 )组件事件(配合 v-model 使用 、组件数据传递、透传 Attribute) 】(四)-全面详解(学习总结---从入门到深化)_vue.js_05

在组件的模板表达式中,可以直接使用 $emit 方法触发自定义事件 触发自定义事件的目的是组件之间传递数据 

<template>
    <h3>ComponentA</h3>
    <ComponentB @some-event="getHandle"/>
    <p>ComponentA接受的数据:{{ message }}</p>
</template>
<script>
import ComponentB from "./ComponentB.vue"
export default {
    data(){
        return{
            message:""
       }
   },
    components:{
        ComponentB
   },
    methods:{
        getHandle(data){
            this.message = data;
       }
   }
}
</script>

<template>
    <h3>ComponentB</h3>
    <button @click="sendHandle">发送数据
</button>
</template>
<script>
 export default {
    methods: {
        sendHandle() {
            this.$emit("someEvent", "ComponentB的数据")
       }
   }
}
</script>

温馨提示

组件之间传递数据的方案:

1 父传子: props

2 子传父: 自定义事件(this.$emit)

实时效果反馈 

1. 下列那个是自定义事件组件传递数据的关键字:

A props

B data

C $emit

D event

组件事件配合 v-model 使用 

Vue3【组件传递(数据_Props、多种数据类型、Props效验 )组件事件(配合 v-model 使用 、组件数据传递、透传 Attribute) 】(四)-全面详解(学习总结---从入门到深化)_自定义事件_06

如果是用户输入,我们希望在获取数据的同时发送数据配合 v-model 来使用 

 

<template>
    <div>
        <h3>ComponentA</h3>
        <ComponentB @some-event="getHandle"/>
        <p>ComponentA接受的数据:{{ message }}</p>
    </div>
</template>
<script>
import ComponentB from "./ComponentB.vue"
export default {
    data() {
        return {
            message: ""
       }
   },
    components: {
        ComponentB
   },
    methods: {
        getHandle(data) {
            this.message = data;
       }
   }
}
</script>

<template>
    <div>
       <h3>ComponentB</h3>
       <input v-model="searchText" />
    </div>
</template>
<script>
  export default {
    data() {
          return {
            searchText: ""
       }
   },
    watch: {
        searchText(newValue, oldValue) {
            this.$emit("someEvent", newValue)
       }
   }
}
</script>

组件数据传递

Vue3【组件传递(数据_Props、多种数据类型、Props效验 )组件事件(配合 v-model 使用 、组件数据传递、透传 Attribute) 】(四)-全面详解(学习总结---从入门到深化)_传递数据_07

我们之前讲解过了组件之间的数据传递, props 和 自定义事件两种方式 

1 props

2 自定义事件 : 子传父 

出了上述的方案, props

<template>
  <Child :onFnEvent="fn" />
  <p>{{ message }}</p>
</template>
<script>
import Child from "./components/Child.vue"
export default {
  data() {
    return {
      message:""
   }
 },
  methods: {
    fn(data) {
      this.message = data
   }
 },
  components: {
    Child
 }
}
</script>

<template>
    <h3>组件传递数据</h3>
    <p>{{ onFnEvent('测试数据') }}</p>
</template>
<script>
 export default {
    props:{
        onFnEvent:{
            type:Function
       }
   }
}
</script>

透传 Attributes

Vue3【组件传递(数据_Props、多种数据类型、Props效验 )组件事件(配合 v-model 使用 、组件数据传递、透传 Attribute) 】(四)-全面详解(学习总结---从入门到深化)_vue.js_08

“透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 emits 的 attribute 或者 v-on 事件监听器。最常见的例子就是 class 、 style 和 id

当一个组件以单个元素为根作渲染时,透传的 attribute 会自动被添加到根元素上 

<template>
    <h3>ComponentA</h3>
    <ComponentB class="component-b" />
</template>
<script>
import ComponentB from "./ComponentB.vue"
export default {
    components: {
        ComponentB
   }
}
</script>

<template>
    <h3>ComponentB</h3>
</template>
<style>
.component-b{
    color: red;
}
</style>

禁用 Attributes 继承

<template>
    <h3>ComponentB</h3>
</template>
<script>
export default {
    inheritAttrs:false
}
</script>
<style>
.component-b{
    color: red;
}
</style>

举报

相关推荐

0 条评论