Vue是如何监听输入框变化的

小白,最近刚在学vue的原理,数据=>模板的更新大概知道了原理,是通过数据变化的劫持和视图解析器去做的。

那么像输入框这样的组件,是我们手动去修改模板,那么vue是如何监听到我们修改的模板并且将新的值赋给data中的数据的呢?

阅读 4.7k
1 个回答

我猜你应该说的是v-model的实现。

其实v-model只是一个语法糖,让你省去了监听事件改变数据的步骤。
在Vue编译的阶段,会解析v-model指令,生成代码的时候,其实标签上就不存在v-model了,而是用 :value="v-model后面的对象" v-on:event 进行了替换,事件类型取决于表单元素类型(input, select, radio等等)

如果代码这样写的:

<input v-model="text"></input>

你可以认为你实际写的代码是下面这个:

<input
  v-bind:value="text"
  v-on:input="text=$event.target.value">
</input>

有兴趣的话给你贴一下源码吧:

1. 解析
 if (el.component) {
    genComponentModel(el, value, modifiers)
    return false
  } else if (tag === 'select') {
    genSelect(el, value, modifiers)
  } else if (tag === 'input' && type === 'checkbox') {
    genCheckboxModel(el, value, modifiers)
  } else if (tag === 'input' && type === 'radio') {
    genRadioModel(el, value, modifiers)
  } else if (tag === 'input' || tag === 'textarea') {
    genDefaultModel(el, value, modifiers)
  } else if (!config.isReservedTag(tag)) {
    genComponentModel(el, value, modifiers)
    // component v-model doesn't need extra runtime
    return false
  } else if (process.env.NODE_ENV !== 'production') {
    warn(
      `<${el.tag} v-model="${value}">: ` +
      `v-model is not supported on this element type. ` +
      'If you are working with contenteditable, it\'s recommended to ' +
      'wrap a library dedicated for that purpose inside a custom component.'
    )
  }
 
2.如果是输入框的执行过程
  const { lazy, number, trim } = modifiers || {}
  const needCompositionGuard = !lazy && type !== 'range'
  const event = lazy
    ? 'change'
    : type === 'range'
      ? RANGE_TOKEN
      : 'input'

  let valueExpression = '$event.target.value'
  if (trim) {
    valueExpression = `$event.target.value.trim()`
  }
  if (number) {
    valueExpression = `_n(${valueExpression})`
  }

  let code = genAssignmentCode(value, valueExpression)
  if (needCompositionGuard) {
    code = `if($event.target.composing)return;${code}`
  }

  addProp(el, 'value', `(${value})`)
  addHandler(el, event, code, null, true)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题