什么?Vue3组件还不会?那还不赶紧进来学习,最全Vue3组件学习资料就在这里。


前言

哈喽~今天给大家分享的是Vue3组件和动画。组件(Component)是 Vue.js 最强大的功能之一。接下来跟着我一起探寻组件和动画的奥秘吧


提示:以下是本篇文章正文内容,下面案例可供参考

一、Vue.js 组件是什么?

组件(Component)是 Vue.js 最强大的功能之一。
组件可以扩展 HTML 元素,封装可重用的代码。
组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树:

组件:一个小的功能分区
意义:复杂项目拆分简单的组件
让团队开发更高效
组件是可以重复使用的模块

也可以理解为:组件其实就是个小的Vue,具有data,methods,watch,computed

通常一个应用会以一棵嵌套的组件树的形式来组织

在这里插入图片描述
注册一个全局组件语法格式如下:

Vue.component(tagName, options)
tagName 为组件名,options 为配置选项。注册后,我们可以直接使用标签的方式来调用组件

1.全局组件

注册一个简单的全局组件 btn,并使用它
代码如下(示例):

//app.component 来创建组件:
const app = Vue.createApp({			 
})
// 创建根实例
app.component("btn",{
	template:`<button @click="n++">{{n}}</button>`,
	data(){return {n:1}}
})
app.mount("#app")	

2.局部组件

注册一个简单的局部组件 step,并使用它

代码如下(示例):

//定义组件
const step = {
	template:`<div><button @click="n--">-</button>{{n}}<button @click="n++">+</button></div>`,
	data(){return {n:1}}
}

//注册组件
const app = Vue.createApp({	
	components:{step}
})
//使用组件
<step></step>
<step></step>

3.组件的参数传递

(1)父传子props

prop 是子组件用来接受父组件传递过来的数据的一个自定义属性。

父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 “prop”:

注意: prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是不会反过来

//传递
<step :num="10"></step>
<step :num="5"></step>
//接收
props:{
    "num":{type:Number,default:1}
},
//使用
data(){return {n:this.num}}
//对象与数组的默认值必须是函数的返回值
//语法结构 完整代码在下面

如何监听子组件发出的事件

通常你希望每个 prop 都有指定的值类型。这时,你可以以对象形式列出 prop可以监视的值:

  • String
  • Number
  • Boolean
  • Array
  • Object
  • Date
  • Function
  • Symbol

(2)子传父emit事件

父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,就需要使用自定义事件!

使用 $emit(eventName) 触发事件

我们用一个案例来具体分析一下组件的参数传递
案例展示

通过监听input里的值来控制p标签的长度和圆角

完整代码展示如下(示例):

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="./js/vue.js" type="text/javascript" charset="utf-8"></script>
		<style type="text/css">
			#app div {
				width: 100px;
				background-color: #0000FF;

			}
		</style>
	</head>
	<body>
		<div id="app">
			<steper :value="w1" @numchange="w1=$event"></steper>
			<steper :value="w2" @numchange="w2=$event"></steper>
			
			
			
			<p :style="{width:w1+'px','height':w1+'px',borderRadius:w1+'px',border:'1px solid red'}"></p>
			<p :style="{width:w2+'px','height':w1+'px',borderRadius:w2+'px',border:'1px solid red'}"></p>
		</div>
		<script type="text/javascript">
			// 定于组件
			//组件父传子 props只读
			const steper = {
				template: `<p>
							<button @click="num--">-</button>
							<input v-model.number="num">
							<button @click="num++">+</button>
						</p>`,
				data() {
					return {
						num: this.value
					}
				},
				//属性
				props: {
					value: {
						type: Number, //value类型是数字
						default: 1 //默认值为1
					}
				},
				watch:{
					"num":{
						handler:function(nval,oval){
							this.$emit("numchange",this.num)
						},
						
						deep:true
					}
				}
			}

			Vue.createApp({
				//注册组件
				components: {
					steper
				},
				data() {
					return {
						w1:20,
						w2:10

					}
				}
			}).mount("#app")
		</script>
	</body>
</html>

案例详解

在这里插入图片描述

在这里插入图片描述

4.插槽

