• vue中Computed、Methods、Watch区别


    1.计算属性Computed

    模板内使用js表达式是很方便的,设计的目的只是为了简单运算。在模板中放入太多的逻辑会让模板过重且难以维护。所以,对于任何复杂逻辑,你都应当使用计算属性

    <!-- 复杂运算 -->
    <div>{{message.split('').reverse().join('')}}</div>
    <!-- 计算属性代替复杂运算 -->
    <div>{{reverseMessage}}</div>
    computed: {
        <!-- 计算属性的getter -->
        reverseMessage: function () {
            return this.message.split('').reverse().join('');
        }
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2 . Computed 与 methods 对比

    我们可以使用方法达到和计算属性同样的效果

    <!--HTML部分-->
    <div id="app">
        <h1>{{message}}</h1>
        <p class="test1">{{methodTest}}</p>
        <p class="test2-1">{{methodTest()}}</p>
        <p class="test2-2">{{methodTest()}}</p>
        <p class="test2-3">{{methodTest()}}</p>
        <p class="test3-1">{{computedTest}}</p>
        <p class="test3-2">{{computedTest}}</p>
    </div>
    
    <!--script部分-->
    let vm = new Vue({
        el: '#app',
        data: {
            message: '我是消息,'
        },
        methods: {
            methodTest() {
                return this.message + '现在我用的是methods'
            }
        },
        computed: {
            computedTest() {
                return this.message + '现在我用的是computed'
            }
        }
    }) 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    在官方文档中,强调了computed区别于method最重要的两点:

    1 . computed是属性调用,而methods是函数调用 2 . computed带有缓存功能,而methods不会被缓存

    属性调用: 1 .computed定义的方法我们是以属性访问的形式调用,{{computedTest}} 2 .methods定义的方法,我们必须要加上()来调用,{{methodTest()}} 缓存功能: 计算属性具有缓存:只有当计算属性所依赖的属性发生改变时,才会重新去计算 methods不会被缓存:方法每次都会去重新计算结果。 缓存好处: 相比大家都知道HTTP缓存,其核心作用就是对一些服务端未更新的资源进行复用,避免一些无谓的请求,优化了用户的体验 对于computed也是一样的: 在上面的例子中,methods定义的方法是以函数调用的形式来访问的,那么test2-1,test2-2,test2-3是反复地将methodTest方法运行了三遍,如果我们碰到一个场景,需要1000个methodTest的返回值,那么毫无疑问,这势必造成大量的浪费 更恐怖的是,如果你更改了message的值,那么这1000个methodTest方法每一个又会重新计算。。。。

    所以,官方文档才反复强调对于任何复杂逻辑,你都应当使用计算属性

    computed依赖于data中的数据,只有在它依赖数据发生改变` `时computd属性才会重新计算 
    
    • 1

    如上例,在Vue实例化的时候,computed定义computedTest方法会做一次计算,返回一个值,在随后的代码编写中,只要computedTest方法依赖的message数据不发生改变,computedTest方法是不会重新计算的,也就是说test3-1,test3-2是直接拿到了返回值,而非是computedTest方法重新计算的结果。

    这样的好处也是显而易见的,同样的,如果我们碰到一个场景,需要1000个computedTest的返回值,那么毫无疑问,这相对于methods而言,将大大地节约内存 哪怕你改变了message的值,computedTest也只会计算一次而已。 备注: 1 . computed其实是既可以当做属性访问也可以当做方法访问 2 . computed的由来还有一个重要原因,就是防止文本插值中逻辑过重,导致不易维护

    watch

    • watch Vue的watch属性可以用来监听data属性中数据的变化
     <div id="app">
          <input type="text" v-model="firstname" />
        </div>
        <script type="text/javascript"> var vm = new Vue({
            el:"#app",
            data:{
              firstname:"",
              lastname:""
            },
            methods:{},
            watch:{
              firstname:function(){
                console.log(this.firstname)
              }
            }
          }) </script> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    可以从上述代码中实践得知,输入框内的值变化多少次,控制台就会打印多少次

    同时还可以直接在监听的function中使用参数来获取新值与旧值

    watch:{
              firstname:function(newValue,OldValue){
                console.log(newValue);
                console.log(OldValue);
              }
            } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其中第一个参数是新值,第二个参数是旧值

    同时Watch还可以被用来监听路由router的变化,只是这里的监听的元素是固定的

     <div id="app">
          <!--
            由于Vue-router的hash匹配原则所以我们需要在原定义的路径上加一个#号
          -->
    <!--  <a href="#/login" rel="external nofollow" >登录</a>
          <a href="#/register" rel="external nofollow" >注册</a>-->
          <router-link to="/login" tag="span">登录</router-link>
          <router-link to="/register">注册</router-link>
          <router-view></router-view>
        </div>
      </body>
      <script> var login={
          template:'<h1>登录组件</h1>'
        }
        var register={
          template:'<h1>注册组件</h1>'
        }
        var routerObj = new VueRouter({
          routes:[
          //此处的component只能使用组件对象,而不能使用注册的模板的名称
            {path:"/login",component:login},
            {path:"/register",component:register}
          ]
        })
        var vm = new Vue({
          el:'#app',
          data:{
          },
          methods:{
             
          },
          router:routerObj,//将路由规则对象注册到VM实例上
          watch:{
            '$route.path':function(newValue,OldValue){
                console.log(newValue);
                console.log(OldValue);
            }
          }
        }) </script> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    watch是观察某一个属性的变化,重新计算属性值。computed是通过所依赖的属性的变化重新计算属性值。在这里插入代码片 大部分情况下watch和computed几乎没有差别。但如果要在数据变化的同时进行异步操作或者是比较大的开销,那么watch为最佳选择。

    methods,watch,computed的区别

    1 . computed 属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。主要当作属性来使用; 2 . methods 方法表示一个具体的操作,主要书写业务逻辑; 3 . watch 一个对象,键是需要观察的表达式,值是对应回调函数。主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;可以看作是 computed 和 methods 的结合体;

    计算属性的getter与Setter

    计算属性默认只有get,在需要的时候也可以设置set方法

    fullName: {
        get: function () {
            return this.firstName + " " + this.lastName;
        },
        set: function (val) {
            this.firstName = val.split(' ')[0];
            this.lastName = val.split(' ')[1];
        }
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    优优嗨聚集团:旅游经济繁荣,助力当地外卖市场崛起
    DSOX3012A是德科技keysight DSOX3012A示波器
    从零开始学习typescript系列2: typescript配置文件ts.config.js之详细解释
    【Linux】进程
    ttkefu客服系统的优势及应用领域
    从25到45岁,软件测试工程师如何发展自己的职业?
    号码认证平台有哪些?号码认证平台费用?
    leetcode 729. My Calendar I(日程1)
    BetterZip for Mac2024最新mac解压缩软件
    Vue中使用百度地图引发内存泄露的分析与解决方案
  • 原文地址:https://blog.csdn.net/pfourfire/article/details/125520675