当前位置: 首页 > news >正文

Vue 高级特性总结

  • 自定义v-model使用
//parent
<template>
	<p>content:{{name}}</p>
	<CustomInput v-model="name"/>
</template>
<sctipt>
export default {
	name: 'textVModel',
	data() {
		return {
			name: 'test'
		}
	}
}
</script>
//child
<template>
	<Input type="text" :value="text" @input="@$emit('change', $event.target.value)"/>
</template>
<script>
export default {
	name: 'customInput',
	model: {
		prop: 'text',
		event: 'change'
	},
	props: String,
	default(){
		return ''
	}
}
</script>

效果图:
自定义v-model

  • $nextTick使用
<template>
	<ul ref="ul">
		<li v-for="item in list" :key="item.id">{{item.value}}</li>
	</ul>
	<button @click="handleAddItem">增加两项</button>
</template>
<script>
export default {
	data(){
		return {
			list:[
				{id:'1',value:'a'},
				{id:'2',value:'b'}
			]
		}
	},
	methods:{
		handleAddItem(){
			this.list.push({id:Date.now(),value:Date.now()})
			this.list.push({id:Date.now(),value:Date.now()})
			
			//const ulElem = this.$refs.ul
			/** 图1-
				点击第一次输出 2 第二次输出 4 ,因为异步渲染,data改变之后
				不会立刻渲染 DOM 节点,多次 data 修改整合成一次
			*/
			//console.log(ulElem.childNodes.length) 
			//下面是使用 $nextTick后结果,如图2
			this.$nextTick( () => { // dom渲染之后触发回调,获取到最新的DOM 节点
				const ulElem = this.$refs.ul
				console.log(ulElem.childNodes.length) // 正常输出DOM 节点长度
			})
		}
	}
}
</script>

图1-在这里插入图片描述
图二-在这里插入图片描述

  • refs
    在元素上定义 ref 属性,通过 $refs.dom名称获取DOM 元素
<template>
	<ul ref="ulElem"></ul>
</template>
<script>
	const ulElement = this.$refs.ulElem // <ul></ul>
</script>
  • slot
    插槽分几种:
    • 普通插槽 (父组件调用子组件时需要传入子组件无法确定的内容)
    // parent
    <template>
        <Child :url="slotData.url">{{slotData.name}}</Chiild>
    </template>
    <script>
    data(){
       return {
       	slotData:{ name:''Mike ,url:''www.baidu.com }
       }
    }
    </script>
    // child
    <template>
    <a :href="url">
       <!-- 调用时要插入的内容 -->
       <slot>父组件没有传入就默认显示的内容</slot>
    </a>
    </template>
    <script>
       props:['url']
    </script>
    
    • 作用域插槽 (场景:父组件需要使用子组件内的 内置变量)
    	// parent
    	<template>
    		<child :url="slotData.url">
       		<template v-slot="slotProps">{{slotProps.slotDatas.title}}</template>
       	</child>
    	</template>
    	<script>
       	export default {
       		slotData:{ name:'Mike',url:'www.baidu.com' }
       	}
       </script>
       // child
       <template>
       	<a :href="url">
       		<slot :slotDatas="childData"></slot>
       	</a>
       </template>
       <script>
       	export default {
       		childData:{title:'childTitme'}
       	}
       </script>
    
    • 具名插槽(场景:组件内有多个 slot)
    // parent
    <template>
    	<child>
    		<template v-slot="head">head</template>
    		<template v-slot="section">section</template>
    		<template v-slot="footer">footer</template>
    	</child>
    </template>
    <script>
    	
    </script>
    // child
    <template>
    	<div class="head">
    		<slot name="head"></slot>
    	</div>
    	<div class="section">
    		<slot name="section"></slot>
    	</div>
    	<div class="footer">
    		<slot name="footer"></slot>
    	</div>
    </template>
    <script></script>
    
  • 动态组件
    使用场景:新闻页,不规则,可能是 text 组件开始,也可能是 image 组件开始,中间顺序错乱
	<div v-for="item in list" :key="item.id">
   	<component :is="item.name"/>
   </div>
   
	data(){
   	return { 
   		list:[
   			{id:'1',name:'Text'},
   			{id:'2',name:'Section'},
   			{id:'3',name:'Asidt'},
   			{id:'4',name:'Text'},
   		]
   	 }
   }
  • 异步组件
    使用场景:大组件,内容多,比如echarts组件,from组件,使用的时候才加载
<template>
	<CustomEcharts v-if="showCustom"/>
	<button @click="showCustom = true">show Custom</button>
</template>
<script>
	export default {
		components: {
			CustomEcharts: () => import('./Echarts/CustomEcharts.vue')
		},
		data(){
			return {   
				showCustom: false
			}
		}
	}
</script>
  • keep-alive
    使用场景:缓存组件,频繁切换,不需要重复渲染的情况
组件不会因为 v-if 销毁,且每个组件只会 mounted 一次
<template>
   <keep-alive>
   	<customA v-if="active === 'A'"  @click="active = 'A'"/>
   	<customB v-if="active === 'B'"  @click="active = 'B'" />
   	<customC v-if="active === 'B'"  @click="active = 'C'" />
   </keep-alive>
</template>
  • mixin - 混入
    使用场景:单独的一个js 文件,包含和 vue 实例相同的属性和方法,适用于抽离多个组件公共逻辑
    弊端:变量来源不明确,多个mixin 可能会属性冲突,会出现一对多和多对多的复杂场景
<template>
   <div>{{title}}</div>
</template>
import Mixin from './mixin.js'
<script>
   data(){
   	return {}
   }
</script>
// mixin.js
export default{
   data(){
   		return {title: 'Mixin- 混入' }
   	}
}

纯属记录工作中适用,方便以后查找。不正确地方望指正,感谢!

相关文章:

  • 「滑动窗口算法概述」
  • MyEclipse数据库使用教程:使用数据库表、外键和索引
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • Windows Server 2016安装SQLServer2008R2
  • BP神经网络算法基本原理,bp神经网络的算法步骤
  • HADOOP 的 LZO 压缩 hadoop-lzo 编译
  • 单调栈: 接雨水
  • 用C++11 make_shared替代shared_ptr
  • 数据结构之——栈的操作讲解与功能实现
  • 剑指 Offer II 079+080+081+082
  • 前端小tips(持续更新)
  • matlab读取文件
  • php __destruct反序列化原理
  • 通俗易懂,一文学会前端缓存
  • python常用基础笔记
  • 30天自制操作系统-2
  • Brief introduction of how to 'Call, Apply and Bind'
  • ES10 特性的完整指南
  • JavaScript对象详解
  • js如何打印object对象
  • Median of Two Sorted Arrays
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 力扣(LeetCode)56
  • 两列自适应布局方案整理
  • 我感觉这是史上最牛的防sql注入方法类
  • 小程序测试方案初探
  • C# - 为值类型重定义相等性
  • ​Python 3 新特性:类型注解
  • ​渐进式Web应用PWA的未来
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • ( 10 )MySQL中的外键
  • (02)vite环境变量配置
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (ZT)薛涌:谈贫说富
  • (独孤九剑)--文件系统
  • (转)ORM
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • ***原理与防范
  • .bashrc在哪里,alias妙用
  • .Mobi域名介绍
  • .Net core 6.0 升8.0
  • .net core 依赖注入的基本用发
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .Net6 Api Swagger配置
  • .net实现客户区延伸至至非客户区
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @Service注解让spring找到你的Service bean
  • [1525]字符统计2 (哈希)SDUT
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution