使用场景,当输入框输入内容,下拉框自动筛选
注意点
组件是为了一次封装,多次使用
所需数据 —— 来自属性
- data,存放着下拉框数据,然后根据输入框内容进行筛选
- inputObj, 存放着下拉框本身所需要的文本,placeholder 信息
- defaultSelection, 存放着默认信息
组件本身的数据
- current 存放选中项索引
- selection 存放选中项内容
- suggestion 存放所有的匹配项
- open 控制下拉框是否显示的条件之一
input 元素的事件
有的事件,记得阻止默认操作
input
keydown.up
keydown.down
keydown.enter
每个li
的事件
- click
父组件获取input的输入值
- 通过属性向
autocomplete
组件传入各种数据 - 在
input
,enter
,click
等事件中,改变input
的值,记得发送
this.$emit("selection",this.selection)
下拉框展示
- 展开的条件
- 输入框有值
- 匹配项长度大于0
-
open
为 ture
- 父组件通过上边的判断,决定是否要添加一个类样式名
open
-
dropdown-menu
默认是display:none
,.open .dropdown-menu
改为display:block
技巧
- data一般是对象数组,存的数据千变万化。比如,选择“昵称”时,数据存放在对象的
nickname
中,选择“地区”时,数据存放在对象location
中。 - 在
inputObj
中添加type
属性,控制使用data
中每一项的哪个属性
// data 可能的情况
data: [{nickname:'yy',age:19},{nickname:'ff',age:7}]
data: [{location:'hn'},{locaiton:bj}]
<!--在模板中,如果直接使用data,需要写两种-->
<li v-for="item in data">{{item.nickname}}</li>
<li v-for="item in data">{{item.location}}</li>
- 但是通过上述方法,在计算属性中,将数据处理一下
matches: function () {
let temp= []
for (let item of this.data) {
temp.push(item[this.inputObj.type])
}
return temp
}
css回顾
关于文本
p {
text-overflow: ellipsis;
white-space: nowrap;
}
-
text-overflow
c3属性,有
- clip
- ellipsis
- str
-
white-space
c1
- nowrap,文本不换行,一行显示
- normal
- wrap
- pre,空格和换行都保留
pre-line
pre-wrap
关于placeholder
/*兼容ie9以上等现代浏览器*/
::-webkit-input-placeholder {color:#1a2c3b;} /* WebKit browsers */
::-moz-placeholder {color: #1a2b3c;} /* Mozilla Firefox 4 to 18 */
:-moz-placeholder {color: #1a2b3c;} /* Mozilla Firefox 19+ */
:-ms-input-placeholder {color:#1a2b3c;} /* Internet Explorer 10+ */
- 还可以通过js实现
- focus,blur事件
- 在提交表单内容时,记得判断。如果
input
内容和placeholder
一样,那么将该input
内容清空
总结
这也是个含有
input
表单控件的组件,但是组件上没有使用v-model
- 通过属性传递
input
的默认值 - 赋值给
data
,在input
上使用v-model
- 在
input
值改变的时候,就要使用$emit
通知父组件