第四章:计算属性

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

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  }}

vue.js基础知识篇(3):计算属性、表单控件绑定的更多相关文章

  1. vue.js基础知识篇(4):过滤器、class与style的绑定2

    代码下载:网盘 欢迎私信 第一章:过滤器 过滤器是对数据进行处理并返回结果的函数. 1.语法 语法是使用管道符"|"进行连接.过滤器可以接收参数,跟在过滤器后面,带引号的参数被当做 ...

  2. Vue.js-----轻量高效的MVVM框架(七、表单控件绑定)

    话不多说,先上完整代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  3. vue.js基础知识篇(1):简介、数据绑定

    目录第一章:vue.js是什么? 第二章:数据绑定第三章:指令第四章:计算属性第五章:表单控件绑定代码链接: http://pan.baidu.com/s/1qXCfzRI 密码: 5j79 第一章: ...

  4. Vue表单控件绑定

    前面的话 本文将详细介绍Vue表单控件绑定 基础用法 可以用 v-model 指令在表单控件元素上创建双向数据绑定.它会根据控件类型自动选取正确的方法来更新元素.v-model本质上不过是语法糖,它负 ...

  5. js进阶 9-6 js如何通过name访问指定指定表单控件

    js进阶 9-6 js如何通过name访问指定指定表单控件 一.总结 一句话总结:form中控件的三种访问方式:2formElement 1document 1.form中控件的三种访问方式? 1.f ...

  6. vue.js基础知识篇(7):表单校验详解

    目录 网盘 第12章:表单校验 1.npm安装vue-validator $ npm install vue-validator 代码示例: var Vue=require("vue&quo ...

  7. vue.js基础知识篇(2):指令详解

    第三章:指令 1.语法 指令以v-打头,它的值限定为绑定表达式,它负责的是按照表达式的值应用某些行为到DOM上. 内部指令有v-show,v-else,v-model,v-repeat,v-for,v ...

  8. Vue.js学习笔记 第七篇 表单控件绑定

    本篇主要说明表单控件的数据绑定,这次没有新的知识点 文本框 1.普通文本框 <div id="app-1"> <p><input v-model=&q ...

  9. Vue.js学习 Item9 – 表单控件绑定

    基础用法 可以用 v-model 指令在表单控件元素上创建双向数据绑定.根据控件类型它自动选取正确的方法更新元素.尽管有点神奇,v-model 不过是语法糖,在用户输入事件中更新数据,以及特别处理一些 ...

随机推荐

  1. 【NOI模拟】谈笑风生(主席树)

    题目描述 设 T 为一棵有根树,我们做如下的定义: 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称 “ a 比 b 不知道高明到哪里去了 ” . 设 a 和 b 为 T 中 ...

  2. 分页功能的实现——Jdbc && JSP

    @目录 什么是分页 ? 两个子模块功能的问题分析 和 解决方案 有条件查和无条件查询的影响 和 解决方案 项目案例: mysql + commons-dbutils+itcast-tools+Base ...

  3. AJAX 中JSON 和JSONP 的区别 以及请求原理

    AJAX 跨域请求 - JSONP获取JSON数据 博客分类: Javascript /Jquery / Bootstrap / Web   Asynchronous JavaScript and X ...

  4. 关于bootstrap的一些想法

    老实说,作为一个前端人员,我不怎么会去用bootstrap,但是我会去看,会去了解. 首先,bootstrap其实是给后台以及前端新人用来快速完成一个页面的简单布局,不是按照设计稿psd格式给定做的那 ...

  5. create pfile from spfile;

    sql>create pfile from spfile; 生成的文件在$ORACLE_HOME/dbs/下边    和spfile在同一个目录下 但是名字已经变成了init$oracle_si ...

  6. 利用dbutils工具实现数据的增删查改操作(dbutis入门)

    一.前期准备 1.安装数据库(如:mysql5.5) 2.安装Eclipse(如:3.4) 3.下载数据库驱动包 4.下载dbutis工具包 5.在Eclipse创建名为 dbutils 的工程并在工 ...

  7. Restful接口调用方法超详细总结

    由于在实际项目中碰到的restful服务,参数都以json为准.这里我获取的接口和传入的参数都是json字符串类型.发布restful服务可参照文章http://www.cnblogs.com/jav ...

  8. nginx的平滑升级

    一:解释nginx的平滑升级 随着nginx越来越流行,并且nginx的优势也越来越明显,nginx的版本迭代也来时加速模式,1.9.0版本的nginx更新了许多新功能,例如stream四层代理功能, ...

  9. vuex状态管理,state,getters,mutations,actons的简单使用(一)

    之前的文章中讲过,组件之间的通讯我们可以用$children.$parent.$refs.props.data... 但问题来了,假如项目特别大,组件之间的通讯可能会变得十分复杂... 这个时候了我们 ...

  10. UITableView移除某行的分割线和让分割线宽度为cell的宽度

    1.移除 UITableView 某一行的分割线 所谓移除,其实就是使其偏移出 cell 的显示范围,看不到即移除. 方法1: 移除系统的分割线,自己定义每行的分割线 self.tableView.s ...