欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vue总结03--组件化

程序员文章站 2022-05-25 22:54:16
...

组件化

组件是可复用的 Vue 实例,带有一个名字,我们可以在一个通过 new Vue 创建的 Vue 根实例中,把 这个组件作为自定义元素来使用。



组件基础

一、组件注册、使用及数据传递

Vue.component(name, options)可用于注册组件。

	自定义组件
	<hello-world :msg="msg"></hello-world>
	<script>  
	  // 注册hello-world组件    							   
	  Vue.component('hello-world', {      
	    data() {      
	          return {  
	             message: '888888'     
	         } 
        },       
        props: {  
        	// 接受父组件的数据
           msg: {    
              type: String,
              default: "7777777"
           }, 
       },        
       template: `     
           <div> 哈哈哈哈 </div>  `,
    })
    const app = new Vue({       
       el: '#app',      
       data: {
          title: 'hello world'  
       }    
    }) </script>

二、自定义事件及其监听

当子组件需要和父级组件进行通信,可以派发并监听自定义事件。

<hello-world @add-msg="addMsg"></hello-world>
<script>        
	// 组件注册        
	Vue.component('hello-world', {    
	   data() { 
	       return { 
	           msg: '' 
           }
       },
       template: `
  			// 在组件上使用v-model 组件实现v-model 范例:改造hello-world为支持v-model
           <div>
                 <input v-model="msg"  @keydown.enter="addMsg"/>                         
           </div>
       `, 
        methods: {               
         addMsg() {
               // 发送自定义事件通知父组件                    	
              // 注意事件名称定义时不要有大写字母出现                    		
              this.$emit('add-msg', this.msg)                    
             }            
         }
     }) 

三、在组件上使用v-model

自定义组件支持v-model需要实现内部input的:value和@input

	<hello-world v-model="msg" @add-msg="addMsg"></hello-world>
	 Vue.component('hello-world', {            
	// 接收父组件传递value,不需要额外维护msg            
		props: ['value'],       
		template: `                
			<div>                   
			 // 需要实现input的:value和@input                     		
			 <input :value="value" @input="onInput"                         				
			 @keydown.enter="addMsg"/>                    
		`,
		methods: {                
			addMsg() {
			    	// 派发事件不再需要传递数据                    		
			    	this.$emit('add-msg');
			}, 
			onInput(e) { 
			        this.$emit('input', e.target.value);
            }            
       }       
  })            

四、通过插槽分发内容

通过使用vue提供的 元素可以给组件传递内容

<message :show.sync="show">发送消息成功!</message>
Vue.component('message', {        
	props: ['show'],        
	template: `            
		<div class="message-box" v-if="show">
		   // slot作为占位符
		   <slot></slot>                
		   <span class="message-box-close"                     			
		   @click="$emit('update:show', false)">X</span>
        </div>        
    `    
})
	// 如果存在多个独立内容要分发,可以使用具名插槽v-slot:name
	<message :show.sync="show">    
		<template v-slot:title>恭喜</template>    
		<template>新增消息成功!</template>           
	</message>
	Vue.component('message', {    
		props: ['show'],    
		template: `        
			<div class="message-box" v-if="show">            
				<strong><slot name="title"></slot></strong>                            		
				<slot></slot>        
			</div>    
		` })

组件化理解

定义:组件是可复用的 Vue 实例,准确讲它们是VueComponent的实例,继承自Vue。
优点:组件化可以增加代码的复用性、可维护性和可测试性。
使用场景:什么时候使用组件?以下分类可作为参考:
通用组件:实现最基本的功能,具有通用性、复用性,例如按钮组件、输入框组件、布局组件等一系列组件。
业务组件:它们完成具体业务,具有一定的复用性,例如登录组件、轮播图组件。 页面组件:组织应用各部分独立内容,需要时在不同页面组件间切换,例如列表页、详情页组件
如何使用组件
定义:Vue.component(),components选项
分类:有状态组件,functional,abstract
通信:props, e m i t ( ) / emit()/ emit()/on(),provide/inject,
c h i l d r e n / children/ children/parent/ r o o t / root/ root/attrs/$listeners
内容分发:slot,template,v-slot 使用及优化:is,keep-alive,异步组件

总结

vue中的组件经历如下过程 组件配置 => VueComponent实例 => render() => Virtual DOM=> DOM
所以组件的本质是产生虚拟DOM

相关标签: 前端系列 vue