JavaScript

超轻量级php框架startmvc

vue 指令和过滤器的基本使用(品牌管理案例)

更新时间:2020-09-20 19:24:01 作者:startmvc
过滤器的基本使用定义一个过滤器<divid="app"><p>{{msg|msgFormat('疯狂+1','123')|test}}</p&

过滤器的基本使用

定义一个过滤器


<div id="app">
 <p>{{ msg | msgFormat('疯狂+1', '123') | test }}</p>
 </div>
// 定义一个 Vue 全局的过滤器,名字叫做 msgFormat
 Vue.filter('msgFormat', function (msg, arg, arg2) {
 // 字符串的 replace 方法,第一个参数,除了可写一个 字符串之外,还可以定义一个正则
 return msg.replace(/单纯/g, arg + arg2)
 })

 Vue.filter('test', function (msg) {
 return msg + '========'
 })
 // 创建 Vue 实例,得到 ViewModel
 var vm = new Vue({
 el: '#app',
 data: {
 msg: '曾经,我也是一个单纯的少年,单纯的我,傻傻的问,谁是世界上最单纯的男人'
 },
 methods: {}
 });

过滤器可以使用多个·

下面js代码的HTML部分


<div id="app">
 <!-- {{1+1}} -->
 <div class="panel panel-primary">
 <div class="panel-heading">
 <h3 class="panel-title">添加品牌</h3>
 </div>
 <div class="panel-body form-inline">
 <label>
 Id:
 <input type="text" class="form-control" v-model="id">
 </label>
 <label>
 Name:
 <input type="text" class="form-control" v-model="name" @keyup.f2="add">
 </label>
 <!-- 在Vue中,使用事件绑定机制,为元素指定处理函数的时候,如果加了小括号,就可以给函数传参了 -->
 <input type="button" value="添加" class="btn btn-primary" @click="add()">
 <label>
 搜索名称关键字:
 <!-- 注意: Vue中所有的指令,在调用的时候,都以 v- 开头 -->
 <input type="text" class="form-control" v-model="keywords" id="search" v-focus v-color="'green'">
 </label>
 </div>
 </div>
 <table class="table table-bordered table-hover table-striped">
 <thead>
 <tr>
 <th>Id</th>
 <th>Name</th>
 <th>Ctime</th>
 <th>Operation</th>
 </tr>
 </thead>
 <tbody>
 <!-- 之前, v-for 中的数据,都是直接从 data 上的list中直接渲染过来的 -->
 <!-- 现在, 我们自定义了一个 search 方法,同时,把 所有的关键字,通过传参的形式,传递给了 search 方法 -->
 <!-- 在 search 方法内部,通过 执行 for 循环, 把所有符合 搜索关键字的数据,保存到 一个新数组中,返回 -->
 <tr v-for="item in search(keywords)" :key="item.id">
 <td>{{ item.id }}</td>
 <td v-text="item.name"></td>
 <td>{{ item.ctime | dateFormat() }}</td>
 <td>
 <a href="" @click.prevent="del(item.id)">删除</a>
 </td>
 </tr>
 </tbody>
 </table>
 </div>

定义一个私有过滤器和私有指令


// 如何自定义一个私有的过滤器(局部)
 var vm2 = new Vue({
 el: '#app2',
 data: {
 dt: new Date()
 },
 methods: {},
 filters: { // 定义私有过滤器 过滤器有两个 条件 【过滤器名称 和 处理函数】
 // 过滤器调用的时候,采用的是就近原则,如果私有过滤器和全局过滤器名称一致了,这时候 优先调用私有过滤器
 dateFormat: function (dateStr, pattern = '') {
 // 根据给定的时间字符串,得到特定的时间
 var dt = new Date(dateStr)
 // yyyy-mm-dd
 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} ~~~~~~~`
 }
 }
 },
 directives: { // 自定义私有指令
 'fontweight': { // 设置字体粗细的
 bind: function (el, binding) {
 el.style.fontWeight = binding.value
 }
 },
 'fontsize': function (el, binding) { // 注意:这个 function 等同于 把 代码写到了 bind 和 update 中去
 el.style.fontSize = parseInt(binding.value) + 'px'
 }
 }
 })
 // 过滤器的定义语法
 // Vue.filter('过滤器的名称', function(){})
 // 过滤器中的 function ,第一个参数,已经被规定死了,永远都是 过滤器 管道符前面 传递过来的数据
 /* Vue.filter('过滤器的名称', function (data) {
 return data + '123'
 }) */

全局过滤器


// 全局的过滤器, 进行时间的格式化
 // 所谓的全局过滤器,就是所有的VM实例都共享的
 Vue.filter('dateFormat', function (dateStr, pattern = "") {
 // 根据给定的时间字符串,得到特定的时间
 var dt = new Date(dateStr)
 // yyyy-mm-dd
 var y = dt.getFullYear()
 var m = dt.getMonth() + 1
 var d = dt.getDate()
 // return y + '-' + m + '-' + d
 if (pattern.toLowerCase() === 'yyyy-mm-dd') {
 return `${y}-${m}-${d}`
 } else {
 var hh = dt.getHours()
 var mm = dt.getMinutes()
 var ss = dt.getSeconds()
 return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
 }
 })
// 自定义全局按键修饰符
 Vue.config.keyCodes.f2 = 113
Vue.directive() 定义全局的指令
 // 其中:参数1 : 指令的名称,注意,在定义的时候,指令的名称前面,不需要加 v- 前缀, 
 // 但是: 在调用的时候,必须 在指令名称前 加上 v- 前缀来进行调用
 // 参数2: 是一个对象,这个对象身上,有一些指令相关的函数,这些函数可以在特定的阶段,执行相关的操作
 Vue.directive('focus', {
 bind: function (el) { // 每当指令绑定到元素上的时候,会立即执行这个 bind 函数,只执行一次
 // 注意: 在每个 函数中,第一个参数,永远是 el ,表示 被绑定了指令的那个元素,这个 el 参数,是一个原生的JS对象
 // 在元素 刚绑定了指令的时候,还没有 插入到 DOM中去,这时候,调用 focus 方法没有作用
 // 因为,一个元素,只有插入DOM之后,才能获取焦点
 // el.focus()
 },
 inserted: function (el) { // inserted 表示元素 插入到DOM中的时候,会执行 inserted 函数【触发1次】
 el.focus()
 // 和JS行为有关的操作,最好在 inserted 中去执行,放置 JS行为不生效
 },
 updated: function (el) { // 当VNode更新的时候,会执行 updated, 可能会触发多次

 }
 })

自定义一个字体颜色的指令


 // 自定义一个 设置字体颜色的 指令
 Vue.directive('color', {
 // 样式,只要通过指令绑定给了元素,不管这个元素有没有被插入到页面中去,这个元素肯定有了一个内联的样式
 // 将来元素肯定会显示到页面中,这时候,浏览器的渲染引擎必然会解析样式,应用给这个元素
 bind: function (el, binding) {
 // el.style.color = 'red'
 // console.log(binding.name)
 // 和样式相关的操作,一般都可以在 bind 执行
 // console.log(binding.value)
 // console.log(binding.expression)
 el.style.color = binding.value
 }
 })

总结

以上所述是小编给大家介绍的vue 指令和过滤器的基本使用(品牌管理案例),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

vue 指令和过滤器 vue 过滤器