过滤器
自定义全局过滤器
自定义全局过滤器
全局过滤器的基本使用
使用全局方法Vue.filter() 自定义一个全局过滤器。 每一个Vue对象实例(每一个VM实例)都可以拿到这个过滤器。它接收两个参数:过滤器的名称、过滤器函数
- 在插值表达式中使用
<p>{{msg | msgFormat}}</p> 管道符前面的msg即为要过滤的文本内容) 管道符后面的msgFormat即为过滤器
Linux管道符(管道操作符):可以把一个命令的标准输出传送到另一个命令的标准输入中,连续的| 意味着第一个命令的输出为第二命令的输入,第二个命令的输入为第一个命令的输出,第二个命令的输出为第三个命令的输入…以此类推
- 定义过滤器
Vue.filter('msgFormat', function (myMsg) {
return myMsg.replace(/单纯/g, '邪恶')
})
Vue.filter('名称', 函数) 其中第一个参数指的过滤器的名称(必须与管道符后的名称完全一致),第二个参数为过滤器函数- 过滤器函数function中,第一个参数指管道符前面的msg
String.prototype.replace() 该方法用于替换匹配的字符串,一般情况下只替换第一个匹配(除非使用带有g 的正则表达式)
示例代码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="../code/lib/vue.js"></script>
</head>
<body>
<div id="app">
<p>{{ msg }}</p>
<p>{{ msg | msgFormat }}</p>
</div>
<script>
Vue.filter ('msgFormat', function(msg) {
return msg.replace(/单纯/g, '邪恶')
})
var vm = new Vue({
el: '#app',
data: {
msg: '曾经,我也是一个单纯的少年,单纯的我,傻傻的问,谁是世界上最单纯的男人'
},
methods: {}
});
</script>
</body>
</html>
示例效果:
给过滤器添加一个或多个参数
过滤器加一个参数
将msg中的单纯替换为xxx变量
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="vue2.5.16.js"></script>
</head>
<body>
<div id="app">
<!-- 通过过滤器 msgFormat 对 msg 进行过滤。括号里的参数代表 function中的 arg2-->
<p>{{ msg | msgFormat('牛bee') }}</p>
</div>
<script>
Vue.filter('msgFormat', function (msg, arg2) {
return msg.replace(/单纯/g, arg2)
})
var vm = new Vue({
el: '#app',
data: {
msg: '曾经,我也是一个单纯的少年,单纯的我,傻傻的问,谁是世界上最单纯的男人'
},
methods: {}
});
</script>
</body>
</html>
过滤器加两个参数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="vue2.5.16.js"></script>
</head>
<body>
<div id="app">
<!-- 通过 过滤器 msgFormat 对 msg 进行过滤-->
<!-- 括号里的第一个参数代表 function 中的 arg2,括号里的第二个参数代表 function 中的 arg3-->
<p>{{ msg | msgFormat('niubee', '+++') }}</p>
</div>
<script>
Vue.filter('msgFormat', function (myMsg, arg2, arg3) {
return myMsg.replace(/单纯/g, arg2 + arg3)
})
var vm = new Vue({
el: '#app',
data: {
msg: '曾经,我也是一个单纯的少年,单纯的我,傻傻的问,谁是世界上最单纯的男人'
},
methods: {}
});
</script>
</body>
</html>
同时使用多个过滤器
添加多个过滤器的实现思路:将msg交给第一个过滤器来处理,然后将处理后的结果交给第二个处理器来处理
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="../../code/lib/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 通过 两个过滤器(msgFormat、myFilter2)对 msg 进行过滤-->
<!-- 将 msg 交给第一个过滤器来处理,然后将处理的结果交给第二个过滤器来处理-->
<p>{{ msg }}</p>
<p>{{ msg | msgFormat('niubee', '+++') | myFilter2}}</p>
</div>
<script>
Vue.filter('msgFormat', function (myMsg, arg2, arg3) {
return myMsg.replace(/单纯/g, arg2 + arg3)
})
Vue.filter('myFilter2', function (myMsg) {
return myMsg + '[--第二个过滤器--]'
})
var vm = new Vue({
el: '#app',
data: {
msg: '曾经,我也是一个单纯的少年,单纯的我,傻傻的问,谁是世界上最单纯的男人'
},
methods: {}
});
</script>
</body>
</html>
示例1:时间格式化
使用ES6新增的字符串方法 String.prototype.padStart(maxLength, fillString='') 或String.prototype.padEnd(maxLength, fillString='') 来填充字符串。pad 即补充 .
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="../../code/lib/vue.js"></script>
</head>
<body>
<div id="app">
{{ time }}
<br/>
{{ time | dataFormat }}
<br>
{{ time | dataFormat('yyyy-mm-dd') }}
</div>
<div id="app1">
<br>
{{ time | dataFormat }}
</div>
</body>
<script>
Vue.filter('dataFormat', function (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')
if(pattern.toLowerCase() === 'yyyy-mm-dd') {
return `${y}-${m}-${d}`
} else {
var hh = dt.getHours().toString().padStart(2,'0')
var mm = dt.getMinutes().toString().padStart(2,'0')
var ss = dt.getSeconds().toString().padStart(2,'0')
return `${y}-${m}-${d} ${hh}:${mm}:${ss} ~~`
}
});
new Vue({
el: '#app',
data: {
time: new Date()
}
})
new Vue({
el: '#app1',
data: {
time: new Date()
}
});
</script>
</html>
pattern 参数: 在做if(pattern && pattern.toLowerCase() === 'yyyy-mm-dd') 判断时,逻辑上是先保证pattern参数穿进来了,然后再继续后面的判断
如果写成了if(pattern.toLowerCase() === 'yyyy-mm-dd') 则可能在调用的时候不传入pattern参数从而造成错误。此时if语句相当于if(undefined.toLowerCase() === 'yyyy-mm-dd')
举例2:列表功能
使用ES6新增String.prototype.includes() 返回布尔值,表示是否找到了参数字符串
<!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>列表功能</title>
<script src="../code/lib/vue.js"></script>
<style>
*{
margin: 0;
padding: 0;
}
.table {
width: 800px;
margin: 20px auto;
border-collapse: collapse;
}
.table th {
background-color: #0094ff;
color: white;
font-size: 16px;
border: 1px solid black;
padding: 5px;
}
.table tr td {
text-align: center;
font-size: 16px;
padding: 5px;
border: 1px solid black;
}
.form {
width: 800px;
margin: 20px auto;
}
.form button {
margin-left: 5px;
}
.form label {
width: 100%;
}
</style>
</head>
<body>
<div id="app">
<div class="form">
编号:<input type="text" v-model="formData.id">
名称:<input type="text" v-model="formData.name">
<button @click="addData">添加</button>
<label>
搜索名称关键字:
<input id="sch" type="text" v-model="formData.keywords">
</label>
</div>
<table class="table">
<th>编号</th>
<th>名称</th>
<th>创建时间</th>
<th>操作</th>
<!-- v-for 中的数据,都是直接从 data 上的list中直接渲染过来的 -->
<!-- 现在我们自定义一个 search 方法,同时把所有的关键字,通过传参的形式,传递给了 search方法 -->
<!-- 在 search 方法内部,通过执行for循环,把所有符合搜索关键字的数据,保存到一个新数组中并返回 -->
<tr v-for="item in search(formData.keywords)" :key="item.id">
<td>{{item.id}}</td>
<td>{{item.name}}</td>
<td>{{item.ctime | dataFormat('yyyy-mm-dd')}}</td>
<td><a href="#" @click.prevent="delData(item.id)">删除</a></td>
</tr>
<!-- 无数据时,增加提示 -->
<tr v-if="list.length == 0">
<td colspan="4">列表无数据</td>
</tr>
</table>
</div>
<script>
Vue.filter('dataFormat', function (dataStr, pattern="") {
var dt = new Date(dataStr)
var y = dt.getFullYear()
var m = (dt.getMonth() + 1).toString().padStart(2,'0')
var d = dt.getDate().toString().padStart(2,'0')
if(pattern.toLowerCase() === 'yyyy-mm-dd') {
return `${y}-${m}-${d}`
} else {
var hh = dt.getHours().toString().padStart(2,'0')
var mm = dt.getMinutes().toString().padStart(2,'0')
var ss = dt.getSeconds().toString().padStart(2,'0')
return `${y}-${m}-${d} ${hh}:${mm}:${ss} ~~~~~`
}
})
var vm = new Vue({
el: '#app',
data: {
list: [
{id: 1, name: '奔驰', ctime: new Date},
{id: 2, name: 'AE86', ctime: new Date}
],
formData: {
id: '',
name: '',
keywords: '',
},
},
methods: {
addData() {
var p = {id: this.formData.id, name: this.formData.name, ctime: new Date()}
this.list.push(p)
this.formData.id = ''
this.formData.name = ''
},
delData(id) {
if(!confirm('是否要删除数据?')) {
return
}
this.list.some((item, i) => {
if(item.id == id) {
this.list.splice(i, 1)
return true
}
})
},
search(keywords) {
return this.list.filter(item => {
if(item.name.includes(keywords)) {
return item
}
})
}
}
});
document.getElementById("sch").focus()
</script>
</body>
</html>
自定义私有过滤器
私有过滤器:即在一个vue对象内部定义的过滤器。这种过滤器只有在当前vue对象的el指定的监管区域有作用。
过滤器调用的时候,采用的是就近原则,如果私有过滤器和全局过滤器名称一致了,这时候 优先调用私有过滤器。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="../code/lib/vue.js"></script>
</head>
<body>
<div id="app">
<p>{{ msg }}</p>
全局过滤器: <span>{{ msg | msgFormat('牛bee')}}</span>
</div>
<div id="app2">
私有过滤器: <span>{{ msg | msgFormat('Crazy')}}</span>
</div>
<script>
Vue.filter ('msgFormat', function(msg, arg) {
return msg.replace(/单纯/g, arg)
})
var vm = new Vue({
el: '#app',
data: {
msg: '曾经,我也是一个单纯的少年,单纯的我,傻傻的问,谁是世界上最单纯的男人'
},
methods: {}
});
var vm2 = new Vue ({
el: '#app2',
data: {
msg: '曾经,我也是一个单纯的少年,单纯的我,傻傻的问,谁是世界上最单纯的男人'
},
methods: {
},
filters: {
msgFormat: function(msg, arg) {
return msg.replace(/单纯/g, arg)
}
}
})
</script>
</body>
</html>
github-vue基础-过滤器
|