• vue入门(二) ——监听属性,样式绑定


    感觉写博客好麻烦的.... 有的很小的知识点,我看的时候是记在笔记本上的,但是现在要再用博客写一遍,就会整理很久,就想着干脆简单一点写一点笼统的。以及一些需要时间思考的代码,写出逻辑

    监听属性

    用$watch响应数据变化    学vue最大的感觉就是感觉很多指令啊属性啊跟监听是一样的意思,都能实时的感受到数据,交互性能真的很好,但是久了会有点难区分区别, 先看下面这个例子,是菜鸟给的第一个最简单的例子

     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(){} 

    因为对这种监听还不是很能理解,看到菜鸟的一个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">
    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的话,应该处理的就很复杂,因为改变之前还需要存起来..之类的。

    ps: 非vue的时候,有一个是oninput 跟click一个意思,就是输入的时候触发事件,但是在vue里这样写是没有作用的,且@oninput  v-on:oninput 都是不可以的

    看了一下别人的博客,讲一下自己对于watch method co的区别的理解和别人的博客理解(捂脸...又照搬,看着口语化的部分就是我写的可能)

    • computed:计算属性将被混入到 Vue 实例中。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。
    • methods:methods 将被混入到 Vue 实例中。可以直接通过 VM 实例访问这些方法,或者在指令表达式中使用。方法中的 this 自动绑定为 Vue 实例。
    • watch:是一种更通用的方式来观察和响应 Vue 实例上的数据变动。一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个属性。

    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 会自动侦测并添加相应的前缀。

  • 相关阅读:
    如何设置项目encoding为utf-8
    如何使用Navicat恢复数据库脚本
    如何使用Navicat备份数据库脚本
    表单编辑组件使用指南
    Maven如何打包本地依赖包
    怎么替换jar包里面的文件?
    如何开始创建第一个基于Spring MVC的Controller
    怎么将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL
    如何使用Eclipse调试framework
    windows下安装oracle,sqlplus连接启动oracle(oracle 主机字符串输入是什么)
  • 原文地址:https://www.cnblogs.com/noob-xw/p/9720559.html
Copyright © 2020-2023  润新知