04-VUE动画与组件
回顾
知识点回顾
动态样式
style 三目 数组 对象 class 三目 数组 对象
生命周期
beforeCreate created beforeMount mounted beforeUpdate updated beforeDestroy destroyed
侦听器
watch:{ 侦听变量的名字(new_value,old_value){ }, 侦听变量的名字:{ handler(){ }, deep:true } }
计算属性
computed 调用不加括号 有缓存机制 不可以和已经存在的变量和方法重名 不可以修改
JSONP
作业
1、数据结构
2、设计图细节
3、computed的使用场景
反馈
生命周期销毁有点不明白
beforeDestroy
destoryed
beforeUpdate(){ console.log(document.querySelector("#app").innerHTML()) //old } updated(){ console.log(document.querySelector("#app").innerHTML()) //new } 更新前(beforeUpdate):对应的钩子函数是beforeUpdate。在这一阶段,vue遵循数据驱动DOM的原则;beforeUpdate函数在数据更新后虽然没立即更新数据,但是DOM中的数据会改变,这是Vue双向数据绑定的作用。
过滤器
本质,过滤器是一个特殊的函数
作用,可以对模板上的数据进行再处理,在数据挂载前处理。比如:
13331153360 133****3360 1 2 男 女
过滤器作用在变量的后面,
使用 | 作为符合
作用将 | 前边的变量作为 | 后边的函数的值进行处理。
过滤器函数必须有返回值
过滤器只可以在插值表达式和v-bind上使用
<body> <div id="app"> {{ phone|setPhone }} setPhone(phone) </div> </body> <script> Vue.filter("setPhone",function(string){ return string.slice(0,3)+"****"+string.slice(-4) }) var vue = new Vue({ el: "#app", data: { phone: "13331153360" } }) </script>
过滤器的划分
全局过滤器
Vue.filter("setPhone",function(string){ console.log("hhh") return string.slice(0,3)+"****"+string.slice(-4) })
局部作用域
var vue = new Vue({ el: "#APP", data: { phone: "15210698741", gender: 1 }, filters:{ gen(value){ if(value === 1){ return "男" }else{ return "女" } } } })
过滤器参数
1991-06-18 1991/06/18 1991.01.18
比如时间过滤器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./vue.js"></script> </head> <body> <div id="app"> {{ timer|setTime("-----") }} </div> </body> <script> Vue.filter("setPhone",function(string){ console.log("hhh") return string.slice(0,3)+"****"+string.slice(-4) }) Vue.filter("setTime",function(string,d="-"){ var split_list = string.split(" ") return split_list.join(d) }) var vue = new Vue({ el: "#app", data: { timer: "1991 06 18" } }) </script> </html>
过渡动画
CSS过渡动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./vue.js"></script> <style> *{ padding: 0; margin: 0; box-sizing: border-box; } .box{ width: 200px; height: 200px; background-color: blueviolet; transition: all 10s linear 1s; } .box:hover{ width: 800px; background-color: green; } </style> </head> <body> <div id="app"> <div class="box"> </div> </div> </body> <script> var vue = new Vue({ el: "#app", data: { } }) </script> </html>
VUE过渡动画
1、将需要过渡的内容放到<transition>标签当中
<body> <div id="app"> <button @click="isShow = !isShow">toggle</button> <transition> <div class="box" v-if="isShow"> </div> </transition> </div> </body>
2、使用6个定义好的类型来描述过渡动画
-
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
被删除),在过渡/动画完成之后移除。
<style> *{ padding: 0; margin: 0; box-sizing: border-box; } .box{ width: 200px; height: 200px; background-color: blueviolet; } .v-enter{ opacity: 0; } .v-enter-active{ transition: all 10s; } .v-enter-to{ opacity: 1; } .v-leave{ opacity: 1; } .v-leave-active{ transition: all 10s; } .v-leave-to{ opacity: 0; } </style>
单页面多种过渡效果需要借助name属性,设置name属性后,将name数组作为css样式名称的开始就可以了
合并代码为
所有代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./vue.js"></script> <style> *{ padding: 0; margin: 0; box-sizing: border-box; } .box{ width: 200px; height: 200px; background-color: blueviolet; margin-left: -200px; } .v-enter{ opacity: 0; margin-left: -200px; } .v-enter-active{ transition: all 10s; } .v-enter-to{ opacity: 1; margin-left: 500px; } .v-leave{ opacity: 1; margin-left: 500px; } .v-leave-active{ transition: all 10s; } .v-leave-to{ opacity: 0; margin-left: -200px; } .box1{ width: 200px; height: 200px; background-color: blueviolet; } .move-enter,.move-leave-to{ margin-left: 0px; } .move-enter-active,.move-leave-active{ transition: all 10s; } .move-enter-to,.move-leave{ margin-left: 500px; } </style> </head> <body> <div id="app"> <button @click="isShow = !isShow">toggle</button> <transition> <div class="box" v-if="isShow"> </div> </transition> <transition name="move"> <div class="box1" v-if="isShow"> </div> </transition> </div> </body> <script> var vue = new Vue({ el: "#app", data: { isShow: true } }) </script> </html>
在transition标签上添加appear属性,新增初始化动画
如果使用过渡动画的是多个元素,需要使用transition-group标签
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./vue.js"></script> <style> *{ padding: 0; margin: 0; box-sizing: border-box; } .item{ width: 300px; height: 100px; background-color: blueviolet; text-align: center; line-height: 100px; } .v-enter{ opacity: 0; margin-left: -200px; } .v-enter-active{ transition: all 3s; } .v-enter-to{ opacity: 1; margin-left: 500px; } .v-leave{ opacity: 1; margin-left: 500px; } .v-leave-active{ transition: all 3s; } .v-leave-to{ opacity: 0; margin-left: -200px; } </style> </head> <body> <div id="app"> <ul> <transition-group appear> <li class="item" v-show="isShow" v-for="(i,index) in foods_list" :key="i" @click="del(index)"> {{ i }} </li> </transition-group> </ul> <transition name="move" appear> <div class="box1" v-if="isShow"> </div> </transition> </div> </body> <script> var vue = new Vue({ el: "#app", data: { isShow: true, foods_list: [ "红烧肉", "锅包肉", "咕咾肉", "回锅肉", "粉蒸肉" ] }, methods: { del(index){ this.foods_list.splice(index,1) } } }) </script> </html>
结合三方库的transtion
animate
-
enter-class
-
enter-active-class
-
enter-to-class
(2.1.8+) -
leave-class
-
leave-active-class
-
leave-to-class
(2.1.8+)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./vue.js"></script> <style> *{ padding: 0; margin: 0; box-sizing: border-box; } .box{ width: 300px; height: 300px; background-color: blueviolet; text-align: center; line-height: 100px; } </style> <link href="https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel="stylesheet" type="text/css"> <!-- <link href="./animate.min@4.1.1.css" rel="stylesheet" type="text/css"> --> </head> <body> <div id="app"> <button @click="isShow = !isShow">切换</button> <transition enter-active-class="animated tada" leave-active-class="animated bounceOutRight" > <div class="box" v-if="isShow"> </div> </transition> </div> </body> <script> var vue = new Vue({ el: "#app", data: { isShow: true }, methods: { } }) </script> </html>
批量的使用三方的过渡动画也是通过<transition-group>标签,属性同上
-
enter-class
-
enter-active-class
-
enter-to-class
(2.1.8+) -
leave-class
-
leave-active-class
-
leave-to-class
(2.1.8+)
组件
组件对应一种模块化开发的思想,就是页面当中常用功能的封装。
组件构成:
视图(html部分)
样式 (css部分)
行为 (js部分)
全局组件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./vue.js"></script> </head> <body> <div id="app"> <hhh></hhh> <hhh></hhh> <hhh></hhh> <hhh></hhh> <hhh></hhh> <hhh></hhh> </div> </body> <script> Vue.component( 'hhh',{ template: ` <h1 @click="say_hello">{{ message }}</h1> `, data(){ return { message: "hello world" } }, methods:{ say_hello(){ console.log("hello world") } } } ) var vue = new Vue({ el: "#app", data: { } }) </script> </html>
1、组件是一个完整的功能体
一个组件的 data
选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝,如果 Vue 没有这条规则,在同一页面多次调用一个组件,修改的数据会是同一个数据,形成混淆。
因为对象是一个引用类型的数据结构,在多次调用的时候,实际上修改的内部元素是同一块内存上的同一个数据,而函数每次调用会生成独立的内存空间,所以为了保持组件多次调用,每次的独立性,组件的data属性选用函数,但是这个函数必须返回一个对象。
局部组件
1、组件标签 <template>,本身不显示,可以作为组件的html部分
2、组件当中必须有一个根标签
3、组件支持嵌套
4、报错的等级: info warning error danger
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./vue.js"></script> </head> <body> <div id="app"> <tom></tom> </div> <template id="title"> <asdfasf> <h2>这是一个标题</h2> <hhh></hhh> </asdfasf> </template> </body> <script> Vue.component( 'hhh',{ template: ` <h1 @click="say_hello">{{ message }}</h1> `, data(){ return { message: "hello world" } }, methods:{ say_hello(){ console.log("hello world") } } } ) var vue = new Vue({ el: "#app", data: { }, components: { 'tom': { template: "#title", data(){ return { } }, methods: { } } } }) </script> </html>
案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./vue.js"></script> <style> *{ margin: 0; padding: 0; } .top{ width: 100%; height: 54px; background-color: #22B14C; } .contioner{ width: 100%; background-color: #EFE4B0; } .contioner>div{ float: left; } .left{ width: 300px; height: calc(100vh - 54px); background-color: #FF7F27; } .right{ width: calc(100% - 300px); height: calc(100vh - 54px); } .content{ background-color: #B97A57; height: 500px; width: 1000px; margin: 60px 100px; } </style> </head> <body> <div id="app"> <div class="top"> <hea></hea> </div> <div class="contioner"> <div class="left"> <lef></lef> </div> <div class="right"> <div class="content"> <con></con> </div> </div> </div> </div> <template id="header"> <div> header </div> </template> <template id="left"> <div> left </div> </template> <template id="content"> <div> content </div> </template> </body> <script> var vue = new Vue({ el: "#app", data: { }, components: { hea:{ template: "#header" }, lef: { template: "#left" }, con: { template: "#content" } } }) </script> </html>
脚手架
项目共性功能的封装,叫做框架。
框架也叫做脚手架,是灵活的使用在同类型项目开发过程当中的辅助功能。
vue cli(command line interface),是vue官方提供的一个基于webpack的一个脚手架工具
vue cli可以帮助我们联网下载要基于webpack的开发模板
vue cli脚手架工具基于node平台的,npm
安装vue-cli
npm i @vue/cli -g npm install @vue/cli --global
创建项目
首先要选择需要创建项目的目录
vue-cli可以使用命令行进行项目创建,但是命令行在哪里执行,就在那里创建。
vue create 项目名称(可以下划线,但是不可以大写)
启动项目
cd到项目目录下 npm run serve
项目结构
工作流程