v-model的js原生写法和底层原理

数据绑定

v-model原理

  • 原理:

    html 复制代码
    <template>
      <div id="app">
        <input v-model="msg" type="text">   //在vue中提供数据的双向绑定
        //这里两个输入框作用都是一样的
        //v-bind 的作用是使得 HTML 元素的某个属性能够动态地根据 Vue 实例中的数据进行更新,监听input输入值
        <input :value="msg" @input="msg = $event.target.value" type="text">
      </div>
    </template>

    两者区别

    • v-model: vue实例中数据更新视图更新,视图更新数据就更新
    • :value: 如果只写:value="msg" 这一步,数据变化视图也变化,但视图变化数据就不会更新到data中,此时就对输入框进行事件监听@input,将获取的值赋值给msg, $event事件的形参

表单类组件封装 & v-model 简化

表单类组件封装

​ 在组件拆分当中,当把多个表单进行封装模块化时,把数据放在父组件中,实现表单提交数据,子组件通过父传子拿到数据后,如果直接用v-model数据绑定,是不能直接和props传递的数据进行绑定的,子组件修改修改数据时就不方便,不能使用v-model是因为数据是父组件提供的:value的思路就方便很多

父组件

html 复制代码
  <BaseSelect :cityId="select" @事件名="selectId = $event"></BaseSelect>   //父组件传递数据,监听子组件事件

子组件

html 复制代码
  <select :value="cityId" @change="handelChange"> </select>
javascript 复制代码
  props: {
    cityId: String
  }
javascript 复制代码
  methods: {
    handleChange (e) {
      this.$emit('事件名',e.target.value)
    }
  }

代码逻辑:子组件接收到cityId数据时 ,用:value数据绑定,然后对下拉框事件@change进行监听,方法 handleChange发送修改请求给父组件,父组件监听事件名

父组件v-model简化代码

​ 父组件可以用 v-model,实现父组件和子组件的双向数据绑定,子组件中props通过value接收事件触发 input

父组件中vimodel给组件直接绑定数据

html 复制代码
<BaseSlect :value="selectId" @input="selectId = $event"></BaseSlect> //v-model的原理
//直接写v-model的前提是,子组件中配置好:value  和  @input
<BaseSlect v-model="selectId"></BaseSlect>
html 复制代码
<select :value="value" @change="handleChange">
  
</select>
javascript 复制代码
props: {
  value: String
}
javascript 复制代码
methods: {
  handleChange(e) {
    this.$emit('input',e.target.value)
  }
}

代码逻辑:子组件接收数据的属性名直接改为value,都组件穿过来的数据就是value,向父组件发送修改的事件名为input,子组件代码修改没有太多

.sync修饰符

  • 作用:可以实现子组件和父组件数据的双向绑定
  • props属性名可以自定义,非固定为value,提高可读性
  • 场景:封装弹框类的基础组件, visible属性 true显示,false隐藏
相关推荐
毕业设计7034 小时前
(免费领源码) 基于微信小程序的预制菜商城的设计与实现25172-java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
vue.js·python·mysql·微信小程序·pycharm·微信开发者工具·推荐算法
xifangge20254 小时前
AGENTS.md 怎么写?涵盖 Java、Python、Vue、Go 的 8 套开箱即用模板
java·vue.js·python
雪芽蓝域zzs5 小时前
vue解构平铺VS对象包裹
前端·javascript·vue.js
Bs_MoneyMagnet9 小时前
基于springboot+vue的旅游景区点评系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·旅游
ID346107442010 小时前
【课程设计】基于Spring Boot+Vue的校园共享无人机服务系统设计与实现-计算机毕设 附源码44219
javascript·vue.js·spring boot·python·node.js·php·课程设计
BillKu10 小时前
Vue3 可拖拽分栏布局:两种实现方式详解
javascript·vue.js·ecmascript
雪芽蓝域zzs11 小时前
第三十七节:防抖、节流封装(composables 通用函数,搜索框防重复请求)
前端·javascript·vue.js
Bs_MoneyMagnet14 小时前
基于springboot+vue的爱心众筹系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·管理系统
Bs_MoneyMagnet16 小时前
基于springboot+vue的在线音乐管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
岁岁种桃花儿16 小时前
Vue组件化编程第二篇:非单位件组件
前端·javascript·vue.js