vue 中子组件 input 的清空操作
问题来源
写 input 组件的时候需求一个清空按钮,但是如果直接修改 prop 中父级的传值会报错。但是如果不修改父级无法更新值,也会带来开发的问题。
解决
- v-model 完成大部分数据双向绑定
<input type="text" :value="inputValue"
@change="$emit('change',$event.target.value)"
@blur="$emit('blur',$event.target.value)"
@focus="$emit('focus',$event.target.value)"
@input ="$emit('input',$event.target.value)"
>
四个事件将 input 的事件传递,在父级使用
<g-input v-model="num"></g-input>
- 但是在清空操作上出现难题, 因为无论怎么操作都无法触发 vue 上的数据驱动,简单清空子组件上的维护的数据是没有同步到父级上的,这里无疑最佳方案就是单向的数据流,让子组件发生事件时通知父级,父元素传值发生改变,进而改变子组件。不过感觉这样做就违背使用 v -model 的初衷,但是也没有办法了
- 对要进行监听的 dom 绑定事件
子组件中:
<div @click="clear">
<g-icon></g-icon>
</div>
将需要清空数据的消息告诉父级
clear(){this.$emit('inputclear',{clear:''})
}
以上两种可以合并成
<div @click="$emit('inputclear',{clear:''})">
<g-icon v-if="isClearShow" icon="error" class="clearForInput" ></g-icon>
</div>
父级中:
<g-input v-model="num" @inputclear="num = $event.clear"></g-input>
现在就可以了