vue组件通信及动态组件

407 阅读2分钟

image-20220407202750189.png 什么是组件? 它是一个功能高内聚,业务低耦合的一个功能代码片段(功能组件)。

作用:业务、逻辑解耦(让业务与业务之间不要紧密关联,可以提高代码的重用性)

出现原因:因为在业务开发中会有很多的代码以及功能模块会相似,但是又有一定的区别,所以需要对代码进行一个解耦开发,那么这些解耦出来的代码,可以认为是一个组件,所以vue的一个页面,可以由很多个组件进行组成

进行vue开发,需要在vscode中进行一个插件安装:Vetur、Vue 3 Snippets

组成

template:用于快速编写html结构,只能有一个顶层元素。

script:用于编写Vueconstructor参数对象,实现方法和数据定义、组件注册等。

style:编写css样式。

【面试题】如果是template和render方法同时存在,会认template,那么原理是什么?

因为.vue文件在执行时会被vue-loader(是vue专门编写的一个用于编译vue文件的一个webpack库)编译成一个js代码,template会被编译成一个render方法,使用createElement方法来进行虚拟dom的创建,又因为同时存在render和template, 那么加载的时候是先加载render,然后再加载template,所以render方法就会被覆盖。

组件之间的通信

image-20220407202750189

  1. 父传子 ---->使用prop(标签属性)原理

总结: 父组件在子组件标签上绑定任意的数据,然后子组件通过props来定义需要接收的数据类型和默认值,是否必传属性

例如:父组件内index.vue

...
<Child :amount="amount"/>
...
 <script>
    import Child from './Child.ve'
    export default{
        components:{
            Child
        },
        data(){
            return {
                amount:1000
            }
        }
    }
  </script>
//这里是传递一个Number类型的数据
​

子组件内Child.vue

...
<div>
    <h2>
        {{amount}}
    </h2>
</div>
...
<script>
export default{
    props:{
        // 要定义数据类型
        amount:{
            type:Number,
            //定义这个属性必传
            required:true
        }
    }
}
</script>
  1. 子传父----->使用$emit(事件触发机制)原理

总结: 父组件在子组件标签上绑定一个自定义事件,然后绑定事件回调方法,子组件在适当的时机调用$emit方法去触发自定义事件,然后进行值传递

语法:$emit(event: string, ...args: any[])

该方法第一个参数固定为事件名字,从第二个参数开始都为传递的数据。

子组件内 list.vue

...
<button @click="itemEvt(item)">
    增加
</button>
...
<sript>
export default{
    methods:{
    itemEvt(item){
        this.$emit('itemClick',item)
         }
     }
 }
</sript>
​

父组件内 index.vue

...
<ListNode @itemClick="parentClickEvt"/>
...
<script>
import  ListNode from './list.vue'
    export default{
        components:{
            ListNode
        },
        methods:{
            parentClickEvt(item){
                console.log(item)
            }
        }
    }
</script>

动态组件【面试题】

常用于在页面上,根据不同的条件展示不同的组件

要切换数据->按钮、下拉框

要做到组件切换。

本质还是根据数据进行渲染。

<!-- vue应该提供一个全局组件,可以实现给一个组件的名字,它根据名字来进行组件渲染这样的功能 -->
<!-- component全局组件,会根据is属性传递的组件名字,来动态渲染组件 -->