03: vuejs 事件、模板、过滤器
目录:Vue其他篇
目录:
1.1 事件返回顶部
1、说明
1. 绑定事件的两种方法:
<button @click="showMsg">按钮</button>
<button v-on:click="test('123', true, color, $event)">新的按钮</button> <!-- $event 传递事件对象 -->
2. 回调函数在vue的methods属性中定义,如果参数集合()没有定义,回调函数有一个默认参数 this
3. 作用域是vue实例化对象,所以在回调函数中,可以通过this访问vue上的数据
4. 所以methods中定义的方法,可以在methods,以及computed等方法中使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="app">
<button @click="showMsg">按钮</button>
<button v-on:click="test('123', true, color, $event)">新的按钮</button> <!-- $event 传递事件对象 -->
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
// 定义vue实例化对象
var app = new Vue({
el: '#app',
data: {
color: 'red'
},
// 回调函数定义在methods属性中
methods: {
// 每一个属性代表一个方法
showMsg: function() {
console.log(this ,arguments)
},
// 定义回调函数
test: function() {
console.log(this, arguments) // arguments = ["123", true, "red", MouseEvent]
}
}
})
</script>
</body>
</html>
vue绑定事件
2、事件冒泡和默认行为
事件冒泡:当内存外层都绑定 如 点击事件时,只让最内层事件执行
默认行为:如 a 标签点击默认会跳转到 href 地址中,然其点击后不跳转
一次触发:<button @click.once="print"> 只触发一次 </button>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>事件冒泡和默认行为</title>
<script src="js/vue.js"></script>
<script>
window.onload=function(){
let vm=new Vue({
el:'#itany',
methods:{
show(){
console.log(111);
// e.stopPropagation();
},
print(){
console.log(222);
},
write(){
console.log(333);
},
study(){
console.log(444);
// e.preventDefault();
}
}
});
}
</script>
</head>
<body>
<div id="itany">
<div @click="write">
<p @click="print">
<!-- <button @click="show($event)">点我</button> -->
<button @click.stop="show">点我</button>
</p>
</div>
<hr> <!-- <a href="#" @click="study($event)">俺是链接</a> -->
<a href="#" @click.prevent="study">俺是链接</a>
</div>
</body>
</html>
事件冒泡和默认行为
3、事件修饰符(监控enter、up、down等键盘)
1. 绑定键盘事件的时候,经常会判断按键,通过 e.keyCode
2. 事件修饰符语法 v-on:keyup.修饰符=”回调函数()”,表示,当按下的键是修饰符的时候才会触发
3. 在vue中常见的有9个 esc, tab, space, enter, delete, up,down,left,right
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="app">
<input type="text" @keyup.enter="showValue">
<h1>{{msg}}</h1>
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
// 定义vue实例化对象
var app = new Vue({
el: "#app",
data: {
msg: ''
},
methods: {
showValue: function(e) {
// console.log(e.target.value)
// 判断点击回车键
// if (e.keyCode === 13) {
// // 作用域是vue实例化对象
// this.msg = e.target.value
// }
console.log(1111);
this.msg = e.target.value; // e.target.value 获取的是输入框的值 }
}
})
</script>
</body>
</html>
监控enter键事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>键盘事件</title>
<script src="js/vue.js"></script>
<script>
/**
* 自定义键位别名
*/
Vue.config.keyCodes={
a:65,
f1:112
} window.onload=function(){
let vm=new Vue({
el:'#itany',
methods:{
show(e){
console.log(e.keyCode);
if(e.keyCode==13){
console.log('您按了回车');
}
},
print(){
// console.log('您按了回车');
// console.log('您按了方向键上');
console.log('11111');
}
}
});
}
</script>
</head>
<body>
<div id="itany">
<!-- 键盘事件:@keydown、@keypress、@keyup -->
<!-- 用户名:<input type="text" @keydown="show($event)"> --> <!-- 简化按键的判断 -->
<!-- 用户名:<input type="text" @keydown="show($event)"> -->
<!-- 用户名:<input type="text" @keydown.13="print"> -->
<!-- 用户名:<input type="text" @keydown.enter="print"> -->
<!-- 用户名:<input type="text" @keydown.up="print"> -->
用户名:<input type="text" @keydown.f1="print"> <!-- 事件修饰符 -->
<button @click.once="print">只触发一次</button>
</div>
</body>
</html>
自定义键位别名
4、事件修饰符
.stop - 调用 event.stopPropagation()。
.prevent - 调用 event.preventDefault()。
.{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。
.native - 监听组件根元素的原生事件。
.once - 只触发一次回调。
<template>
<button @click="submit()" :disabled="isDisable">点击</button>
</template>
<script>
export default {
name: 'TestButton',
data: function () {
return {
isDisable: false
}
},
methods: {
submit() {
this.isDisable = true
setTimeout(() => {
this.isDisable = false
}, 1000)
}
},
}
</script>
防止多次提交
5、事件绑定常用方法
'''一:鼠标事件'''
# click 当用户点击某个对象时调用的事件句柄。
# contextmenu 在用户点击鼠标右键打开上下文菜单时触发
# dblclick 当用户双击某个对象时调用的事件句柄。
# mousedown 鼠标按钮被按下。
# mouseenter 当鼠标指针移动到元素上时触发。
# mouseleave 当鼠标指针移出元素时触发
# mousemove 鼠标被移动。
# mouseover 鼠标移到某元素之上。
# mouseout 鼠标从某元素移开。
# mouseup 鼠标按键被松开。 '''二:键盘事件'''
# keydown 某个键盘按键被按下。
# keypress 某个键盘按键被按下并松开。
# keyup 某个键盘按键被松开。
事件绑定常用方法
1.2 模板返回顶部
1、简介
Vue.js使用基于HTML的模板语法,可以将DOM绑定到Vue实例中的数据
模板就是{{}},用来进行数据绑定,显示在页面中,也称为Mustache语法
2、数据绑定的方式
a.双向绑定
v-model
b.单向绑定
方式1:使用两对大括号{{}},可能会出现闪烁的问题,可以使用v-cloak解决
方式2:使用v-text、v-html
3、其他指令
v-once 数据只绑定一次
v-pre 不编译,直接原样显示
官网指令: https://cn.vuejs.org/v2/api/#v-once
1.3 自定义过滤器 返回顶部
1、说明
1. 在vue升级之后,vue不建议使用过滤器,而是用插值表达式,或者动态数据绑定替换
2. 使用过滤器的目的是为了在组件间复用处理数据的业务逻辑
3. Vue类中存在一个静态方法filter方法,用来定义过滤器
2、使用过滤器(过滤器定义必须在实例化vue对象前)
1. 语法 {{数据 | 过滤器名称 参数1 参数2 参数3 | 过滤器2 参数2}}
2. 可以使用多个过滤器,前一个过滤器的输出将作为后一个过滤器的输入
3. 2.0版本的改动 {{数据 | 过滤器(参数1, 参数2)}} (2.0版本对过滤器的传参做了改动)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="app">
<p> price: 数据 currency: 过滤器名称 ¥和3:表示传递的参数 </p>
<h1>{{price | currency('¥', 3)}}</h1>
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
/**
* 自定义过滤器
* currency 过滤器名称
* @price 价格
* @sign 价格标志
* @len 小数位保留的长度
**/
Vue.filter('currency', function(price, sign, len) { // 从第二个开始才是传递的参数
price = Math.abs(price); // 保证是正数
sign = sign || '¥'; // 默认为人命币标志
len = len || 2; // 默认保留两位小数
var arr = String(parseInt(price)).split(''); // arr = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
for (var i = arr.length - 3; i > 0; i -= 3) { // 添加了成员后面的位置变了,所以从后向前遍历,首位不能添加
arr.splice(i, 0, ',') // i(插入的索引位置);0(删除0个字符串); ','(添加的符合)
} // for循环后 arr = [1, 2, ',', 3, 4, 5, ',', 6, 7, 8]
return sign + arr.join('') + (price - parseInt(price)).toFixed(len).slice(1) // 转化成小数 原数字减去整数 保留len位小数,去掉整数部分
// toFixed(len) 保留len位小数(得到结果是字符串)
// 0.23456.toFixed(3) = "0.235" "'0.235'.slice(1) = ".235"
});
new Vue({
el: '#app',
data: {
price: 1234567891.1234567,
msg: 'a hot day'
}
})
</script>
</body>
</html>
自定义过滤器
1.4 过度返回顶部
1、说明
1. 在元素切换状态的时候(例如:元素的显隐),我们可以为元素添加动画
2. Transition属性:Vue会根据属性值自动创建三个css类,例如 transition=“demo”
demo-transition: 定义过渡的
demo-enter 进入样式
demo-leave 移出样式
3. 注意:2.0类的名称变了
.demo-transition => .demo-enter-active, .demo-leave-active
.demo-enter => .demo-enter
.demo-leave => .demo-leave-to
Transition属性 变成了 transition组件了,通过name定义过渡名称
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
.demo {
width: 100px;
height: 100px;
margin-top: 20px;
background: green;
}
/*定义过渡*/
.demo-enter-active,
.demo-leave-active {
transition: all 1s;
}
/*定义进场动画和出场动画*/
.demo-enter,
.demo-leave-to {
width: 0;
height: 0;
opacity: 0;
}
</style>
</head>
<body>
<div id="app">
<button v-on:click="toggle">切换显隐</button>
<transition name="demo">
<div class="demo" transition="demo" v-if="isShow">这是内容</div>
</transition>
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
// 定义vue实例化对象
var app = new Vue({
el: '#app',
data: {
isShow: true
},
methods: {
toggle: function() {
// 切换isShow
this.isShow = !this.isShow;
}
}
})
</script>
</body>
</html>
过度
1.5 支付宝注册返回顶部
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
* {
margin: 0;
padding: 0;
list-style: none;
}
body {
background: #ccc;
}
#app {
width: 800px;
margin: 50px auto;
border: 1px solid #ccc;
background: #fff;
height: 600px;
padding-top: 80px;
}
label {
margin-left: 100px;
margin-right: 20px;
}
input {
padding: 8px 15px;
width: 300px;
}
ul {
width: 330px;
margin-left: 176px;
border: 2px solid #ccc;
margin-top: -1px;
}
ul li {
padding: 0 15px;
height: 26px;
line-height: 26px;
}
ul li:hover,
ul li.hover {
background: #efefef;
}
</style>
</head>
<body>
<div id="app">
<label>账户名</label>
<input
type="text"
v-model="msg"
@keydown.up="showPrevLi"
@keyup.down="showNextLi"
@keyup.enter="chooseLi"
>
<!-- ul的显示与msg有关 -->
<ul v-show="msg">
<li v-for="item in dealMail" v-on:click="chooseCurrentLi">{{dealMsg}}@{{item}}.<template v-if="item == 189">cn</template><template v-else>com</template></li>
</ul>
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
// 创建vue实例化对象
var app = new Vue({
el: '#app',
data: { // 定义绑定的数据
msg: '',
num: -1,
isFirst: true, // 是否是第一次
email: ['qq', 163, 126, 189, 'sina', 'hotmail', 'gmail', 'sohu', '21cn']
}, // 动态数据绑定
computed: {
dealMsg: function(vue) { // 处理msg, 截取@符号之前的
if (this.msg.indexOf('@') >= 0){ // 是否存在@
// 截取@符号之前的,不包括@, slice, substring, substr, 哪个参数表示长度,出现负数,第一个参数大于第二个参数怎么办,李鹏涛
return this.msg.slice(0, this.msg.indexOf('@'))
}
return this.msg // 否则返回msg
}, // 过滤mail集合
dealMail: function() {
if (this.msg.indexOf('@') > 0) { // 判断是否包含@, 包含@,根据@符号后面的内容过滤
var str = this.msg.slice(this.msg.indexOf('@') + 1); // 截取@后面的内容
var result = []; // 过滤email集合
for (var i = 0; i < this.email.length; i++) { // 遍历email找到符号条件的
var mail = this.email[i] + (this.email[i] == 189 ? '.c' : '.co'); // 每一个成员要带上后缀,例如sina => sina.co
if (mail.indexOf(str) === 0) { // 什么成员符合条件:以str开头,
result.push(this.email[i]) // 存储这个成员
}
}
return result; // 返回过滤的结果
}else {
return this.email // 不包含,直接返回email
}
}
}, // 定义事件回调函数
methods: {
chooseCurrentLi: function(e) { // 点击li,然后选中li
var val = e.target.innerHTML; // 获取li的内容
this.msg = val; // 更新msg
}, // 点击向上键,显示前一个li
showPrevLi: function(e) {
e.preventDefault(e); // 阻止默认行为
if (this.isFirst) { // 如果是第一次,不用减了
this.isFirst = false; // 这次过去了,就不是第一次了
} else {
this.num--;
}
this.changeCurrentLiStyle(); // 更新li的样式
}, // 点击向下键,显示后一个li
showNextLi: function() {
this.num++; // 更改num
this.changeCurrentLiStyle(); // 更新li的样式
this.isFirst = false; // 第一次已经过去了
}, getNum: function(len) { // 获取num对应的li的索引值
// 对于任意一个数(正数和负数)
// 对len取余之后,保证在-len到len之间
// var num = this.num % len;
// // 此时加上len,保证是0到2*len之间,一定是正数了
// num += len;
// // 此时再取余,就保证是0到len之间了
// num %= len
return (this.num % len + len) % len;
}, // 改变当前li的样式
changeCurrentLiStyle: function() {
var lis = this.$el.getElementsByTagName('li'); // 获取所有的li
if (lis.length === 0) { // 判断li是否存在
return;
}
var num = this.getNum(lis.length); // 获取索引值
for (var i = 0; i < lis.length; i++) { // 排他法设置类
lis[i].className = '';
}
lis[num].className = 'hover'; // 当前li选中
}, // 点击enter键,显示当前li
chooseLi: function() {
var lis = this.$el.getElementsByTagName('li'); // 获取对应的li
if (lis.length === 0) { // 判断li是否存在
return;
}
var num = this.getNum(lis.length); // 获取索引值
var value = lis[num].innerHTML; // 获取li的值
this.msg = value;
}
}
})
</script>
</body>
</html>
支付宝注册
03: vuejs 事件、模板、过滤器的更多相关文章
- Django-2- 模板路径查找,模板变量,模板过滤器,静态文件引用
模板路径查找 路径配置 2. templates模板查找有两种方式 2.1 - 在APP目录下创建templates文件夹,在文件夹下创建模板 2.2 - 在项目根目录下创建templates文件夹, ...
- Django模板过滤器详解
Django 模板过滤器也是我们在以后基于 Django 网站开发过程中会经常遇到的,如显示格式的转换.判断处理等.以下是 Django 过滤器列表,希望对为大家的开发带来一些方便. 一.形式:小写 ...
- Django框架之【自定义模板过滤器与标签】
本文在我的微信公众号的链接:https://mp.weixin.qq.com/s?__biz=MzU5NTU5MjcwNw==&mid=2247483674&idx=1&sn= ...
- Django框架基础知识03-模板变量及模板过滤器
模板变量及模板过滤器. 1.模板路径的查找 -查找顺序 1.尝试,在app目录下存放模板. -两种方案 1.app项目文件夹下存放. 2.templates文件夹下分类存放. 首先查找项目settin ...
- django-5-自定义模板过滤器及标签
<<<代码布局(自定义的代码放哪里)>>> (1)某个app特有的 1.一般放app目录下 固定名为templatetags 的python文件夹里鸭,如果是别的 ...
- 3/21 Django框架 模板路径及模板过滤器 1.模板路径查找
3/21 Django框架 模板路径及模板过滤器 1.模板路径查找 先找settings.py里的TEMPLATES列表下的DIRS路径.如果APP_DIRS为True,还会到注册了的APP文件夹下依 ...
- Django之模板过滤器
Django 模板过滤器也是我们在以后基于 Django 网站开发过程中会经常遇到的,如显示格式的转换.判断处理等.以下是 Django 过滤器列表,希望对为大家的开发带来一些方便. 一.形式:小写 ...
- Django——模板层(template)(模板语法、自定义模板过滤器及标签、模板继承)
前言:当我们想在页面上给客户端返回一个当前时间,一些初学者可能会很自然的想到用占位符,字符串拼接来达到我们想要的效果,但是这样做会有一个问题,HTML被直接硬编码在 Python代码之中. 1 2 3 ...
- $Django 模板层(变量、过滤器 、标签)、自定义(模板过滤器,标签)
1 模版语法之变量:详见源码 -{{ 变量 }}:******重要******{#相当于print了该变量#} {#只写函数名 相当于()执行了#}<p>函数:{{ test }}< ...
随机推荐
- PAT天梯赛L2-003 月饼【贪心】
L2-003. 月饼 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不 ...
- pyAudio介绍
概要 pyaudio有这么几个功能: - 提取特征 - 训练并且使用分类器 - 语音分割功能 - 内容关系可视化 python实现,好处有这么几个 - 适合做计算分析类型操作(编码少,效率不低) - ...
- 源码 time sleep
C:\Users\Administrator\.PyCharm2017.1\system\python_stubs\2083891348\time.py def sleep(seconds): # r ...
- iOS常用基础框架
一,简述 1.1,IOS操作系统的层次架构 iOS为应用程序开发提供了许多可使用的框架,并构成IOS操作系统的层次架构,分为四层,从上到下依次为:Cocoa Touch Layer( ...
- PAC 自动代理
最近看了 HTTP权威指南 里面有关于 代理的介绍,代理有很多种,今天主要来说说 自动代理PAC PAC(Proxy Auto Config) 是一个 Script:经由编写这个 Script,我们 ...
- 转:Java中字符串split() 的使用方法.
原文地址:https://blog.csdn.net/qq_27093465/article/details/54910323 挺有意思的一个问题 先看下面的方法,事先预测一下,经过split方法,按 ...
- 第三课:JAVA反射机制
基础的不想写啦,好了,直接上JAVA反射机制吧: 类对象概念: 所有的类,都存在一个类对象,这个类对象用于提供类层面的信息,比如有几种构造方法, 有多少属性,有哪些普通方法. JAVA类,他们的区别在 ...
- google浏览器mac上跨域问题解决
open -n /Applications/Google\ Chrome.app/ --args --disable-web-security --user-data-dir=/Users/ /Use ...
- 【剑指offer】调整数组顺序使奇数位于偶数前面
一.题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 二.思路: 用 ...
- git pull报错,error: cannot lock ref导致拉流失败
使用git命令删除相应refs文件,git update-ref -d refs/remotes/XXX,或者手动删除文件 简单粗暴强行git pull,执行git pull -p 原文:https: ...