和 HTML 元素一样,我们经常需要向一个组件传递内容
我们使用 作为我们想要插入内容的占位符

(1)命名插槽

const price={
				template:`<span><slot name="pre"></slot>18<slot name="next"></slot></span>`
			}
//可以通过
			<price>
				<template v-slot:next></template>
				<template v-slot:pre></template>
			</price>
//获取组件的嵌套内容

(2)插槽的作用域

有时让插槽内容能够访问子组件中才有的数据是很有用的。
当一个组件被用来渲染一个项目数组时,这是一个常见的情况,我们希望能够自定义每个项目的渲染方式。

<step>
    <template v-slot:default="scope">
        <i class="fas fa-check">{{scope.index}}</i>
        <span class="green">{{ scope.item }}</span>
    </template>	
</step>

const step = {
    template: `<ul><li v-for="( item, index ) in list">
	<slot :item="item" :index="index"></slot>
                   </li></ul>`,
data() {  return {list: ["vue", 'react', 'angular']}}}

二 、Vue.js动画

Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。
Vue 提供了内置的过渡封装组件,该组件用于包裹要实现过渡效果的组件
通过自动对显示或隐藏的元素添加类名

1.动画

过渡其实就是一个淡入淡出的效果。Vue在元素显示与隐藏的过渡中,提供了 6 个 class 来切换:

  • v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。

  • v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。

  • v-enter-to: 2.1.8版及以上 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter
    被移除),在过渡/动画完成之后移除。

  • v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。

  • v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。

  • v-leave-to: 2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave
    被删除),在过渡/动画完成之后移除。

在这里插入图片描述
案例展示

和css3很相似

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="./js/vue.js" type="text/javascript" charset="utf-8"></script>
		<style type="text/css">
			@keyframes fadeIn {
				from {
					opacity: 0;
					transform: rotate(360deg);
				}

				to {
					opacity: 1;
					transform: rotate(0)
				}
			}

			@keyframes fadeOut {
				from {
					opacity: 1;
					transform: rotate(0);
				}

				to {
					opacity: 0;
					transform: rotate(360deg)
				}
			}

			.fade-enter-active {
				animation: fadeIn ease 1s;
			}

			.fade-leave-active {
				/* 整个进入的状态
				整个离开的过程都拥有这两个类 */

				animation: fadeOut ease 1s;
			}

			img {
				width: 50px;
			}
		</style>
	</head>
	<body>
		<div id="app">
			<button type="button" @click="flag=!flag">切换</button><br>
			<transition name="fade">
				<img src="./img/下载%20(27).png" v-if="flag">
			</transition>
		</div>
		<script type="text/javascript">
			Vue.createApp({
				data() {
					return {
						flag: true
					}
				}
			}).mount("#app")
		</script>
	</body>
</html>

(1)动画模式

n-out 先进在出,out-in先出在进

<transition  mode="out-in" enter-active-class="animated slideInLeft" leave-active-class="slideOutRight animated">
	<button key='a' v-if="flag">A</button>
	<button key='b' v-else>B</button>
</transition>

完整代码展示

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="./js/vue.js" type="text/javascript" charset="utf-8"></script>
		<link rel="stylesheet" type="text/css" href="./动画库/animate.css"/>
		<style type="text/css">
			body{
				padding: 50px;
			}
			p button{
				position: absolute;
				left: 0;
				right: 0;
				animation-duration:0.3s !important ;
			}
		</style>
	</head>
	<body>
		<div id="app">
			<button type="button" @click="flag=!flag">切换</button><br>
			<transition name="fade"    enter-active-class="animated slideInRight" leave-active-class="animated slideOutLeft">
				<button v-if="flag">in</button>
				<button v-else>out</button>
			</transition>
		</div>
		<script type="text/javascript">
			Vue.createApp({
				data() {
					return {
						flag: true
					}
				}
			}).mount("#app")
		</script>
	</body>
</html>


总结

以上就是今天要讲的内容,本文简单介绍了组件和动画的使用,而vue给我们带的惊喜还有很多,希望大家能多多关注老石。本系列将持续更新!!!
  • 点赞,关注,收藏走一波,感激不尽!
  • 你们的支持就是我的动力~
  • 要想学好Vue ,关注老石不迷路
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值