<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>vue--计算/监听属性</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>

<body>
<!-- 计算关键字computed。-->
<div id="app">
<p>原始字符串:{{message}}</p>
{{ message.split('').reverse().join('') }}<!--reverse倒退-->
<p>计算后的字符串:{{reversedMessage}}</p>
</div>




<!--conputed setter-->
<div id="setter">
<p>{{site}}</p>
</div>




<div id="methodcom">
<p>原始字符串: {{ message }}</p>
<p>计算后反转字符串: {{ reversedMessage }}</p>
<p>计算后反转字符串: {{ reversedMessage }}</p>
<p>使用方法后反转字符串: {{ reversedMessage2() }}</p>
<p>使用方法后反转字符串: {{ reversedMessage2() }}</p>
</div>


<div id = "computed_props">
千米 : <input type = "text" v-model = "kilometers">
米 : <input type = "text" v-model = "meters">
</div>
<p id="info"></p>

</body>
<script type = "text/javascript">
<!--watch监听-->
var vm = new Vue({
el: '#computed_props',
data: {
kilometers : 0,
meters:0
},
methods: {
},
computed :{
},
watch : {
kilometers:function(val) {
this.kilometers = val;
this.meters = this.kilometers * 1000
},
meters : function (val) {
this.kilometers = val/ 1000;
this.meters = val;
}
}
});
// $watch 是一个实例方法
vm.$watch('kilometers', function (newValue, oldValue) {
// 这个回调将在 vm.kilometers 改变后调用
document.getElementById ("info").innerHTML = "修改前值为: " + oldValue + ",修改后值为: " + newValue;
})
</script>


<script>
<!--computed与method比较-->
var cnt=1;
var vm = new Vue({
el: '#methodcom',
data: {
message: 'Runoob!'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
cnt+=1;
return cnt+this.message.split('').reverse().join('')
}
},
methods: {
reversedMessage2: function () {
cnt+=1;
return cnt+this.message.split('').reverse().join('')
}
}
})
</script>


<script>
var vm = new Vue({
el:'#setter',
data:{
name:'baidu',
url:'www.baidu.com'
},
computed:{
site:{
get:function(){
return this.name+''+ this.url
},
set:function(newVal){
var names=newVal.split(' ')
this.name=names[0]
this.url=names[names.length-1]
}
}
}
})

<!--从实例运行结果看在运行 vm.site = '菜鸟教程 http://www.runoob.com'; 时,-->
<!--setter 会被调用, vm.name 和 vm.url 也会被对应更新。-->
vm.site='xzcvsda http://www.360.com';
document.write('name:'+vm.name);
document.write('<br>');
document.write('url'+vm.url);
</script>


<script>
<!--提供的函数将用作属性 vm.reversedMessage 的 getter 。-->
<!--vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。-->
new Vue({
el:'#app',
data:{
message:"race"
},
computed:{
reversedMessage:function(){
return this.message.split('').reverse().join('')
}
}
<!--我们可以使用 methods 来替代 computed,效果上两个都是一样的,-->
<!--但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。-->
<!--而使用 methods ,在重新渲染的时候,函数总会重新调用执行。-->
})
</script>

</html>