vue中Computed、Methods、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];
    }
}

二、计算属性Computed

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

<!-- 复杂运算 -->
<div>{{message.split('').reverse().join('')}}</div>
<!-- 计算属性代替复杂运算 -->
<div>{{reverseMessage}}</div>
computed: {
    <!-- 计算属性的getter -->
    reverseMessage: function () {
        return this.message.split('').reverse().join('');
    }
}

三、Computed与methods对比

同样都可以达到计算属性的效果
1 . computed是属性调用,而methods是函数调用
2 . computed带有缓存功能,而methods不会被缓存

  • 属性调用:
    (1)、computed定义的方法我们是以属性访问的形式调用,{{computedTest}}
    (2)、 methods定义的方法,我们必须要加上()来调用,{{methodTest()}}
  • 缓存功能:
    计算属性具有缓存:只有当计算属性所依赖的属性发生改变时,才会重新去计算
    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 . computed其实是既可以当做属性访问也可以当做方法访问
2 . computed的由来还有一个重要原因,就是防止文本插值中逻辑过重,导致不易维护

watch

  • watch是观察某一个属性的变化,重新计算属性值。
  • computed是通过所依赖的属性的变化重新计算属性值。
  • 大部分情况下watch和computed几乎没有差别。但如果要在数据变化的同时进行异步操作或者是比较大的开销,那么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>

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

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

watch:{
          firstname:function(newValue,OldValue){
            console.log(newValue);
            console.log(OldValue);
          }
}

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

同时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:'

登录组件

'
} var register={ template:'

注册组件

'
} 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>

你可能感兴趣的:(面试题,vue.js,javascript,前端)