vuejs 中的 computed,watch(和 filter)

我们现在已经知道如何把模型中的数据放到视图里,但这里有一个问题,如果我们模型里的数据要经过处理才能放到视图上的话,我们就需要用到方法。比如说我们在模型里有一个 username 属性,它的值是小写的,但是我们想把它转换成大写,我们就要对数据进行处理,如下面的代码所示

<div id="box">
   <h3>{{ name }}</h3>
   <h3>{{ name.toUpperCase() }}</h3>
</div>
<script>
    var vm = new Vue({
        el: "#box",
        data: {
            name: 'lili',
        }
    })
</script>

上面的方法是直接在插值表达式里使用方法,我们知道插值表达式是支持方法的,所以没问题,能得到我们想要的结果。但是这还只是简单的一个方法,如果它很复杂的话,我们直接写在插值表达式里就很不好了,不好看,也会让页面加载负荷变大。那我们是不是可以在别的地方先把这个操作做完,然后在差值表达式里调用,这样不就可以了吗。而在vuejs 里也提供了这么一个空间(computed),让我们可以再里面写逻辑业务

computed:计算属性

computed 翻译过来叫做计算出来,意思是某个属性是依靠其他的模型变量进行计算得来的。它其实也是一个对象,用来存放方法的

特点:它里面定义属性是依赖于其他的属性的,并且计算属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。注意,如果某个依赖 (比如非响应式属性) 在该实例范畴之外,则计算属性是不会被更新的。

注意:1:computed 和data 一样是 Vue 里面的一个属性,它和 data 还有 el 是同级的
2:我们一般用 es6 语法去写函数,更便利
3:计算属性将被混入到 Vue 实例中,里面的所有 this 都是指向 Vue
4:所以在里面最好不要使用箭头函数,因为如果你使用了箭头函数,那么 this 就会指向 window
5:我们在用它的时候不要加(),在 computed 里面,是属性方法调用,函数方法书写,所以不要加()!不要加()!不要加()!

我们来看上面的例子,上面是直接在插值表达式里进行运算,现在我们可以在 computed 里先执行,然后把值返回到视图就可以了

computed 演示
<div id="box">
   <h3>{{ name }}</h3>
   <h3>{{ upperName }}</h3>
</div>
<script>
    var vm = new Vue({
        el: "#box",
        data: {
            name: 'lili',
        },
        computed: {
        //es6 语法
        upperName (){
        	return this.name.toUpperCase();
        	}
        }
    })
</script>

从上面可以看出,computed 计算属性的实质是 封装一个函数,然后在需要的地方去调用它,我们想到,之前我们说过 methods 这个属性就是用来存放方法的,那为什么我们不把这个方法放到 methods 里呢?我们用 methods 试一下

methods 演示
<div id="box">
   <h3>{{ name }}</h3>
   
   <h3>{{ upperName }}</h3>
   <h3>{{ upperName }}</h3>
   
   <h3>{{ mName() }}</h3>
   <h3>{{ mName() }}</h3>
</div>
<script>
    var vm = new Vue({
        el: "#box",
        data: {
            name: 'lili',
        },
        computed:{
            upperName ( ){
                return this.name.toUpperCase();
            }
        },
        methods: {
            mName ( ){
                return this.name.toUpperCase();
            }
        }
    })
</script>

我们可以看到,methods 也可以实现效果,那他们之间有什么不同呢?

computed 和 methods 的不同

1:computed 是属性方法调用,函数方法书写,在使用它的时候不需要加();而 methods 是函数方法调用,要加();
2:当 属性值不发生变化的时候,computed 只执行一次,而 methods 则是有几个地方用到它,就执行几次,如上面的例子,只要 name 的属性值不发生变化,computed 就是执行一次,而 methods 会执行两次

watch:监视,监视某个模型的变化

在表单里,常常有这样的需求,就是在你输入用户名或者密码的时候,在后面会给出提示,如输入字符不能小于2个,输入字符不能大于20个,并且提示是随着你实时输入的东西进行改变的。我们之前实现这种功能是用了 onchange 事件来实时监测输入框里内容的变化,而在 vuejs 里,它给出了我们一个属性(watch),就是用来监测某个模型的变化的,我们来看下面的列子

<div id="box">
	username: <input type="text" v-model.trim="username" /> <span style="color: red">{{ tip }}</span>
</div>
<script>
    var vm = new Vue({
        el: "#box",
        data: {
            username: '',
            tip: '',
        },
        // 这里用watch,监视的是 username
        watch: {
            username ( newVal, oldVal ) {
                if(!newVal){
                    this.tip = "用户名不能为空";
                    return;
                }
                if(newVal.length <= 2){
                    this.tip = "用户名长度不能小于2";
                    return;
                }
                if(newVal.length >= 20){
                    this.tip = "用户名长度不能大于10";
                    return;
                }
                this.tip = '';
            }
        }

    })
</script>

从上面的例子我们可以看出,watch 是和 data 同级的一个属性,也是一个对象,它的属性名就是我们要监控的模型(username ),同时它有两个参数 newVal(新的值),oldVal (旧的值),监控的模型只要发生变化,新的值就会传给 newVal,我们就能实时监控模型的变化了
我们想到 computed 是依赖于其他的属性的,那么他所依赖的属性如果发生变化,那么 computed 也会发生改变,这样也是实时监控了模型,那 computed 和 watch 之间有什么区别呢?

computed 和 watch 的不同

其实他们的差别还是很大的
1:watch 是用来监控模型变化的,而 computed 用计算属性的,只不过他随着依赖属性的变化而变化,所以我们可以用它做来监控
2:如果我们的业务代理里面存在异步操作,则 computed 则不可以使用,则必须使用 watch 实现
但是就功能而言,他们的差别除了在异步里面之外,其他也没有什么了
对于目前的业务来说,我们只是实现前端的用户名的合法性校验, 真正要检验的应该是用户名是否在数据库里面重复,则这个时候需要使用ajax 进行异步请求后,得到响应的结果后进行消息的提示,发现 computed 里面的信息都是return出去的,但是如果有异步请求,则肯定会出现回调函数。则这个时候的 return 没有意义了。所以我们要用 watch

filter:过滤器

filter:过滤器,负责数据进行处理
他在2.x 中已经被移除了,虽然被移除,但是功能还在,所以我们还是要学习他。

vuejs 中自带了一些过滤器:
capitalize 首字母大写
uppercase 全部大写
lowercase 全部小写
currency 输出金钱以及小数点…

也可以自定义我们自己的过滤器

使用方法:

我们知道在操作系统里面有操作系统管道的使用方式,就是可以把前面一个命令的输出作为下一个命令的输入,(可以叫做 管道,或者叫做过滤器),在 vuejs 里面也提供了类似操作系统管道的使用方式,在vuejs里面可以叫做过滤器,有的地方(程序员)也叫作变量调节器,来看下面这个例子

<div id="box">
//capitalize 是vuejs 1.x 自带的过滤器,所以要使用的话,我们引进的 vuejs 版本要是 1.x 的
    <p>{{ name | capitalize }}</p>
    //运行后我们可以知道他的表现是:Lili
    //执行方式就是 name 作为 capitalize 的输入,经过这个过滤器的处理,把它转换成首字母大写的形式输出
</div>

<script>
    var vm = new Vue({
        el: "#box",
        data: {
            name: "lili"
        }
    })
</script>

由于过滤器在 2.x 版本已经被移除了,所以在这里就不多做解释了(主要是我自己也是只知道一点)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值