面试的时候遇见过这个问题,在项目中也经常遇到。今天来做一下记录,搜索框封装组件如何也实现v-model同步data中的数据?
先来理解一下这个问题,首先看看普通的input搜索框的v-model的表现:
1 | <template> |
上面这段代码执行的时候,当我们在input搜索框中进行输入的时候,都会随之修改data
中的数据q
,这就是v-model
双向数据绑定的结果,非常方便。
那么当我将input封装进一个组件中,
1 | // src/components/inputdemo.vue |
然后引用这个组件,
1 | <template> |
像这样直接就在组件标签<inputdemo>
中使用v-model='q'
企图像原生input那样做到双向数据绑定是不可以的。
那么应该怎么做才对?
- 在inputdemo组件中的props里记录value,必须是value。
- 在inputdemo组件的input标签中绑定
:value="value"
- 在inputdemo组件的input标签中添加事件
@input="$emit('input', $event.target.value)"
,向调用者emit一个事件称为input
,同时将$event.target.value
作为参数传过去。
这样就可以直接在组件标签<inputdemo>
中使用v-model='q'
像原生input那样做到双向数据绑定。
1 | // src/components/inputdemo.vue |