第七章:处理表单和自定义指令
有话说在前面
表单是非常重要的一项,尤其是当你需要提交数据到后台的时候,双向绑定input,select,checkbox等表单元素,再也不用像jquery一样每一个id去挨个获取value了。
阅读本章节,你会了解更多vue绑定表单元素的方法。
双向绑定到表单元素
前面已经讲过:你可以在表单的 input 元素上使用 v-model 指令来创建双向数据绑定。它会根据 input 元素的类型自动选取正确的绑定模式。
new Vue({
el: '#demo',
data: {
msg : 'hi!',
checked : true,
picked : 'one',
selected : 'two',
multiSelect: ['one', 'three']
}
})
惰性更新
默认情况下,v-model 会在每个 input 事件之后同步输入的数据。你可以添加一个 lazy 特性,将其改变为在 change 事件之后才进行同步。
转换为数字
如果你希望将用户的输入自动转换为数字,你可以在 v-model 所在的 input 上添加一个 number 特性。
动态 select 选项
当你需要为一个
在你的数据里,myOptions 应该是一个指向选项数组的路径或是表达式。
该数组可以包含普通字符串或对象。对象的格式应为 {text:'', value:''}。这允许你把展示的文字和其背后对应的值区分开来。
[
{ text: 'A', value: 'a' },
{ text: 'B', value: 'b' }
]
会渲染成:
另外,数组里对象的格式也可以是 {label:'', options:[...]}。这样的数据会被渲染成为一个
[
{ label: 'A', options: ['a', 'b']},
{ label: 'B', options: ['c', 'd']}
]
会渲染成:
你的原始数据很有可能不是这里所要求的格式,因此在动态生成选项时必须进行一些数据转换。为了简化这种转换,options 特性支持过滤器。将数据的转换逻辑做成一个可复用的 自定义过滤器 。通常来说是个好主意:
Vue.filter('extract', function (value, keyToExtract) {
return value.map(function (item) {
return item[keyToExtract]
})
})
上述过滤器将像 [{ name: 'Bruce' }, { name: 'Chuck' }] 这样的原始数据转化为 ['Bruce', 'Chuck'],从而符合动态选项的格式要求。
输入 Debounce
注意 debounce 参数并不对用户的输入事件进行 debounce:它只对底层数据的 “写入” 操作起作用。因此当使用 debounce 时,你应该用 vm.$watch() 而不是 v-on 来响应数据变化。
自定义指令
以下那内容你了解即可,反正我没有用到,如果你的项目中可能真的出现了相关规范需要你去开饭新的指令,请使用以下方法:
指令名 | |
---|---|
bind | 仅调用一次,当指令第一次绑定元素的时候。 |
update | 第一次是紧跟在 bind 之后调用,获得的参数是绑定的初始值;以后每当绑定的值发生变化就会被调用,获得新值与旧值两个参数。 |
unbind | 仅调用一次,当指令解绑元素的时候。 |
例子:
Vue.directive('my-directive', {
bind: function () {
// 做绑定的准备工作
// 比如添加事件监听器,或是其他只需要执行一次的复杂操作
},
update: function (newValue, oldValue) {
// 根据获得的新值执行对应的更新
// 对于初始值也会被调用一次
},
unbind: function () {
// 做清理工作
// 比如移除在 bind() 中添加的事件监听器
}
})
一旦注册好自定义指令,你就可以在 Vue.js 模板中像这样来使用它(需要添加 Vue.js 的指令前缀,默认为 v-):
如果你只需要 update 函数,你可以只传入一个函数,而不用传定义对象:
Vue.directive('my-directive', function (value) {
// 这个函数会被作为 update() 函数使用
})
所有的钩子函数会被复制到实际的指令对象中,而这个指令对象将会是所有钩子函数的this
上下文环境。指令对象上暴露了一些有用的公开属性:
指令名 | 作用 |
---|---|
el | 指令绑定的元素 |
vm | 拥有该指令的上下文 ViewModel |
expression: | 指令的表达式,不包括参数和过滤器 |
arg | 指令的参数 |
raw | 未被解析的原始表达式 |
name | 不带前缀的指令名 |
这些属性是只读的,不要修改它们。你也可以给指令对象附加自定义的属性,但是注意不要覆盖已有的内部属性。
使用指令对象属性的示例: