VUE02_表单操作、自定义指令、计算属性、侦听器、过滤器、生命周期、数组(二)

简介: ③. 计算属性(computed)④. 侦听器(watch)

③. 计算属性(computed)


①. 模板中放入太多的逻辑会让模板过重且难以维护,使用计算属性可以让模板更加的简洁。


②. 计算属性是基于它们的依赖进行缓存的(依赖就是指的data中的数据),而方法不存在缓存


③. 注意:只要data中的数据不发生改变,那么第二次调用计算属性的时候使用的就是第一次的结果,直接用缓存;方法不会用到缓存中的数据,你显示申明调用几次,方法就会执行几次


④. 需要返回一个新的结果使用计算属性(computed)


 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        {{message}}
        {{message.split('').reverse().join('')}}
        <h2>computed...</h2>
        <!-- 这里使用了两次reversedMessage,但是由于data中的message信息没有发生改变,
            所以第二次用了缓存;console.log("computed.....")出现一次
         -->
        {{reversedMessage}}
        {{reversedMessage}}
        <!-- 这里是调用两次方法,方法不会使用缓存,所有会出现两次
        alert("method....");
        -->
        {{handle()}}
        {{handle()}}
    </div>
    <script src="../js/vue.js"></script>
    <script>
    var vm=new Vue({
            el:'#app',
            data:{    
               message:'hello'
            },
            methods:{
               handle:function(){
                //console.log("mehtod.....");
                alert("method....");
                return this.message.split('').reverse().join('');
               }
            },
            computed: {
              //reverseString 这个是我们自己定义的名字
              reversedMessage: function () {
              //这里一定要有return 否则 调用 reverseString的时候无法拿到结果
              console.log("computed.....");
              return this.message.split('').reverse().join('');
            }
        }
    });
    </script>
</body>
</html>


④. 侦听器(watch)


①. watch 中的属性一定是data中已经存在的数据


②. 当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听


③. 数据变化时执行异步或开销较大的操作,只需要监听数据的变化使用侦听器(watch)


需要返回一个新的结果使用计算属性(computed)


只需要监听数据的变化使用侦听器(watch)


微信图片_20220106153129.png


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <div id="demo">{{ fullName }}</div>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    var vm=new Vue({
            el:'#app',
            data:{    
              firstName: 'Foo',
              lastName: 'Bar',
              //fullName: 'Foo Bar'
            },
            methods:{
            },
            //注意:如果data中的属性发生了改变(firstName|lastName)会触发watch
            watch: {
                firstName: function (val) {
                    //vm.firstName="xiaozhi"
                    //firstName change....xiaozhi
                    console.log("firstName change...."+val)
                    this.fullName = val + ' ' + this.lastName
                },
                lastName: function (val) {
                    console.log("lastName change...."+val);
                    this.fullName = this.firstName + ' ' + val
                }
            },
            //这里可以使用计算属性computed(更加简洁)
            computed: {
                    // 计算属性的 getter
                fullName: function () {
                    // `this` 指向 vm 实例
                    return this.firstName+' '+this.lastName;
                }
            }
    });
    </script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
         <span>用户名:</span>
         <input type="text" v-model.lazy="username">
         <span>{{tip}}</span>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    /*
      侦听器:
       1.采用侦听器监听用户名的变化
       2.调用后台接口进行验证
       3.根据验证的结果调整提示内容    
    */
    var vm=new Vue({
            el:'#app',
            data:{    
              username:'',
              tip:''
            },
            methods:{
              checkName:function (username) {
                   var that=this;
                   setTimeout(function(){
                       //注意定时器中的this代表的是window对象
                       console.log(this);
                       if(username=='admin'){
                           that.tip='用户名已经存在....';
                       }else{
                           that.tip='用户名不存在...';
                       }
                   },2000);
                }
            },
            watch:{
                username:function(val){
                    this.tip="正在验证....";
                    //调用后台接口验证用户名的可用性
                    this.checkName(val);
                } 
            }
    });
    </script>
