Vue-指令、自定义过滤器

最近做的项目,一直用的Angular6.0框架,期间陆陆续续完成了三四个项目。业务知识有一定的提升,但是一直用一个框架,只会增加对该框架的熟练度,并不能得到技术上的突破。
也许,自己对Angular的认识也是浅尝辄止,但是前端技术日新月异,想要精通某一个框架,实在精力不够(最多熟练应用),说不定,某一天这个框架就凉凉了,而如今,国内Vue很是火热,招聘要求最多,这“究竟是人性的扭曲还是道德的沦丧”,让我们踏进Vue的世界,一探究竟。

Angular2+,用的是typescript,而vue3.0即将发布,也用的是typescript,期间也学过一遍vue2.0,这次温故而知新,等vue3.0发布,就可以直接上手了。

那么,现在从小白开始,重温Vue2.x吧!

一. Vue简介

Vue2.x中文官方文档

1. Vue.js初识

Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合。另一方面,Vue 完全有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用。
Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件

知乎解释:Vue2.0 中,“渐进式框架”和“自底向上增量开发的设计”这两个概念是什么?

2.Vue起步

1. 安装

  • 下载核心库文件
bower info vue
npm init --yes
cnpm install vue --save
  • 像Jquery一样引入到你的html文档中
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="./node_modules/vue/dist/vue.min.js"></script>

这里将Vuejs当做一个js库来使用,也可以使用vue-cli,后续会用到。

2. 安装调试工具vue-devtools插件

安装调试工具vue-devtools插件,便于在浏览器中调试vue

3.牛刀小试

<!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>初识Vue</title>
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <!--<script src="./node_modules/vue/dist/vue.min.js"></script>-->
    
    <script>
        window.onload = () => {
        const app = new Vue({
            el: '#app',
            data: {
                message: 'Hello Vue!'
            }
        })
        }
    </script>
</head>
<body>
<div id="app">
    {{ message }}
</div>
</body>
</html>

4.vue核心基础知识

1. 模板语法

{{data}}, 即Mustache语法

2. 指令

指令:用来扩展html标签的功能

angularjs中常用的指令:
    ng-model
    ng-repeat
    ng-click
    ng-show/ng-hide
    ng-if
    
angularTs中常用的指令:
    ([ngModel])
     *ngIf
     *ngFor
     [ngClass]
     [ngSwitch]
     [ngStyle]
     
vuejs中常用的指令:
    v-model
    v-if
    v-for
    v-on
    v-show
    v-bind
    v-once

vuejs中常用的指令介绍

  • v-model

    • 类型: 随表单控件类型不同而不同。
    • 限制:
      • <input>
      • <select>
      • <textarea>
      • components
    • 修饰符:
      • .lazy - 取代 input 监听 change 事件
      • .number - 输入字符串转为数字
      • .trim - 输入首尾空格过滤

    在表单控件或者组件上创建双向绑定。

    <input type="text" class="form-control" id="email" v-model="user.email" placeholder="请输入邮箱">
    
  • v-for

    • 类型: Array | Object | number | string

    基于源数据多次渲染元素或模板块。此指令之值,必须使用特定语法 alias in expression ,为当前遍历的元素提供别名:

    <div v-for="item in items">
      {{ item.text }}
    </div>
    
    <!--也可以用for of-->
    <div v-for="item of items">{{ item.text }}</div>
    
     <!--value 和 key 与 index-->
    <div v-for="(item, index) in items"></div>
    <div v-for="(val, key) in objects"></div>
    <div v-for="(val, key, index) in objects"></div>
    
    <!--整数迭代,结果:1 2 3 4 5 6 7 8 9 10-->
    <div>
      <span v-for="n in 10">{{ n }}</span>
    </div>
    
    <!--提供一个 key 的特殊属性:key的作用主要是为了高效的更新虚拟DOM-->
    <div v-for="item in items" :key="item.id">
      {{ item.text }}
    </div>
    

