我叫大王来巡山

导航

 
<div id="example">
    {{message.split("").reverse().join("")}}
</div>

这是模板不在简单和清晰,在实现反向显示message之前,应该确认它,这个问题不知一次反向显示message的时候变得更加糟糕。

这就是为什么任何复杂逻辑,都应当使用计算属性。

实例:

<div id="example">
    <p>Original message : "{{message}}"</p>
    <p>Cpmputed reversed message : "{{reverseMessage}}"</p>
</div>
var vm=new Vue({
   el:'#example',
   data:{
       message:''Hello 
    },
    computed:{
    reversedMessage:function(){
       return this.message.split("").reverse().join("") 
     }    
    }
})
    

这里我们声明了一个计算属性,reverseMessage。我们提供的函数将作用水性vm.reversedMessage的 getter

计算缓存  vs  methods

我们通过调用表达式中的method可以达到同样的效果

<p>reverse message :'{{reverseMessage()}}'</p>
methods:{
  reverseMessage:function(){
    return this.message.split("").reverse().join("")
    }  
}

两种方式不同的是计算属性是基于他的依赖缓存。计算属性只有在他的相关依赖发生改变时才会重新取值,这就意味着只要message没有改变,多次访问reverseMessage计算属性hi立即返回之前的计算结果,而不必再次执行函数,

这也同样意味着如下计算属性将不会更新,因为Date.now()不是响应式依赖。

computed:{
     now:function(){
        return Date.now()    
    }       
}

相比而言。每次重新渲染的时候,method总会执行函数

计算属性  vs  Watched Property

vue提供了watch方法,用于观察vue实例上数据的变动。

<div id="demo">{{fullName}}</div>
var vm=new Vue({
el:'#demo',
data:{
    firstName:'Foo',
    lastName:'Bar',
    fullName:'Foo Bar'
  },
watch:{
  firstName:function(val){
    this.fullName=val+''+this.lastName
  },
  lastName:function(val){
    this.fullName=this.firstName+''+val
  }
  
}
})

与计算属性相比:

var vm=new Vue({
  el:'#demo',
  data:{
    firstName:'Foo',
    lastName:'Bar'
  },
  computed:{
    fullName:function(){
      return this.firstName+''+this.lastName
    }
  }
})

计算setter

计算属性默认只有getter,不过在需要的时候你也可以提供一个setter

computed:{
  fullName:{
    //getter
    get:function(){
      return this.firstName+''+this.lastName
    },
    //setter
    set:function(newValue){
      var names=newValue.split('')
      this.firstName=names[0]
      this.lastName=names[names.length-1]
    }
  }
  
}

观察watch

<div id="watch-example">
    <p>
    Ask a yes/no question
    <input type="text" v-model="question">
  </p>
  <p>
  
  {{answer}}
  </p> </div>
var watchExampleVM=new Vue({
  el:'#watch-example',
  data:{
    question:'',
    answer:'I cannot give you an answer until you ask a question'
  },
   watch:{
    question:function(newQuestion){
      this.answer="Waiting for you to stop typing..."  
      this.getAnswer()
    }
    },
  methods:{
    getAnswer:_.debounce(
      function(){
        var vm=this
        if(this.question.indexOf("?")===-1){
          vm.answer="Questions usually contain a question mark. ;-"
          return
        }
        vm.answer='thinking'
        axios.get("http://yesno.wtf/api").then(function(response){
          vm.answer=_.capitalize(response.data.answer)
        }).catch(function(error){
          vm.answer="Error counld not reach the api"+error
        })
      },500
    )
  }
})

watch选项允许我们执行异步操作(访问一个api),限制我们执行该操作的频率,并在我们的得到结果前,设置中间状态。这是计算属性 无法做到的。

posted on 2017-03-03 14:49  我叫大王来巡山  阅读(800)  评论(0编辑  收藏  举报