vue中v-model的原理

<div id="app">
  <h1>{{message}}</h1>
<!--  <input type="text" v-model = "message">-->
  <input type="text" :value="message" v-on:input="valueChange">
  <!--<input type="text" :value="message" @input = "message = $event.target.value">-->
</div>
</div>
<script src="js/vue.js"></script>
<script>
  const app = new Vue({
    el:'#app',
    data:{
      message:"hello,vue"
    },
    methods:{
      //每个事件在浏览器上都会生成一个事件
      valueChange(event){
        //获取当前input 的值
        this.message = event.target.value
      }
    }
  })
</script>

上述代码中,v-model等于:value +v-on:input实现的效果,:value是表单绑定message,表单中的值会随着message的改变而改变;而v-on:input则是message绑定了表单,此时message会随着表单中输入的数据而改变,这就是v-model实现双向绑定的原理。

### Vue3 中 `v-model` 的实现原理 #### 1. 基本概念 在 Vue.js 中,`v-model` 是一种语法糖,用于简化表单输入与组件状态之间的双向绑定。它通过监听用户的输入事件来更新数据,并同步更新视图[^2]。 #### 2. 表单元素中的 `v-model` 对于原生 HTML 表单元素(如 `<input>` 或 `<textarea>`),Vue3 的 `v-model` 实现主要依赖于以下几个方面: - **属性绑定**:将模型值绑定到 DOM 属性上(例如 `value`)。 - **事件监听**:监听用户触发的输入事件(如 `input` 或 `change`),并将新值传递回 Vue 数据模型中。 具体来说,Vue 将以下代码: ```html <input v-model="message"> ``` 编译为: ```javascript // 编译后的逻辑 <input :value="message" @input="event => message = event.target.value"> ``` 这种模式使得开发者无需手动处理属性设置和事件监听器,从而实现了更简洁的开发体验[^4]。 #### 3. 自定义组件中的 `v-model` 在 Vue3 中,自定义组件的 `v-model` 实现有一定的灵活性。默认情况下,`v-model` 使用的是 `modelValue` 和 `update:modelValue` 这一对约定: - **Prop 名称**:父组件传入的数据被命名为 `modelValue`。 - **事件名称**:子组件通过 `$emit('update:modelValue', newValue)` 向外发送新的值。 以下是具体的例子: ```html <!-- 子组件 --> <template> <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)"> </template> <script> export default { props: ['modelValue'] } </script> ``` 而在父组件中可以这样使用: ```html <MyComponent v-model="parentData"/> ``` 这会被编译为: ```javascript <MyComponent :modelValue="parentData" @update:modelValue="newValue => parentData = newValue"></MyComponent> ``` 值得注意的是,如果需要支持多个 `v-model` 绑定,则可以通过 `v-model:[propName]` 来扩展功能。 #### 4. 深度解析:源码层面的工作流程 从源码角度来看,`v-model` 的实现涉及 AST 转换阶段以及运行时的行为。 ##### (1) 模板解析阶段 当 Vue 解析模板时,会将带有 `v-model` 的标签转化为对应的渲染函数结构。这一过程发生在模板字符串转为抽象语法树(AST Tree)的过程中。 例如: ```html <input v-model="text"> ``` 经过解析后生成如下 AST 结构的一部分: ```json { "tag": "input", "attrsMap": { ":value": "text", "@input": "text = arguments[0]" } } ``` 随后,在生成 render 函数时,这些信息进一步映射为实际的操作逻辑。 ##### (2) 渲染阶段 在虚拟 DOM 更新过程中,Vue 会对绑定了 `v-model` 的节点应用特定规则。比如,确保每次重新渲染时都将最新的 `modelValue` 设置给对应 DOM 元素;同时注册相应的事件处理器以便捕获用户交互并反馈至响应式系统[^3]。 #### 5. 总结 综上所述,Vue3 中的 `v-model` 主要基于两个核心机制完成其工作——即属性绑定与事件驱动。相比 Vue2,虽然 API 设计有所调整(如改用 `modelValue` 替代原来的 `value`),但在底层仍然延续了类似的思路。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亢亢是个程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值