感受写博客好麻烦的.... 有的很小的知识点,我看的时候是记在笔记本上的,可是如今要再用博客写一遍,就会整理好久,就想着干脆简单一点写一点笼统的。以及一些须要时间思考的代码,写出逻辑javascript
监听属性css
用$watch响应数据变化 学vue最大的感受就是感受不少指令啊属性啊跟监听是同样的意思,都能实时的感觉到数据,交互性能真的很好,可是久了会有点难区分区别, 先看下面这个例子,是菜鸟给的第一个最简单的例子html
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title> 6 <script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script> 7 </head> 8 <body> 9 <div id = "app"> 10 <p style = "font-size:25px;">计数器: {{ counter }}</p> 11 <button @click = "counter++" style = "font-size:25px;">点我</button> 12 </div> 13 <script type = "text/javascript"> 14 var vm = new Vue({ 15 el: '#app', 16 data: { 17 counter: 1 18 } 19 }); 20 vm.$watch('counter', function(nval, oval) { 21 alert('计数器值的变化 :' + oval + ' 变为 ' + nval + '!'); 22 }); 23 </script> 24 </body> 25 </html>
在button按钮给了一个click事件绑的counter++ ,即直接点击就counter++,这个时候 counter的监听 那些指令就作不到了,由于它不是在js逻辑里加一,而是在button直接++了,因此能够用watch来响应数据变化前与变化后。(这里的代码形式是 vm.$watch(){} )vue
由于对这种监听还不是很能理解,看到菜鸟的一个demo是这样的:java
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title> 6 <script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script> 7 </head> 8 <body> 9 <div id = "computed_props"> 10 公里 : <input type = "text" v-model = "kilometers"> 11 米 : <input type = "text" v-model = "meters"> 12 </div> 13 <p id="info"></p> 14 <script type = "text/javascript"> 15 var vm = new Vue({ 16 el: '#computed_props', 17 data: { 18 kilometers : 0, 19 meters:0 20 }, 21 methods: { 22 }, 23 computed :{ 24 }, 25 watch : { 26 kilometers:function(val) { 27 this.kilometers = val; 28 this.meters = val * 1000; 29 }, 30 meters : function (val) { 31 this.kilometers = val/ 1000; 32 this.meters = val; 33 } 34 } 35 }); 36 // $watch 是一个实例方法 37 vm.$watch('kilometers', function (newValue, oldValue) { 38 // 这个回调将在 vm.kilometers 改变后调用 39 document.getElementById ("info").innerHTML = "修改前值为: " + oldValue + ",修改后值为: " + newValue; 40 }) 41 </script> 42 </body> 43 </html>
而后我想了一下,我以为v-model也能够作到,就本身写了一个同样功能的demo:数组
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title> 6 <script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script> 7 </head> 8 <body> 9 <div id = "computed_props"> 10 公里 : <input type = "text" v-model = "kilometers" v-on:input="ki"> 11 米 : <input type = "text" v-model = "meters" v-on:input="me"> 12 </div> 13 14 <script type="text/javascript"> 15 var vm = new Vue({ 16 el:'#computed_props', 17 data:{ 18 kilometers:0, 19 meters:0 20 }, 21 methods:{ 22 ki: function(){ 23 this.meters = this.kilometers*1000 24 }, 25 me: function(){ 26 this.kilometers = this.meters/1000 27 } 28 } 29 }) 30 </script> 31 </body> 32 </html>
首先 v-on 一开始感受只见到了跟click搭配,可是我这里是想当我在input框里输值的时候触发事件,因此查了一下,能够v-on:input , 若是我是在公里那里触发事件,那我就处理meter的值,对米的触发同理缓存
watch监听的区别就是,我监听它,而且保持了他们之间的数量关系,就不须要我触发事件这种事情,它会时刻监听,不须要特别的去处理数据,且watch是有两个参数的,就能够获得以前的值和后来改变以后的值。因此若是这种状况要用v-model的话,应该处理的就很复杂,由于改变以前还须要存起来..之类的。app
ps: 非vue的时候,有一个是oninput 跟click一个意思,就是输入的时候触发事件,可是在vue里这样写是没有做用的,且@oninput v-on:oninput 都是不能够的函数
看了一下别人的博客,讲一下本身对于watch method co的区别的理解和别人的博客理解(捂脸...又照搬,看着口语化的部分就是我写的可能)性能
computed 计算属性,是页面加载以后就能够执行的,赋值什么的(给我一种onload函数的感受,我也不是很清楚)
methods 是要触发才执行的一些函数 如上述代码里的
watch就是响应数据变化,对应一个对象,键是观察表达式,值是对应回调。值也能够是方法名,或者是对象,包含选项。
因此他们的执行顺序为:默认加载的时候先computed再watch,不执行methods;等触发某一事件后,则是:先methods再watch。(由于这个时候早就加载完了)
最类似的就是watch和computed,他们两个对数据都挺敏感,当某一个数据(称它为依赖数据)发生变化的时候,全部依赖这个数据的“相关”数据“自动”发生变化,也就是自动调用相关的函数去实现数据的变更。
computed 计算属性只有在相关的数据发生变化时才会改变要计算的属性,当相关数据没有变化是,它会读取缓存。而没必要想 motheds方法 和 watch 方法是的每次都去执行函数。 因此有一些数据响应仍是用computed会更好(人家博客的例子)
样式绑定
class属性绑定:(其实在上一篇里提到了一个demo v-bind的那个)
v-bind:class 设置对象,能够动态的切换class true就绑定这个选择器,用这种样式
也能够在对象中传入更多属性用来动态切换多个 class 。跟绑定一个有一点点区别,贴上代码
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title> 6 <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script> 7 <style> 8 .active { 9 width: 100px; 10 height: 100px; 11 background: green; 12 } 13 .text-danger { 14 background: red; 15 } 16 </style> 17 </head> 18 <body> 19 <div id="app"> 20 <div class="static" v-bind:class="{ 'active': isActive,'text-danger': hasError }"> 21 </div> 23 </div> 24 25 <script> 26 new Vue({ 27 el: '#app', 28 data: { 29 isActive: true, 30 hasError: true 31 } 32 }) 33 </script> 34 </body> 35 </html>
第20行是想对两个选择器都切换,若是都是true就至关于
1 <div class="static active text-danger"></div
的意思,可是active能够加引号,也能够不加,通过实践,后面的那个选择器必须得加引号。
也能够直接绑定数据里的一个对象:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title> 6 <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script> 7 <style> 8 .active { 9 width: 100px; 10 height: 100px; 11 background: green; 12 } 13 .text-danger { 14 background: red; 15 } 16 </style> 17 </head> 18 <body> 19 <div id="app"> 20 <div v-bind:class="classObject"></div> 21 </div> 22 23 <script> 24 new Vue({ 25 el: '#app', 26 data: { 27 classObject: { 28 active: true, 29 'text-danger': true 30 } 31 } 32 }) 33 </script> 34 </body> 35 </html>
我乍一看的时候,忽然有点看不太懂。如今这个意思就是我直接绑了个classObject(说到了这个,以前看书的时候想起来有个地方驼峰写法会自动转化为),而后把以前那两个选择器放在data下面classObject里
也能够在这里绑定返回对象的计算属性,进阶版demo:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title> 6 <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script> 7 <style> 8 .active { 9 width: 100px; 10 height: 100px; 11 background: green; 12 } 13 .text-danger { 14 background: red; 15 } 16 </style> 17 </head> 18 <body> 19 <div id="app"> 20 <div v-bind:class="classObject"></div> 21 </div> 22 23 <script> 24 new Vue({ 25 el: '#app', 26 data: { 27 isActive: true, 28 error: null 29 }, 30 computed: { 31 classObject: function () { 32 return { 33 active: this.isActive && !this.error, 34 'text-danger': this.error && this.error.type === 'fatal', 35 } 36 } 37 } 38 }) 39 </script> 40 </body> 41 </html>
==用于通常比较,===用于严格比较,==在比较的时候能够转换数据类型,===严格比较,只要类型不匹配就返回flase。
能够看到这里,data里没有我所要的选择器,只有一些判断用的值(我不知道怎么描述)而后我经过return的时候计算属性,(即 this.谁谁巴拉巴拉) 而后给选择器真或假,至于绑定仍是用的classObject 返回对象的计算属性。 (说它是经常使用且强大的计算模式,我暂时想不到它能够干吗用,还没想到他有啥很好的地方)
能够把一个数组传给 v-bind:class 这个很容易理解,activeClass, errorClass所对应的类名在data里会赋值的,就不涉及true false 直接类
1 <div v-bind:class="[activeClass, errorClass]"></div>
三元来作这个切换也能够
1 <div v-bind:class="[errorClass ,isActive ? activeClass : '']"></div>//errorClass 是始终存在的,isActive 为 true 时添加 activeClass 类
能够在 v-bind:style 直接设置样式(内联)
1 <div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }">菜鸟教程</div>
也能够直接绑定到一个样式对象,v-bind:style 也可使用数组将多个样式对象应用到一个元素上
注意:当 v-bind:style 使用须要特定前缀的 CSS 属性时,如 transform ,Vue.js 会自动侦测并添加相应的前缀。