v-for中:key的作用主要是为了高效的更新虚拟DOM
Vue2.0 v-for 中 :key 到底有什么用?

  • v-on

    用来绑定事件,用法:v-on:事件="函数",缩写:@
    如:v-on:click="",简写方式 @click=""

    修饰符:

    • .stop - 调用 event.stopPropagation()
    • .prevent - 调用 event.preventDefault()
    • .capture - 添加事件侦听器时使用 capture 模式。
    • .self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
    • .{keyCode | keyAlias} - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
    • .native - 监听组件根元素的原生事件。

    用在普通元素上时,只能监听 原生 DOM 事件。用在自定义元素组件上时,也可以监听子组件触发的自定义事件

    在监听原生 DOM 事件时,方法以事件为唯一的参数。如果使用内联语句,语句可以访问一个 $event 属性: v-on:click="handle('ok', $event)"

    <!-- 方法处理器 -->
    <button v-on:click="doThis"></button>
    <!-- 内联语句 -->
    <button v-on:click="doThat('hello', $event)"></button>
    <!-- 缩写 -->
    <button @click="doThis"></button>
    <!-- 停止冒泡 -->
    <button @click.stop="doThis"></button>
    <!-- 阻止默认行为 -->
    <button @click.prevent="doThis"></button>
    <!-- 阻止默认行为,没有表达式 -->
    <form @submit.prevent></form>
    <!--  串联修饰符 -->
    <button @click.stop.prevent="doThis"></button>
    <!-- 键修饰符,键别名 -->
    <input @keyup.enter="onEnter">
    <!-- 键修饰符,键代码 -->
    <input @keyup.13="onEnter">
    

    在子组件上监听自定义事件(当子组件触发 “my-event” 时将调用事件处理器):

    <my-component @my-event="handleThis"></my-component>
    <!-- 内联语句 -->
    <my-component @my-event="handleThis(123, $event)"></my-component>
    <!-- 组件中的原生事件 -->
    <my-component @click.native="onClick"></my-component>
    
  • v-show

    • 类型: any

    用来显示或隐藏元素,v-show是通过display实现,v-if是每次删除后再重新创建,与angularjs中类似

    <div v-show="flag">如果flag=false我就不显示(display:none)</div>
    
  • v-if

    • 类型: any

    根据表达式的值的真假条件渲染元素。在切换时元素及它的数据绑定 / 组件被销毁并重建。如果元素是 <template> ,将提出它的内容作为条件块。
    当条件变化时该指令触发过渡效果。(删除重绘)

    <div v-if="flag">如果flag=true我就显示(删除重绘)</div>
    
  • v-else
    前一兄弟元素必须有 v-if。

    <div v-if="Math.random() > 0.5">
      Now you see me
    </div>
    <div v-else>
      Now you don't
    </div>
    
  • v-bind

    • 缩写: :
    • 类型: any (with argument) | Object (without argument)
    • 修饰符:
      .prop - 被用于绑定 DOM 属性。

    动态地绑定一个或多个特性,或一个组件 prop 到表达式。

    在绑定 classstyle 特性时,支持其它类型的值,如数组或对象。

    在绑定 prop 时,prop 必须在子组件中声明。可以用修饰符指定不同的绑定类型。

    没有参数时,可以绑定到一个包含键值对的对象。注意此时 class 和 style 绑定不支持数组和对象。

    <!-- 绑定一个属性 -->
    <img v-bind:src="imageSrc">
    <!-- 缩写 -->
    <img :src="imageSrc">
    
    <!-- class 绑定 -->
    <div :class="{ red: isRed }"></div>
    <div :class="[classA, classB]"></div>
    <div :class="[classA, { classB: isB, classC: isC }]">
    
    <!-- style 绑定 -->
    <div :style="{ fontSize: size + 'px' }"></div>
    <div :style="[styleObjectA, styleObjectB]"></div>
    
    <!-- 绑定一个有属性的对象 -->
    <div v-bind="{ id: someProp, 'other-attr': otherProp }"></div>
    
    <!-- 通过 prop 修饰符绑定 DOM 属性 -->
    <div v-bind:text-content.prop="text"></div>
    
    <!-- prop 绑定. “prop” 必须在 my-component 中声明。 -->
    <my-component :prop="someThing"></my-component>
    
    <!-- XLink -->
    <svg><a :xlink:special="foo"></a></svg>
    
  • v-text

    • 类型: string

    更新元素的 textContent。如果要更新部分的 textContent ,需要使用 {{ Mustache }} 插值。(相当于模板语法{{}})

    <span v-text="msg"></span>
    <!-- 和下面的一样 -->
    <span>{{msg}}</span>
    
  • v-html

    • 类型: string

    更新元素的 innerHTML 。注意:内容按普通 HTML 插入 - 不会作为 Vue 模板进行编译 。如果试图使用 v-html 组合模板,可以重新考虑通过是否通过使用组件来替代。

    <div v-html="html"></div>
    
  • v-pre

    跳过这个元素和它的子元素的编译过程。可以用来显示原始 Mustache 标签。跳过大量没有指令的节点会加快编译。

    <span v-pre>{{ this will not be compiled }}</span>
    
  • v-cloak

    这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。

     [v-cloak] {
       display: none;
     }
    
    <!--不会显示,直到编译结束。-->
     <div v-cloak>
       {{ message }}
     </div>
    
  • v-once

    只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。

    <!-- 单个元素 -->
    <span v-once>This will never change: {{msg}}</span>
    <!-- 有子元素 -->
    <div v-once>
      <h1>comment</h1>
      <p>{{msg}}</p>
    </div>
    <!-- 组件 -->
    <my-component v-once :comment="msg"></my-component>
    <!-- v-for 指令-->
    <ul>
      <li v-for="i in list" v-once>{{i}}</li>
    </ul>
    

3. 过滤器

用来过滤模型数据,在显示之前进行数据处理和筛选
语法:{{ data | filter1(参数) | filter2(参数)}}

由于vue2.x中已经没有内置过滤器,所以我们需要自定义过滤器。

自定义全局过滤器

使用全局方法Vue.filter(过滤器ID,过滤器函数)

Vue.filters('lowercase', function(value){
          // 处理value值,比如:转为小写
          return value.toLowerCase();
        })
Vue.filter('date',data => {
            let d=new Date(data);
            return d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate()+' '+d.getHours()+':'+d.getMinutes()+':'+d.getSeconds();
        });
        
// getter,返回已注册的过滤器
var myFilter = Vue.filter('my-filter');

自定义局部过滤器

局部过滤器,如果和全局过滤器名称相同,会覆盖掉全局过滤器。

let vm=new Vue({
    el:'#app',
    data:{
        currentTime:Date.now()
    },
    filters:{ //局部过滤器
        number:(data,n) => {
            return data.toFixed(n);
        },
        date: data => {
            let d=new Date(data);
            return d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate()+' '+d.getHours()+':'+d.getMinutes()+':'+d.getSeconds();
        }
});

练习:英雄列表管理

英雄列表
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容