Vue_过滤器

概念:Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化。过滤器可以用在两个地方:mustache 插值和 v-bind 表达式。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符指示;

  • 管道符:| 第一个命令的输出作为第二个命令的输入
  • 全局:Vue.filter(name, Function(data, arg1, arg2 …))
  • 局部:filters: {}
  • 参数解释:
    • data:被输入的值
    • argN:作为函数参数
  • 如果不需要传入参数,则可以省略括号

1.1 全局过滤器

  1. <div id="app">
  2. <p>{{ new Date() | dateFormat() }}</p>
  3. </div>

Vue.filter定义全局过滤器

  1. // 时间过滤器
  2. Vue.filter('dateFormat', (data) => {
  3. const date = new Date(data)
  4. // 获取年月日
  5. const year = date.getFullYear()
  6. const month = date.getMonth()
  7. const day = date.getDate()
  8. return `${year} ${month} ${day} 日`
  9. })

注意:当有局部和全局两个名称相同的过滤器时候,会以就近原则进行调用,即:局部过滤器优先于全局过滤器被调用!

1.2 私有过滤器

  • 私有过滤器,若全局过滤器中有同名过滤器,则优先调用私有过滤器

HTML元素:

  1. <div id="app">
  2. <p v-text="item.ctime | dataFormat('yyyy-mm-dd')"></p>
  3. </div>

私有 filters 定义方式:

  1. filters: { // 私有局部过滤器,只能在 当前 VM 对象所控制的 View 区域进行使用
  2. dataFormat(input, pattern = "") { // 在参数列表中 通过 pattern="" 来指定形参默认值,防止报错
  3. var dt = new Date(input);
  4. // 获取年月日
  5. var y = dt.getFullYear();
  6. var m = (dt.getMonth() + 1).toString().padStart(2, '0');
  7. var d = dt.getDate().toString().padStart(2, '0');
  8. // 如果 传递进来的字符串类型,转为小写之后,等于 yyyy-mm-dd,那么就返回 年-月-日
  9. // 否则,就返回 年-月-日 时:分:秒
  10. if (pattern.toLowerCase() === 'yyyy-mm-dd') {
  11. return `${y}-${m}-${d}`;
  12. } else {
  13. // 获取时分秒
  14. var hh = dt.getHours().toString().padStart(2, '0');
  15. var mm = dt.getMinutes().toString().padStart(2, '0');
  16. var ss = dt.getSeconds().toString().padStart(2, '0');
  17. return `${y}-${m}-${d} ${hh}:${mm}:${ss}`;
  18. }
  19. }
  20. }
  21. // 使用ES6中的字符串新方法 String.prototype.padStart(maxLength, fillString='') 或 String.prototype.padEnd(maxLength, fillString='')来填充字符串长度;

1.3 串联过滤器

过滤器可以串联多个,前一个过滤器的返回值作为后一个的参数

给定一个状态 status ,值为 1、2、3
1:待付款 2:待发货 3:待收货
分别设置:红色、灰色、绿色

  1. <div id="app">
  2. <span :class="1 | getStatus | setStatusColor">{{ 1 | getStatus }}</span>
  3. <span :class="2 | getStatus | setStatusColor">{{ 2 | getStatus }}</span>
  4. <span :class="3 | getStatus | setStatusColor">{{ 3 | getStatus }}</span>
  5. </div>

filters 局部过滤器

  1. filters: {
  2. // 判断是什么状态
  3. getStatus(data) {
  4. switch(data) {
  5. case 1:
  6. return '待付款'
  7. case 2:
  8. return '待发货'
  9. case 3:
  10. return '待收货'
  11. }
  12. },
  13. // 设置状态文字颜色
  14. setStatusColor(data) {
  15. switch(data) {
  16. case '待付款':
  17. return 'no-pay'
  18. case '待发货':
  19. return 'no-shipments'
  20. case '待收货':
  21. return 'take-delivery'
  22. }
  23. }
  24. }

自定义指令

  1. 自定义全局和局部的 自定义指令:
  1. // 自定义全局指令 v-focus,为绑定的元素自动获取焦点:
  2. Vue.directive('focus', {
  3. inserted: function (el) { // inserted 表示被绑定元素插入父节点时调用
  4. el.focus();
  5. }
  6. });
  7. // 自定义局部指令 v-color 和 v-font-weight,为绑定的元素设置指定的字体颜色 和 字体粗细:
  8. directives: {
  9. color: { // 为元素设置指定的字体颜色
  10. bind(el, binding) {
  11. el.style.color = binding.value;
  12. }
  13. },
  14. 'font-weight': function (el, binding2) {
  15. // 自定义指令的简写形式,等同于定义了 bind 和 update 两个钩子函数
  16. el.style.fontWeight = binding2.value;
  17. }
  18. }
  1. 自定义指令的使用方式:
  1. <input type="text" v-model="searchName" v-focus v-color="'red'" v-font-weight="900">

Vue 1.x 中 自定义元素指令【已废弃,了解即可】

  1. Vue.elementDirective('red-color', {
  2. bind: function () {
  3. this.el.style.color = 'red';
  4. }
  5. });

使用方式:

  1. <red-color>1232</red-color>

vue实例的生命周期

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

    • 创建期间的生命周期函数:

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

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

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

Vue中的动画

为什么要有动画:动画能够提高用户的体验,帮助用户更好的理解页面中的功能;

