Vue.js入门教程(七)处理表单和自定义指令

第七章:处理表单和自定义指令

有话说在前面


表单是非常重要的一项,尤其是当你需要提交数据到后台的时候,双向绑定input,select,checkbox等表单元素,再也不用像jquery一样每一个id去挨个获取value了。
阅读本章节,你会了解更多vue绑定表单元素的方法。

双向绑定到表单元素


前面已经讲过:你可以在表单的 input 元素上使用 v-model 指令来创建双向数据绑定。它会根据 input 元素的类型自动选取正确的绑定模式。

{{msg}}

{{checked ? "yes" : "no"}}

{{picked}}

{{selected}}

{{multiSelect}}

data: {{$data | json 2}}

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 不带前缀的指令名

这些属性是只读的,不要修改它们。你也可以给指令对象附加自定义的属性,但是注意不要覆盖已有的内部属性。

使用指令对象属性的示例:




    
    
    


你可能感兴趣的:(Vue.js入门教程(七)处理表单和自定义指令)