七天学完Vue之第二天学习笔记(自定指令,过滤器,生命周期函数,动画效果)

1.5. 第二天 (自定指令,过滤器,生命周期函数,动画效果)

1.5.1. 删除的两种方式
1.使用some找到下标

this.lists.some((item,i) => {
							if (item.id == id) {
								this.lists.splice(i, 1)
								console.log(i)
								return true
							}
						})
2.使用findIndex
var index = this.lists.findIndex(item=>{
							if(item.id == id) {
								return true;
							}
						})
this.lists.splice(index,1);

1.5.2. 判断字符串存在的两种方式
1.使用forEach

var array = [];
this.lists.forEach(item=> {
	if(item.name.indexOf(keywords) != -1) {
		array.push(item);
	}
})
return array;

2.使用filter

var newlist = this.lists.filter(item => {
	if (item.name.includes(keywords)){
		return true;
	}
}) 
return newlist;

1.5.3. 过滤器
概念: Vue.js允许你自定义过滤器,可被用作-些常见的文本格式化。

过滤器可以用在两个地方: mustache插值和v-bind表达式。

过滤器应该被添加
在JavaScript表达式的尾部,由“管道"符指示;
• 全局

Vue.filter('dataFormat', function(datsStr) {
				内容
			});

• 私有
1.私有[ filters定义方式:

filters: {
dataFormat(input, pattern= "") { 
var dt . new Date(input);
//获取年月日
var y = dt.getFullYear();
var m =(dt.getMonth().+1).tostring().padStart(2, '0');
var d = dt.getDate(). toString() .padStart(2,'0');
}

1.5.4. 自定义按键修饰符
你还可以通过全局 config.keyCodes 对象自定义按键修饰符别名
1.5.5. 自定义指令
简写的形式是,把第二个参数的对象改成一个函数,此函数代替了bind与update

在很多时候,你可能想在 bind 和 update 时触发相同行为,而不关心其它的钩子。比如这样写:

Vue.directive('color-swatch', function (el, binding) {
  el.style.backgroundColor = binding.value
})

• 全局
// 注册一个全局自定义指令 v-focus

Vue.directive('focus', {
  // 当被绑定的元素插入到 DOM 中时……
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})

//其中:参数1:指令的名称,注意,在定义的时候,指令的名称前面,不需要加v-前缀,
//但是:在调用的时候,必须在指令名称前加上v-前缀来进行调用
//参数2:是一个对象,这个对象身上,有一些指令相关的函数,这些函数可以在特定的阶段,执行相关的操作
• 局部

directives: {
  focus: {
    // 指令的定义
    inserted: function (el) {
      el.focus()
    }
  }
}

• 钩子函数

bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
inserted:被绑定元素插入父节点时调用
(仅保证父节点存在,但不一定已被插入文档中)。
update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode
更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。

• 钩子函数的参数
指令钩子函数会被传入以下参数:

el:指令所绑定的元素,可以用来直接操作 DOM。
binding:一个对象,包含以下 property: name:指令名,不包括 v-
前缀。
value:指令的绑定值,例如:v-my-directive=“1 + 1” 中,绑定值为 2。
oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
expression:字符串形式的指令表达式。例如 v-my-directive=“1 + 1” 中,表达式为 “1 + 1”。
arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 “foo”。
modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true,
bar: true }。 vnode:Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

1.5.6. vue实例的生命周期
什么是生命周期:从Vue实例创建、运行、到销毁期间,总是伴随著各种各样的重件, 这些事件,统称为生命周期!
生命周期钩子:就是生命周期事件的别名而已;
• 创建期间的生命周期函数

beforeCreate :实例刚在内存中被创建出来,此时,还没有初始化好data和methods属性
created :实例已经在内存中创建OK ,此时data和methods已经创建OK ,此时还没有开始编译模板
beforeMount :此时已经完成了模板的编译,但是还没有挂载到页面中
mounted :此时,已经将编译好的模板,挂载到了页面指定的容器中显示

• 运行期间的生命周期函数

beforeUpdate :状态更新之前执行此函数,此时data中的状态值是最新的,但是界面上 显示的数据还是旧的,因为此时还没有开始重新渲染DOM节点
updated :实例更新完毕之后调用此函数,此时data中的状态值和界面上显示的数据, 都已经完成了更新,界面已经被重新渲染好了!

• 销毁期间的生命周期函数

beforeDestroy :实例销毁之前调用。在这一步,实例仍然完全可用。
destroyed :Vue实例销毁后调用。调用后,Vue实例指示的所有东西都会解绑定,所有 的事件监听器会被移除,所有的子实例也会被销毁。

1.5.7. 动画效果
• 使用标签实现
Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡
条件渲染 (使用 v-if)
条件展示 (使用 v-show)
动态组件
组件根节点
这里是一个典型的例子:

<div id="demo">
  <button v-on:click="show = !show">
    Toggle
  </button>
  <transition name="fade">
    <p v-if="show">hello</p>
  </transition>
</div>
new Vue({
  el: '#demo',
  data: {
    show: true
  }
})
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
}
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
  opacity: 0;
}

