zoukankan      html  css  js  c++  java
  • vue.js基础知识篇(3):计算属性、表单控件绑定

    第四章:计算属性

    为了避免过多的逻辑造成模板的臃肿不堪,可使用计算属性来简化逻辑。

    1.什么是计算属性

    <!DOCTYPE html>

    <html lang="en"><head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    <div id="example">
    <input type="text" v-model="didi"/>
    <input type="text" v-model="family"/>
    <br/>
    didi={{didi}},family={{family}},didiFamily={{didiFamily}}

    </div> <script src="js/vue.js"></script>
    <script>
    var vm=new Vue({
    el:
    "#example",
    data:{
    didi:
    "didi",
    family:
    "family"
    },
    computed:{
    //一个计算属性的getter
    didiFamily:{
    get:
    function(){
    //this 指向vm实例
    return this.didi+this.family;
    }
    } }
    })
    </script>

    </body>
    </html>

    当vm.didi和vm.family的值发生变化时,vm.didiFamily的值会自动更新,当然也会同步到DOM元素上。

    2.计算属性的性能分析

    第五章:表单控件绑定

    1.v-model更新表单控件的基本例子

    这些基本例子,直接使用value属性,绑定的都是字符串或者checkbox的布尔值。接下来分别介绍。

     (1)文本框的使用

    当用户操作文本框时,vm.name会自动更新为用户输入的值,同时span也会改变。

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body>    <div id="demo">        <span>Welcom,{{name}}!join DDFE</span>        <br/>        <input type="text" v-model="name" placeholder="join DDFE"/>    </div>    <script src="js/vue.js"></script>    <script>        var vm=new Vue({            el:"#demo"        })    </script></body></html>
    textInput使用v-model

    (2)复选框checkbox的使用

    单个复选框的使用和文本框类似,多个复选框,也就是复选框组,被选入的值会放入一个数组。

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>复选框组</title></head><body><div id="demo">    <input type="checkbox" id="flash" value="flash" v-model="bizLines"/>    <label for="flash">        快车    </label>    <br/>    <input type="checkbox" id="premium" value="premium" v-model="bizLines"/>    <label for="premium">        专车    </label>    <br/><input type="checkbox" id="bus" value="bus" v-model="bizLines"/>    <label for="flash">        巴士    </label>    <br/></div><script src="js/vue.js"></script><script>    var vm=new Vue({        el:"#demo",        data:{            bizLines:[]        }    })</script></body></html>
    复选框组通过v-model被选中的值会放入数组中

    (3)单选按钮radio的使用

    当单选按钮被选中时,v-model的变量值会被赋值为对应的value值。

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>单选按钮radio</title></head><body><div id="demo">    <input type="radio" id="flash" value="flash" v-model="bizLines"/>    <label for="flash">        快车    </label>    <br/>    <input type="radio" id="premium" value="premium" v-model="bizLines"/>    <label for="premium">        专车    </label>    <br/>    <input type="radio" id="bus" value="bus" v-model="bizLines"/>    <label for="flash">        巴士    </label>    <br/>    <span>Picked:{{bizLines}}</span></div><script src="js/vue.js"></script><script>    var vm=new Vue({        el:"#demo"    })</script></body></html>
    单选按钮使用v-model

    (4)select控件使用v-model分为两种情况。

    一种是单选select控件,第二种是多选select控件。v-model指令都用于select标签。动态的生成option可以借助v-for指令等。

    单选时vm.selected为对应的option的value值。多选会被放入一个数组中,多选是selectr有multiple属性,浏览器窗口想要多选可以借助ctrl和shift快捷键。

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>下拉菜单的选择</title></head><body><div id="demo">    <select v-model="bizLine">        <option selected value="flash">快车</option>        <option value="premium">专车</option>        <option value="bus">巴士</option>    </select>    <span>selected:{{bizLine}}</span>    <br/>    <select v-model="bizLine2" multiple>        <option selected value="flash">快车</option>        <option value="premium">专车</option>        <option value="bus">巴士</option>    </select>    <span>selected:{{bizLine2|json}}</span></div><script src="js/vue.js"></script><script>    var vm=new Vue({        el:"#demo"    })</script></body></html>

    2.动态的值绑定

    通过v-bind代替直接使用value属性,那么除了字符串,还可以是数值、对象、数组等非字符串的值。

    (1)checkbox

    3.v-model指令的修饰词及其源码分析

    (1)lazy

    默认情况下,v-model在input事件中同步输入框的值与数据,而添加了lazy特性后,在change事件中去掉同步性。

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><div id="demo">    <span>Welcom,{{name}}!join DDFE</span>    <br/>    <input type="text" v-model="name" placeholder="join DDFE" /></div><script src="js/vue.js"></script><script>    var vm=new Vue({        el:"#demo"    })</script></body></html></body></html>
    lazy修饰词

    同样是之前的代码,只是添加了lazy属性,那么name变量就不会同步了。

    <!--源码目录:src/directives/public/model/text.js-->

    var lazy = this.params.lazy  //获取到参数的lazy的布尔值//...if (!isRange && !lazy) {     //如果element的type值不是range,而且lazy为false      this.on('focus', function () {        self.focused = true      })      this.on('blur', function () {        self.focused = false        // do not sync value after fragment removal (#2017)        if (!self._frag || self._frag.inserted) {          self.rawListener()        }      })    }//...if (this.hasjQuery) {      const method = jQuery.fn.on ? 'on' : 'bind'      jQuery(el)[method]('change', this.rawListener)      if (!lazy) {        jQuery(el)[method]('input', this.listener)      }    } else {      this.on('change', this.rawListener)      if (!lazy) {        this.on('input', this.listener)      }    }

    (2)debounce

    <!--源码目录:src/directives/public/model/text.js-->

    if (debounce) {      this.listener = _debounce(this.listener, debounce)    }
        // Support jQuery events, since jQuery.trigger() doesn't    // trigger native events in some cases and some plugins    // rely on $.trigger()    //    // We want to make sure if a listener is attached using    // jQuery, it is also removed with jQuery, that's why    // we do the check for each directive instance and    // store that check result on itself. This also allows    // easier test coverage control by unsetting the global    // jQuery variable in tests.    this.hasjQuery = typeof jQuery === 'function'    if (this.hasjQuery) {      const method = jQuery.fn.on ? 'on' : 'bind'      jQuery(el)[method]('change', this.rawListener)      if (!lazy) {        jQuery(el)[method]('input', this.listener)      }    } else {      this.on('change', this.rawListener)      if (!lazy) {        this.on('input', this.listener)      }    }

    (3)number

     <!--源码目录:src/directives/public/model/text.js-->

    var number = this.params.number//****this.listener = this.rawListener = function () {      if (composing || !self._bound) {        return      }      var val = number || isRange        ? toNumber(el.value)        : el.value      self.set(val)      // force update on next tick to avoid lock & same value      // also only update when user is not typing      nextTick(function () {        if (self._bound && !self.focused) {          self.update(self._watcher.value)        }      })    }//****

    <!--源码目录:src/util/lang.js-->

    export function toNumber (value) {  if (typeof value !== 'string') {    return value  } else {    var parsed = Number(value)    return isNaN(parsed)      ? value      : parsed  }}
  • 相关阅读:
    《C语言》for语句(8)
    解决vue vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in nextTick: “TypeError: Cannot convert undefine
    React中WebSocket使用以及服务端崩溃重连
    React Native 中 react-navigation 导航器的使用 [亲测可用]
    ueditor 修改内容方法报错no funtion解决方式
    nodeJs与elementUI实现多图片上传
    Vue多页面开发案例
    Vue.js Cli 3.0 多页面开发案例解析
    基于node.js 微信支付notify_url回调接收不到xml
    react-image-gallery 加入视频图片混合显示
  • 原文地址:https://www.cnblogs.com/chenmeng2062/p/7067037.html
Copyright © 2011-2022 走看看