使用过渡类名

  1. HTML结构:
  1. <div id="app">
  2. <input type="button" value="动起来" @click="myAnimate">
  3. <!-- 使用 transition 将需要过渡的元素包裹起来 -->
  4. <transition name="fade">
  5. <div v-show="isshow">动画哦</div>
  6. </transition>
  7. </div>
  1. VM 实例:
  1. // 创建 Vue 实例,得到 ViewModel
  2. var vm = new Vue({
  3. el: '#app',
  4. data: {
  5. isshow: false
  6. },
  7. methods: {
  8. myAnimate() {
  9. this.isshow = !this.isshow;
  10. }
  11. }
  12. });
  1. 定义两组类样式:
  1. /* 定义进入和离开时候的过渡状态 */
  2. .fade-enter-active,
  3. .fade-leave-active {
  4. transition: all 0.2s ease;
  5. position: absolute;
  6. }
  7. /* 定义进入过渡的开始状态 和 离开过渡的结束状态 */
  8. .fade-enter,
  9. .fade-leave-to {
  10. opacity: 0;
  11. transform: translateX(100px);
  12. }

使用第三方 CSS 动画库

  1. 导入动画类库:
  1. <link rel="stylesheet" type="text/css" href="./lib/animate.css">
  1. 定义 transition 及属性:
  1. <transition
  2. enter-active-class="fadeInRight"
  3. leave-active-class="fadeOutRight"
  4. :duration="{ enter: 500, leave: 800 }">
  5. <div class="animated" v-show="isshow">动画哦</div>
  6. </transition>

使用动画钩子函数

  1. 定义 transition 组件以及三个钩子函数:
  1. <div id="app">
  2. <input type="button" value="切换动画" @click="isshow = !isshow">
  3. <transition
  4. @before-enter="beforeEnter"
  5. @enter="enter"
  6. @after-enter="afterEnter">
  7. <div v-if="isshow" class="show">OK</div>
  8. </transition>
  9. </div>
  1. 定义三个 methods 钩子方法:
  1. methods: {
  2. beforeEnter(el) { // 动画进入之前的回调
  3. el.style.transform = 'translateX(500px)';
  4. },
  5. enter(el, done) { // 动画进入完成时候的回调
  6. el.offsetWidth;
  7. el.style.transform = 'translateX(0px)';
  8. done();
  9. },
  10. afterEnter(el) { // 动画进入完成之后的回调
  11. this.isshow = !this.isshow;
  12. }
  13. }
  1. 定义动画过渡时长和样式:
  1. .show{
  2. transition: all 0.4s ease;
  3. }

v-for 的列表过渡

  1. 定义过渡样式:
  1. <style>
  2. .list-enter,
  3. .list-leave-to {
  4. opacity: 0;
  5. transform: translateY(10px);
  6. }
  7. .list-enter-active,
  8. .list-leave-active {
  9. transition: all 0.3s ease;
  10. }
  11. </style>
  1. 定义DOM结构,其中,需要使用 transition-group 组件把v-for循环的列表包裹起来:
  1. <div id="app">
  2. <input type="text" v-model="txt" @keyup.enter="add">
  3. <transition-group tag="ul" name="list">
  4. <li v-for="(item, i) in list" :key="i">{{item}}</li>
  5. </transition-group>
  6. </div>
  1. 定义 VM中的结构:
  1. // 创建 Vue 实例,得到 ViewModel
  2. var vm = new Vue({
  3. el: '#app',
  4. data: {
  5. txt: '',
  6. list: [1, 2, 3, 4]
  7. },
  8. methods: {
  9. add() {
  10. this.list.push(this.txt);
  11. this.txt = '';
  12. }
  13. }
  14. });

列表的排序过渡

<transition-group> 组件还有一个特殊之处。不仅可以进入和离开动画,还可以改变定位。要使用这个新功能只需了解新增的 v-move 特性,它会在元素的改变定位的过程中应用

  • v-movev-leave-active 结合使用,能够让列表的过渡更加平缓柔和:
  1. .v-move{
  2. transition: all 0.8s ease;
  3. }
  4. .v-leave-active{
  5. position: absolute;
  6. }

更多相关文章

  1. 04-Vue_过滤器
  2. Vue组件的注册与挂载流程,实例演示; 2. 路由原理与注册流程,实例
  3. PHP:函数的返回值和参数,实例回调函数,匿名函数的理解
  4. 驰骋工作流引擎设计系列02 流程实例的生成设计
  5. SaltStack 工作原理及安装配置实例详解 | 运维进阶
  6. 实例演示,v-if,v-for,v-model,v-bind,v-on,计算属性和侦听器属性
  7. $()的四种类型参数的应用场景实例演示;以及jq转js的方法
  8. 酱茄教你怎么用H5链接打开微信小程序
  9. PHP:实例演示PHP模块加载和JavaScript和PHP中for/forEach两种语

随机推荐

  1. Android的各种onTouch
  2. Android Style.xml 详解
  3. android 安装apk包 卸载 包
  4. Android 使用CoordinatorLayout+AppBarLa
  5. [Android] Fastest Way to Get on Track
  6. android studio SDK版本的调节
  7. android中ScrollView中TextView无法铺满
  8. "equals"和"=="的区别
  9. android 复制信息内容到剪切板 (2011-12-
  10. Android存储访问目录