• 自定义前缀

<transition name="自定义的前缀名字">
</transition>

• 使用animate.css类库实现
• 实现小球滑动实例

<body>
		<div id="app">
			
			
			<input type="button" value="快到碗里来" @click="flag= !flag" />
			<transition
				@before-enter="beforeEnter"
				@enter="enter"
				@after-enter="afterEnter">
				<div id="cir" v-show="flag"></div>
			</transition>
		</div>
		<script type="text/javascript">
			var vm = new Vue({
				el: '#app',
				data: {
					flag: false
				},
				methods: {
					//动画初始位置
					beforeEnter(el) {
						el.style.transform = "translate(0, 0)"
					},
					//动画的结束位置
					enter(el, done) {
						el.offsetWidth  //出现过度动画的效果
						el.style.transition = 'all 2s ease'
						el.style.transform = "translate(150px, 450px)"
						done()
					},
					afterEnter(el) {
						this.flag = !this.flag
					}
				}
			});
		</script>
	</body>

• 使用实现列表动画

<!--在实现列表过渡的时候,如果需要过渡的元素,是通过v-for循环渲染出来的,不能使用
transition包裹,需要使用<transition-group>
<!--如果要为v-for循环创建的元素设置动画,必须为每一个元素设置:key -->

实例

<head>
		<meta charset="utf-8">
		<title>列表添加动画</title>
		<script src="../js/vue.js" type="text/javascript" charset="utf-8"></script>
		<style>
			li {
				margin-top: 10px;
				border: 1px #1B6D85 solid;
			}
			li:hover {
				background-color: #1B6D85;
			}
			
			.v-enter,
			.v-leave-to{
				opacity: 0;
				transform: translateY(80px);
			}
			.v-enter-active,
			.v-leave-active{
				transition: all 1s ease;
			}
			
		</style>
	</head>
	<body>
		<div id="app">
			<label>
				id:
				<input type="text" v-model="id"/>
			</label>
			<label>
				name:
				<input type="text" v-model="name"/>
			</label>
			<input type="button" value="add" v-on:click="add()"/>
			<ul>
				<transition-group>
					<li v-for="item in list" :key='item.id'>{{item.id}}---{{item.name}}</li>
				</transition-group>
			</ul>
		</div>
		
		<script type="text/javascript">
			var vm = new Vue({
				el:'#app',
				data:{
					
					id: '',
					name: '',
					list: [
						{id:1, name: '贾真琦'},
						{id:2, name: '科比'}
					]
				},
				methods:{
					add() {
						this.list.push({id: this.id, name: this.name})
						this.id = this.name = ''
					}
				}
			});
		</script>
	</body>

• 指令

/* 动画开始指令 */
.v-enter,
.v-leave-to{
	opacity: 0;
	transform: translateY(80px);
}
			
/* 动画运动指令 */
.v-enter-active,
.v-leave-active{
	transition: all 1s ease;
}
			
/* 下面的. v-move 和v-leave-active配合使用,能够实现列表后续的元素,渐渐地漂上来的效果★ */
.v-move{
	transition: all 1s ease;
}
.v-leave-active{
	position: absolute;
}

transition-group的appear属性与tag属性

<!-- 通过为<transition-group>添加 appear属性时,实现页面刚出现,入场有效果,但是此时会给li标签外渲染一个span标签,有损规范 -->
<!-- 因此可以为<transition-group>指定 tag="ul",会将为<transition-group>渲染成ul标签,删除外层的ul -->
	<transition-group appear tag="ul">
		<li v-for="(item,i) in list" :key='item.id' @click="del(i)">{{item.id}}---{{item.name}}</li>
	</transition-group>

1.5.8. 方法
• padStart与padEnd
理解1:
padStart():用于头部补全。
padEnd()用于尾部补全。
一共接受两个参数,
第一个参数是用来指定字符串的长度,如果该值低于当前字符串的长度,则将按原样返回当前字符串
第二个参数是用来补全的字符串,如果此字符串太长而无法保持在目标长度内,则会截断该字符串并应用最左侧的部分,如果省略,将会用空格补全。
第一个参数用来指定字符串的最小长度,
第二个参数是用来补全的字符串。

理解2:
使用ES6中的字符串新方法String,prototype.padStart(maxLength, fllString=’ ’ )或
String.prototype.padEnd(maxLength, fllString=’ ’ )来填充字符串;

谢谢观看~
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值