Vue监听器、计算属性、过滤器和过渡动画

前端框架学习笔记

第三章 Vue监听器、计算属性、过滤器和过渡动画

监听器

Vue提供了watch选择项,这是一个更通用的方法来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有效的。

new Vue({
    watch:{
        //浅监听,参数可省略
        value(newV,oldV){
            //逻辑
        }//深度监听不建议使用,因为会造成页面卡顿,如果要使用的话,建议转换成简单类型使用。
        json:{
        	handler(){
    			//逻辑
			},
        	deep:true
        }
	}
})

注意:优就业课本上说监听数组也需要深度监听,但是亲测,监听数组不需要深度监听,浅监听就可以,不管是一层还是嵌套多层。如下:

<div id="app">
    <input type="text" v-model='arr[0]'>
    <input type="text" v-model="arr1[2][1]">
</div>
new Vue({
    el:'#app',
    data:{
        arr:[1,2,3,4,5],
        arr1:[1,2,[3,4]]
    },
    watch:{
        arr(){
            console.log('arr改变了!')
        },
        arr1(){
            console.log("arr1改变了!")
        }
    }
})
//改变输入框的值,均能触发监听器。

有博主分析Vue源码得出结论,watch监听判断的是数据否是对象类型,是对象类型则必须使用深度监听,不论是一层才是多层。

过滤器

Vue允许自定义过滤器,可用于一些常见的文本格式化。

目的:转换数据

使用: 双括号、v-bind

<!--{{ | }}-->
<div>
    {{变量 | 过滤器名称}}
</div>

<!--v-bind,该方法从2.1.0版本之后开始支持-->
<div v-bind:id="变量 | 过滤器名称"></div>

定义:推荐全局定义

//全局定义
Vue.filter("过滤器名称",(过滤对象)=>{
    //逻辑 
    return "你要的结果"
})
//局部定义
new Vue({
    filters:{
        //全局定义
		过滤器名称(过滤对象){
            //逻辑 
    		return "你要的结果"
        }
    }
})

计算属性

Vue提供了计算属性,它不需要在data里面定义,就能返回需要的值,并且能进行大量计算。

new Vue({
    computed:{//计算属性
        a(){
            return 10
        },
        ava(){
            //运算逻辑
            var sum=0
            this.students.forEach(item=>{
                sum+=item.score
            })
            //通过return返回
            return (sum/this.students.length).toFixed(2);
        }
    }
})

在Vue中,计算属性可以被视为是data一样的,可以读取和设值,因此在计算属性中可以分成getter和setter,一般情况下是没有setter的,computed预设只有getter,也就是只能读取,不能改变,设值,但是可以通过依赖变量改变值。

var vm = new Vue({
    el: '#app',
    data:{
        a: 3,
        b: 4
    },
    computed: { //计算属性
        c: {
            get() {
                console.log("c被获取了!");
                return Number(this.a) + Number(this.b);
            },
            set(v) {
                //设置的值
                console.log('set:' + v);
                //实际c的值
                console.log(vm.c);
            }
        }
    }
})
<div id="app">
    <input type="text" v-model='a' placeholder="a">+
    <input type="text" v-model='b' placeholder="b">=
    <input type="text" v-model="c" placeholder="c">
</div>

原始状态

在这里插入图片描述

改变a时,get()方法被调用。

在这里插入图片描述

改变c绑定的输入框,c的值并不会被改变,只是set()方法被调用了。

在这里插入图片描述

注意:

1、v-for和v-if不能作用在同一个标签,虽然有时候有效果,但是Vue官方声明该语法不合法。这时候可以用计算属性computed解决该方面的需求。

参考:https://cn.vuejs.org/v2/guide/list.html#v-for-%E4%B8%8E-v-if-%E4%B8%80%E5%90%8C%E4%BD%BF%E7%94%A8

2、如果数组数据改变,页面不渲染,可以采用以下方法解决。

//1、this.arr.splice(下标,1,新值);
this.arr.splice(index,1,newValue)

//2、vm.$set(arr,下标,新值)
this.$set(this.arr,index,newValue)

//3、Vue.set(arr,下标,新值)
Vue.set(this.arr,index,newValue)

3、如果是json数据发生了改变,页面不渲染,可以用以下方法解决。

//1、vm.$set
this.$set(this.json,改变的属性,newValue);
//2、Vue.set
Vue.set(this.json,改变的属性,newValue);

jsonp

ajax不能跨域 get、post

jsonp可以跨域,只能以 get方式请求

jsonp跨域的要求:提供回调函数(一般是callback或cb)和数据接口的规则。

var vm = new Vue({
    el: "#app",
    data: {
        value: "",
        results: ''
    },
    methods: {
        enter() {
            if (this.value != '') {
                //console.log(this.value)
                //创建script标签
                var os = document.createElement('script');
                //设置src属性
                os.src = "https://api.asilu.com/fanyi?callback=cbb&q=" + this.value;
                //将src属性添加到页面中
                document.body.appendChild(os)
            } else {
                this.value = '';
            }
        },
    }
})
//回调函数必须是全局函数
function cbb(d) {
    vm.results = d.data;
    console.log(d);
}

动画

Vue在插入、更新或者移除DOM时,提供多种不同方式的应用过渡效果,包括以下工具:

  • 在CSS过渡和动画中自动应用class
  • 可以配合使用第三方CSS动画库,如Animate.css
  • 在过渡钩子函数中使用js直接操作DOM
  • 配合使用第三方js动画库,如Velocity.js
使用场景

Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡 。

  • 条件渲染(v-if)
  • 条件展示(v-show)
  • 动态组件
  • 路由

当插入或删除包含在 transition 组件中的元素时,Vue 将会做以下处理:

  • 1-自动嗅探目标元素是否应用了 CSS 过渡或动画,如果是,在恰当的时机添加/删除 CSS 类名。
  • 2-如果过渡组件提供了 JavaScript 钩子函数,这些钩子函数将在恰当的时机被调用。
  • 3-如果没有找到 JavaScript 钩子并且也没有检测到 CSS 过渡/动画,DOM 操作 (插入/删除) 在下一帧中立即执行。(注意:此指浏览器逐帧动画机制,和 Vue 的 nextTick 概念不同)
状态

在进入/离开的过渡中,会有 6 个 class 切换:

  • v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。
  • v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。
  • v-enter-to:2.1.8 版及以上定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。
  • v-leave:定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。
  • v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。
  • v-leave-to:2.1.8 版及以上定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。
<button v-if='!isshow'>
<transition name='animate'>
    <div class='box' v-if="isshow"></div> 
</transition>

对于这些在过渡中切换的类名来说,如果你使用一个没有名字的 ,则 `v-` 是这些类名的默认前缀。如果你使用了(如上面取名为‘animate’),那么 v-enter 会替换为animate-enter

v-enter-activev-leave-active 可以控制进入/离开过渡的不同的缓和曲线 。

这里只简要介绍了Vue动画的部分内容,详情参考官网

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值