diff --git a/example/pages/search/index.js b/example/pages/search/index.js index 238d25b0..2c08c126 100644 --- a/example/pages/search/index.js +++ b/example/pages/search/index.js @@ -1,20 +1,27 @@ Page({ data: { - inputValue: '', - focus: true + value: '' }, - searchChange(e) { + onChange(e) { this.setData({ - inputValue: e.detail.value + value: e.detail }); }, - searchDone(e) { - console.error('search', e.detail.value) + onSearch(event) { + if (event.detail) { + wx.showToast({ + title: '搜索:' + event.detail, + icon: 'none' + }); + } }, - handleCancel() { - console.error('cancel') + onCancel() { + wx.showToast({ + title: '取消', + icon: 'none' + }); } }); diff --git a/example/pages/search/index.json b/example/pages/search/index.json index 392bdbfb..2441410e 100644 --- a/example/pages/search/index.json +++ b/example/pages/search/index.json @@ -1,8 +1,7 @@ { "navigationBarTitleText": "Search 搜索", "usingComponents": { - "van-icon": "../icon/index", - "van-search": "../../dist/search/index", - "van-panel": "../../dist/panel/index" + "demo-block": "../../components/demo-block/index", + "van-search": "../../dist/search/index" } } diff --git a/example/pages/search/index.wxml b/example/pages/search/index.wxml index a3aacec6..bdea9dc6 100644 --- a/example/pages/search/index.wxml +++ b/example/pages/search/index.wxml @@ -1,48 +1,31 @@ - + - + - + - + - + - - - - - + value="{{ value }}" + placeholder="请输入搜索关键词" + use-action-slot + bind:change="onChange" + bind:search="onSearch" + > + 搜索 + + diff --git a/package.json b/package.json index 3c9700f5..6607648b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vant-weapp", - "version": "3.0.10", + "version": "0.0.1-beta", "description": "高颜值、好用、易扩展的小程序 UI 库,Powered by 有赞", "main": "app.js", "directories": { diff --git a/packages/search/README.md b/packages/search/README.md index 9d0db097..2ba25aa8 100644 --- a/packages/search/README.md +++ b/packages/search/README.md @@ -3,63 +3,73 @@ ### 使用指南 在 index.json 中引入组件 ```json -{ - "usingComponents": { - "van-search": "/packages/search/index" - } +"usingComponents": { + "van-search": "/packages/search/index" } ``` -### 代码演示 +#### 基础用法 +value 用于控制搜索框中的文字 -```wxml +```html + +``` + +#### 监听对应事件 +Search 提供了 search 和 cancel 事件。search 事件在用户点击键盘上的搜索按钮触发。cancel 事件在用户点击搜索框右侧取消按钮时触发 + +```html ``` -```js -data: { - inputValue: '', - focus: true -}, -searchChange(e) { - this.setData({ - inputValue: e.detail.value - }); -}, +#### 自定义行动按钮 -searchDone(e) { - console.log('search', e.detail.value) -} +Search 支持自定义右侧取消按钮,使用名字为 action 的 slot 即可。 + +```html + + 搜索 + ``` ### API +Search 默认支持 Input 标签所有的原生属性,比如 `maxlength`、`placeholder`、`readony`、`autofocus` 等 -#### 参数 -| 名称 | 类型 | 是否必须 | 默认 | 描述 | -| ---------------- | ----------- | -------- | ----- | --------------------------------------------------- | -| keyword | String | 否 | 无 | 默认搜索关键字 | -| disabled | Boolean | 否 | false | 是否禁用 | -| focus | Boolean | 否 | false | 是否获取焦点 | -| useCancel | Boolean | 否 | false | 是否显示取消按钮 | -| cancelText | String | 否 | 取消 | 取消按钮文字 | | -| placeholder | String | 否 | 无 | 输入框占位字符串 | -| cancelStyle | String | 否 | 无 | “取消”的样式 | -| inputStyle | String | 否 | 无 | “输入框”的样式 -| searchStyle | String | 否 | 无 | “整个搜索”的样式 +| 参数 | 说明 | 类型 | 默认值 | +|-----------|-----------|-----------|-------------| +| value | 当前输入的值 | `String | Number` | - | +| background | 搜索框背景色 | `String` | `#f2f2f2` | +| show-action | 是否在搜索框右侧显示取消按钮 | `Boolean` | `false` | +| use-action-slot | 是否使用 action slot | `Boolean` | `false` | +| disabled | 是否禁用输入框 | `Boolean` | `false` | +| readonly | 是否只读 | `Boolean` | `false` | +| maxlength | 最大输入长度,设置为 -1 的时候不限制最大长度 | `Number` | `-1` | +| focus | 获取焦点 | `Boolean` | `false` | -#### 事件 +### Event +Search 默认支持 Input 标签所有的原生事件,如 `focus`、`blur`、`keypress` 等 -| 名称 | 类型 | 是否必须 | 默认 | 描述 -| ---------------- | ----------- | -------- | ----- | ------| -| bindcancel | EventHandle | 否 | 无 | 取消按钮点击时触发 -| bindsearch | EventHandle | 否 | 无 | 键盘点击确认时触发 -| bindchange | EventHandle | 否 | 无 | 内容改变时触发 -| bindblur | EventHandle | 否 | 无 | 焦点丢失时触发 -| bindfocus | EventHandle | 否 | 无 | 焦点聚焦时触发 +| 事件名 | 说明 | 参数 | +|-----------|-----------|-----------| +| search | 确定搜索时触发 | event.detail: 当前输入值 | +| change | 输入内容变化时触发 | event.detail: 当前输入值 | +| cancel | 取消搜索搜索时触发 | - | +| focus | 输入框聚焦时触发 | - | +| blur | 输入框失焦时触发 | - | + +### Slot + +| 名称 | 说明 | +|-----------|-----------| +| action | 自定义搜索框右侧按钮,需要在`showAction`为 true 时才会显示 | diff --git a/packages/search/index.js b/packages/search/index.js index 42e1a1b7..7f051545 100644 --- a/packages/search/index.js +++ b/packages/search/index.js @@ -1,67 +1,57 @@ Component({ - externalClasses: ['search-class', 'input-class', 'cancel-class'], + externalClasses: ['custom-class', 'cancel-class'], + + options: { + multipleSlots: true + }, + properties: { - cancelText: { + disabled: Boolean, + readonly: Boolean, + showAction: Boolean, + useActionSlot: Boolean, + placeholder: String, + value: { type: String, - value: '取消' - }, - disabled: { - type: Boolean, - value: false - }, - focus: { - type: Boolean, - value: false - }, - keyword: { - type: String, - value: '' - }, - show: { - type: Array, - value: ['icon', 'cancel'] - }, - placeholder: { - type: String, - value: '请输入查询关键字', - observer(newVal) { - this.setData({ - inputWidth: `${(newVal.length * 14) + 45}px` - }); + observer(currentValue) { + this.setData({ currentValue }); } }, - useCancel: { - type: Boolean + background: { + type: String, + value: '#f2f2f2' }, - searchStyle: String, - cancelStyle: String, - inputStyle: String, + maxlength: { + type: Number, + value: -1 + } }, - data: { - inputWidth: 'auto' + + attached() { + this.setData({ currentValue: this.data.value }); }, + methods: { - blur() { - this.triggerEvent('blur'); + onChange(event) { + this.triggerEvent('change', event.detail); }, - clearInput() { - this.setData({ - focus: true - }); - this.triggerEvent('change', { value: '' }); - }, - cancelSearch() { + + onCancel() { + this.setData({ currentValue: '' }); this.triggerEvent('cancel'); + this.triggerEvent('change', ''); }, - focus() { + + onSearch() { + this.triggerEvent('search', this.data.currentValue); + }, + + onFocus() { this.triggerEvent('focus'); }, - inputChange(e) { - this._inputvalue = e.detail.value; - this.triggerEvent('change', { value: e.detail.value }); - }, - search(e) { - this.triggerEvent('search', { value: e.detail.value }); + + onBlur() { + this.triggerEvent('blur'); } } }); diff --git a/packages/search/index.json b/packages/search/index.json index 32640e0d..e39fb2d0 100644 --- a/packages/search/index.json +++ b/packages/search/index.json @@ -1,3 +1,7 @@ { - "component": true -} \ No newline at end of file + "component": true, + "usingComponents": { + "van-icon": "../icon/index", + "van-field": "../field/index" + } +} diff --git a/packages/search/index.pcss b/packages/search/index.pcss index c3260c4f..3a2559a9 100644 --- a/packages/search/index.pcss +++ b/packages/search/index.pcss @@ -1,89 +1,41 @@ +@import '../common/index.pcss'; + .van-search { + display: flex; + padding: 7px 15px; + align-items: center; box-sizing: border-box; - display: flex; - justify-content: space-between; - align-items: center; - background: transparent; - padding:5px 10px; -} -.van-search.center-placeholder { - background: #ffffff; -} + &__field { + flex: 1; + border-radius: 4px; -.van-search.center-placeholder .van-search__form { - margin-left: 50%; - transform: translateX(-50%); - border: none; -} + &__left-icon { + color: $gray-dark; + } + } -.van-search.van-cell::after { - display: none; -} + &--show-action { + padding-right: 0; + } -.van-search__form { - display: flex; - flex: 1; - background:#ffffff; - border-radius: 4rpx; - height: 64rpx; - line-height: 56rpx; - justify-content: space-between; - align-items: center; -} + input { + &::-webkit-search-decoration, + &::-webkit-search-cancel-button, + &::-webkit-search-results-button, + &::-webkit-search-results-decoration { + display: none; + } + } -.van-search picker { - display: flex; - align-items: center; - height: 100%; - padding-right: 20rpx; -} + &__action { + padding: 0 10px; + font-size: 14px; + line-height: 30px; + color: $gray-darker; -.van-search__form .picker { - position: relative; - width: 110rpx; - height: 100%; - color: #666; - font-size: 28rpx; - margin-left: 20rpx; -} -.van-search__form .picker::after { - content: ''; - width: 0; - height: 0; - position: absolute; - right: 0; - top: 50%; - margin-top: -6rpx; - border-top: 12rpx solid #333; - border-right: 8rpx solid transparent; - border-left: 8rpx solid transparent; -} -.van-search__form input { - height: 100%; - flex: 1; - padding: 0 20rpx; - font-size: 28rpx; - color: #333; -} -.van-search__form icon { - margin-left: 20rpx; - line-height: 1; -} - -.van-search__clear { - padding: 12rpx 20rpx; -} - -.van-search__placeholder { - font-size: 28rpx; - color: #cacaca; -} -.van-search__cancel { - align-self: stretch; - display: inline-flex; - align-items: center; - padding-left: 30rpx; - font-size: 28rpx; - color: #3388FF; + &:active { + background-color: $active-color; + } + } } diff --git a/packages/search/index.wxml b/packages/search/index.wxml index 2d22fc0b..ea062c3b 100644 --- a/packages/search/index.wxml +++ b/packages/search/index.wxml @@ -1,40 +1,28 @@ - - - + - - - {{cancelText || '取消'}} + + + 取消