</body>
</html>


④. 从这里我们可以知道侦听器有两个值,第一个是侦听到的最新的值,第二个是旧值


<body>
    <div id="app">
        <input type="text" v-model="num" @click="num++" />
        <div>{{num}}</div>
        {{msg}}
    </div>
    <script src="../js/vue.js"></script>
    <script>
        var appel = document.getElementById("app");
        var vm = new Vue({
            el: '#app',//元素的挂载位置(值可以是css选择器或者DOM元素)
            //el:appel
            data: {    //模型数据:值是一个对象
                num: 0,
                msg: ""
            },
            watch: {
                num: function (valNew, valOld) {
                    console.log("得到的最新的值是:" + valNew);
                    console.log("以前的值是:" + valOld);
                    if (valNew > 3) {
                        this.msg = "库存不足";
                    }
                },
            },
        });
    </script>




相关文章
|
26天前
|
监控 JavaScript 前端开发
vue学习第十二章(生命周期)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。本文深入探讨了Vue实例的生命周期,从初始化到销毁各阶段的关键钩子函数及其应用场景,帮助你更好地理解Vue的工作原理。如果你觉得有帮助,欢迎关注我,将持续分享更多优质内容!🎉🎉🎉
22 1
vue学习第十二章(生命周期)
|
1月前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
2月前
|
JavaScript API
vue尚品汇商城项目-day04【24.点击搜索按钮跳转后的页面商品列表、平台售卖属性动态展示(开发Search组件)】
vue尚品汇商城项目-day04【24.点击搜索按钮跳转后的页面商品列表、平台售卖属性动态展示(开发Search组件)】
62 1
vue尚品汇商城项目-day04【24.点击搜索按钮跳转后的页面商品列表、平台售卖属性动态展示(开发Search组件)】
|
2月前
|
JavaScript
Vue 的父组件和子组件生命周期钩子执行顺序
在 Vue 中,父组件和子组件的生命周期钩子执行顺序如下:
|
2月前
|
JavaScript
|
2月前
|
JavaScript
vue3 生命周期
【10月更文挑战第14天】vue3 生命周期
|
2月前
|
监控 JavaScript 开发者
在 Vue 中,子组件为何不可以修改父组件传递的 Prop,如果修改了,Vue 是如何监控到属性的修改并给出警告的
在 Vue 中,子组件不能直接修改父组件传递的 Prop,以确保数据流的单向性和可预测性。如果子组件尝试修改 Prop,Vue 会通过响应式系统检测到这一变化,并在控制台发出警告,提示开发者避免这种操作。
|
3月前
|
缓存 JavaScript 前端开发
vue-day02计算属性,v-bind,v-if,v-for
文章介绍了Vue.js中的计算属性、class与style的绑定、条件渲染和列表渲染的使用。通过示例代码展示了如何使用计算属性简化模板逻辑、如何通过v-bind动态绑定class和style、如何使用v-if进行条件渲染以及如何使用v-for进行列表渲染。这些特性使得Vue.js在构建动态用户界面时更加灵活和强大。
vue-day02计算属性,v-bind,v-if,v-for
|
2月前
|
JavaScript 前端开发 开发者
VUE学习一:初识VUE、指令、动态绑定、计算属性
这篇文章主要介绍了Vue.js的基础知识,包括初识Vue、指令如v-for、v-on的使用、动态属性绑定(v-bind)、计算属性等概念与实践示例。
65 1
|
2月前
|
JavaScript 索引
Vue 3 数组变更详解:哪些操作会修改原数组?| 笔记
在处理数组时,了解哪些操作会修改原数组,哪些操作不会修改原数组,对高效编写 Vue 应用程序至关重要。本文将详细介绍 Vue 3 中的常见数组操作,并按照是否会修改原数组进行分类说明。
165 2