数据绑定
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隐藏