v1.0.11
#### 新增 - 新增`disabled`配置, 可以禁用多选 - 新增`create`配置, 可以创建条目, 具体见 [创建条目](https://maplemei.gitee.io/xm-select/#/example/XM27) - 方法`warning`新增参数`sustain`, 可以配置是否持续显示 - 新增全局`get`方法, 可以获取多选渲染后的对象 - 新增全局`batch`方法, 可以批量给渲染后的多选执行方法 #### Bug fixes - 修复`update`方法, 会使已选中数据丢失的问题 - 修复`Safari`浏览器下, 搜索框无法聚焦的问题
This commit is contained in:
parent
6d23654a43
commit
20e535ac90
18
CHANGELOG.md
18
CHANGELOG.md
@ -1,5 +1,23 @@
|
|||||||
## 更新日志
|
## 更新日志
|
||||||
|
|
||||||
|
### 1.0.11
|
||||||
|
|
||||||
|
*2019-10-23*
|
||||||
|
|
||||||
|
#### 新增
|
||||||
|
|
||||||
|
- 新增`disabled`配置, 可以禁用多选
|
||||||
|
- 新增`create`配置, 可以创建条目, 具体见 [创建条目](https://maplemei.gitee.io/xm-select/#/example/XM27)
|
||||||
|
- 方法`warning`新增参数`sustain`, 可以配置是否持续显示
|
||||||
|
- 新增全局`get`方法, 可以获取多选渲染后的对象
|
||||||
|
- 新增全局`batch`方法, 可以批量给渲染后的多选执行方法
|
||||||
|
|
||||||
|
#### Bug fixes
|
||||||
|
|
||||||
|
- 修复`update`方法, 会使已选中数据丢失的问题
|
||||||
|
- 修复`Safari`浏览器下, 搜索框无法聚焦的问题
|
||||||
|
|
||||||
|
|
||||||
### 1.0.10
|
### 1.0.10
|
||||||
|
|
||||||
*2019-10-20*
|
*2019-10-20*
|
||||||
|
2
dist/static/2.js
vendored
2
dist/static/2.js
vendored
File diff suppressed because one or more lines are too long
2
dist/static/3.js
vendored
2
dist/static/3.js
vendored
File diff suppressed because one or more lines are too long
10
dist/static/docs.js
vendored
10
dist/static/docs.js
vendored
File diff suppressed because one or more lines are too long
2
dist/xm-select.js
vendored
2
dist/xm-select.js
vendored
File diff suppressed because one or more lines are too long
@ -177,6 +177,7 @@ button, input, select, textarea {
|
|||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 300px;
|
width: 300px;
|
||||||
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
.xm-select-size{
|
.xm-select-size{
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
@ -204,6 +205,7 @@ button, input, select, textarea {
|
|||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
|
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
&:hover{
|
&:hover{
|
||||||
opacity: .8;
|
opacity: .8;
|
||||||
|
BIN
docs/assets/dataNotArray.png
Normal file
BIN
docs/assets/dataNotArray.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.7 KiB |
@ -5,6 +5,14 @@
|
|||||||
|
|
||||||
放下她, 让我来!!! 默认颜色`#e54d42`, 多选上限的样色
|
放下她, 让我来!!! 默认颜色`#e54d42`, 多选上限的样色
|
||||||
|
|
||||||
|
```
|
||||||
|
/*
|
||||||
|
* COLOR: 自定义颜色, 默认是 options.theme.maxColor的颜色
|
||||||
|
* SUSTAIN: 是否持续显示, 默认为false
|
||||||
|
*/
|
||||||
|
xmSelectObj.warning(COLOR, SUSTAIN);
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
:::demo
|
:::demo
|
||||||
```html
|
```html
|
||||||
@ -31,7 +39,6 @@ document.getElementById('demo1-warning').onclick = function(){
|
|||||||
|
|
||||||
### 自定义闪烁颜色
|
### 自定义闪烁颜色
|
||||||
|
|
||||||
|
|
||||||
:::demo
|
:::demo
|
||||||
```html
|
```html
|
||||||
<div id="demo2" class="xm-select-demo"></div>
|
<div id="demo2" class="xm-select-demo"></div>
|
||||||
@ -53,3 +60,29 @@ document.getElementById('demo2-warning').onclick = function(){
|
|||||||
</script>
|
</script>
|
||||||
```
|
```
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
|
||||||
|
### 持续显示
|
||||||
|
|
||||||
|
:::demo
|
||||||
|
```html
|
||||||
|
<div id="demo3" class="xm-select-demo"></div>
|
||||||
|
<button class="btn" id="demo3-warning">警告</button>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var demo3 = xmSelect.render({
|
||||||
|
el: '#demo3',
|
||||||
|
data: [
|
||||||
|
{name: '张三', value: 1, selected: true},
|
||||||
|
{name: '李四', value: 2},
|
||||||
|
{name: '王五', value: 3, disabled: true},
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
document.getElementById('demo3-warning').onclick = function(){
|
||||||
|
demo3.warning('#6739b6', true);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
90
docs/mds/XM26.md
Normal file
90
docs/mds/XM26.md
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
## 禁用
|
||||||
|
|
||||||
|
|
||||||
|
### 渲染禁用
|
||||||
|
|
||||||
|
```
|
||||||
|
xmSelect.render({
|
||||||
|
//...
|
||||||
|
disabled: true
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
:::demo
|
||||||
|
```html
|
||||||
|
<div id="demo1" class="xm-select-demo"></div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var demo1 = xmSelect.render({
|
||||||
|
el: '#demo1',
|
||||||
|
disabled: true,
|
||||||
|
data: [
|
||||||
|
{name: '张三', value: 1, selected: true},
|
||||||
|
{name: '李四', value: 2},
|
||||||
|
{name: '王五', value: 3, disabled: true},
|
||||||
|
]
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
|
||||||
|
### 动态启用禁用
|
||||||
|
|
||||||
|
:::demo
|
||||||
|
```html
|
||||||
|
<div id="demo2" class="xm-select-demo"></div>
|
||||||
|
<button class="btn" id="demo21">禁用</button>
|
||||||
|
<button class="btn" id="demo22">启用</button>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var demo2 = xmSelect.render({
|
||||||
|
el: '#demo2',
|
||||||
|
data: [
|
||||||
|
{name: '张三', value: 1, selected: true},
|
||||||
|
{name: '李四', value: 2},
|
||||||
|
{name: '王五', value: 3, disabled: true},
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
document.getElementById('demo21').onclick = function(){
|
||||||
|
demo2.update({ disabled: true });
|
||||||
|
}
|
||||||
|
document.getElementById('demo22').onclick = function(){
|
||||||
|
demo2.update({ disabled: false });
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
|
||||||
|
### 选完`张三`后禁用
|
||||||
|
|
||||||
|
:::demo
|
||||||
|
```html
|
||||||
|
<div id="demo3" class="xm-select-demo"></div>
|
||||||
|
<button class="btn" id="demo3-disabled">启用</button>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var demo3 = xmSelect.render({
|
||||||
|
el: '#demo3',
|
||||||
|
data: [
|
||||||
|
{name: '张三', value: 1},
|
||||||
|
{name: '李四', value: 2},
|
||||||
|
{name: '王五', value: 3},
|
||||||
|
],
|
||||||
|
on({ arr, change, isAdd }){
|
||||||
|
var hasZS = change.find(item => item.name === '张三');
|
||||||
|
if(isAdd && hasZS){
|
||||||
|
demo3.update({ disabled: true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
//没有做不到, 只有想不到, 把多选玩出花来吧
|
||||||
|
document.getElementById('demo3-disabled').onclick = function(){
|
||||||
|
demo3.update({ disabled: false });
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
:::
|
78
docs/mds/XM27.md
Normal file
78
docs/mds/XM27.md
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
## 创建条目
|
||||||
|
|
||||||
|
|
||||||
|
### 搜索不存在则创建条目
|
||||||
|
|
||||||
|
```
|
||||||
|
//想创建就必须要开启本地搜索
|
||||||
|
xmSelect.render({
|
||||||
|
//...
|
||||||
|
filterable: true,
|
||||||
|
create: function(val){
|
||||||
|
//返回一个创建成功的对象, val是搜索的数据
|
||||||
|
return {
|
||||||
|
name: '创建-' + val,
|
||||||
|
value: val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
:::demo
|
||||||
|
```html
|
||||||
|
<div id="demo1" class="xm-select-demo"></div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var demo1 = xmSelect.render({
|
||||||
|
el: '#demo1',
|
||||||
|
filterable: true,
|
||||||
|
create: function(val){
|
||||||
|
return {
|
||||||
|
name: '创建-' + val,
|
||||||
|
value: val
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data: [
|
||||||
|
{name: '张三', value: 1, selected: true},
|
||||||
|
{name: '李四', value: 2},
|
||||||
|
{name: '王五', value: 3, disabled: true},
|
||||||
|
]
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
|
||||||
|
### 单选创建
|
||||||
|
|
||||||
|
:::demo
|
||||||
|
```html
|
||||||
|
<div id="demo2" class="xm-select-demo"></div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var demo1 = xmSelect.render({
|
||||||
|
el: '#demo2',
|
||||||
|
radio: true,
|
||||||
|
clickClose: true,
|
||||||
|
filterable: true,
|
||||||
|
create: function(val){
|
||||||
|
return {
|
||||||
|
name: '创建-' + val,
|
||||||
|
value: val
|
||||||
|
}
|
||||||
|
},
|
||||||
|
model: {
|
||||||
|
icon: 'hidden',
|
||||||
|
label: {
|
||||||
|
type: 'text',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data: [
|
||||||
|
{name: '张三', value: 1, selected: true},
|
||||||
|
{name: '李四', value: 2},
|
||||||
|
{name: '王五', value: 3},
|
||||||
|
]
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
:::
|
66
docs/mds/ZM07.md
Normal file
66
docs/mds/ZM07.md
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
## 获取实例对象
|
||||||
|
|
||||||
|
|
||||||
|
### 全局方法 get
|
||||||
|
|
||||||
|
```
|
||||||
|
//所有
|
||||||
|
xmSelect.get();
|
||||||
|
//字符串
|
||||||
|
xmSelect.get('#demo2');
|
||||||
|
//正则
|
||||||
|
xmSelect.get(/demo.*/);
|
||||||
|
//过滤方法
|
||||||
|
xmSelect.get((el) => {
|
||||||
|
return el == '#demo1' || el == '#xm3'
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
:::demo
|
||||||
|
```html
|
||||||
|
<div id="demo1" class="xm-select-demo"></div>
|
||||||
|
<div id="demo2" class="xm-select-demo"></div>
|
||||||
|
<div id="xm3" class="xm-select-demo"></div>
|
||||||
|
|
||||||
|
<div><button class="btn" id="btn1">get(所有)</button></div>
|
||||||
|
<div><button class="btn" id="btn2">get(字符串)</button></div>
|
||||||
|
<div><button class="btn" id="btn3">get(正则)</button></div>
|
||||||
|
<div><button class="btn" id="btn4">get(过滤方法)</button></div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
['#demo1', '#demo2', '#xm3'].forEach((el, index) => {
|
||||||
|
xmSelect.render({
|
||||||
|
el,
|
||||||
|
data: [
|
||||||
|
{name: '张三', value: 1, selected: true},
|
||||||
|
{name: '李四', value: 2},
|
||||||
|
{name: '王五', value: 3, disabled: true},
|
||||||
|
]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById('btn1').onclick = function(){
|
||||||
|
var xmList = xmSelect.get();
|
||||||
|
alert('当前页面多选个数: ' + xmList.length)
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById('btn2').onclick = function(){
|
||||||
|
var xmList = xmSelect.get('#demo2');
|
||||||
|
alert('获取 #demo2 实例: ' + xmList.length)
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById('btn3').onclick = function(){
|
||||||
|
var xmList = xmSelect.get(/demo.*/);
|
||||||
|
alert('获取匹配正则 /demo.*/ 的实例: ' + xmList.length)
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById('btn4').onclick = function(){
|
||||||
|
var xmList = xmSelect.get((el) => {
|
||||||
|
return el == '#demo1' || el == '#xm3'
|
||||||
|
});
|
||||||
|
alert('自定义方法的实例: ' + xmList.length)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
:::
|
61
docs/mds/ZM08.md
Normal file
61
docs/mds/ZM08.md
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
## 批量操作
|
||||||
|
|
||||||
|
|
||||||
|
### 批量操作已渲染实例
|
||||||
|
|
||||||
|
```
|
||||||
|
//filter, 同get方法
|
||||||
|
//method, 需要执行的方法
|
||||||
|
//args, 执行方法的参数
|
||||||
|
xmSelect.batch(filter, method, ...args);
|
||||||
|
```
|
||||||
|
|
||||||
|
:::demo
|
||||||
|
```html
|
||||||
|
<div id="demo1" class="xm-select-demo"></div>
|
||||||
|
<div id="demo2" class="xm-select-demo"></div>
|
||||||
|
<div id="xm3" class="xm-select-demo"></div>
|
||||||
|
|
||||||
|
<div><button class="btn" id="btn1">batch禁用</button></div>
|
||||||
|
<div><button class="btn" id="btn2">batch启用</button></div>
|
||||||
|
<div><button class="btn" id="btn3">batch警告</button></div>
|
||||||
|
<div><button class="btn" id="btn4">batch获取已选中数据</button></div>
|
||||||
|
|
||||||
|
<pre id="demo-value"></pre>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
['#demo1', '#demo2', '#xm3'].forEach((el, index) => {
|
||||||
|
xmSelect.render({
|
||||||
|
el,
|
||||||
|
data: [
|
||||||
|
{name: '张三', value: 1, selected: true},
|
||||||
|
{name: '李四', value: 2},
|
||||||
|
{name: '王五', value: 3, disabled: true},
|
||||||
|
]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById('btn1').onclick = function(){
|
||||||
|
xmSelect.batch('', 'update', {
|
||||||
|
disabled: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById('btn2').onclick = function(){
|
||||||
|
xmSelect.batch('', 'update', {
|
||||||
|
disabled: false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById('btn3').onclick = function(){
|
||||||
|
xmSelect.batch(/demo.*/, 'warning', '#F00', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById('btn4').onclick = function(){
|
||||||
|
var selectArr = xmSelect.batch(null, 'getValue', 'name');
|
||||||
|
document.getElementById('demo-value').innerHTML = JSON.stringify(selectArr, null, 2);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
:::
|
@ -10,8 +10,15 @@
|
|||||||
//先渲染多选
|
//先渲染多选
|
||||||
var demo1 = xmSelect.render({
|
var demo1 = xmSelect.render({
|
||||||
el: '#demo1',
|
el: '#demo1',
|
||||||
paging: true,
|
autoRow: true,
|
||||||
pageSize: 2,
|
filterable: true,
|
||||||
|
create: val => {
|
||||||
|
console.log(val)
|
||||||
|
return {
|
||||||
|
name: val,
|
||||||
|
value: val,
|
||||||
|
}
|
||||||
|
},
|
||||||
data(){
|
data(){
|
||||||
return [
|
return [
|
||||||
{name: '销售员', children: [
|
{name: '销售员', children: [
|
||||||
|
@ -41,6 +41,8 @@
|
|||||||
| showCount | 展示在下拉框中的最多选项数量 | int | - | 0 |
|
| showCount | 展示在下拉框中的最多选项数量 | int | - | 0 |
|
||||||
| autoRow | 是否开启自动换行(选项过多时) | boolean | true / false | false |
|
| autoRow | 是否开启自动换行(选项过多时) | boolean | true / false | false |
|
||||||
| size | 尺寸 | string | large / medium / small / mini | medium |
|
| size | 尺寸 | string | large / medium / small / mini | medium |
|
||||||
|
| disabled | 是否禁用多选 | boolean | true / false | false |
|
||||||
|
| create | 创建条目 | function(val), val: 搜索的数据 | - | null |
|
||||||
|
|
||||||
|
|
||||||
### prop
|
### prop
|
||||||
@ -163,7 +165,38 @@ list: [ "ALL", "CLEAR",
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### 方法
|
### 全局方法
|
||||||
|
|
||||||
|
|
||||||
|
| 事件名 | 说明 | 参数 | 返回值 |
|
||||||
|
| ------ | ------------------ | -------- | -------- |
|
||||||
|
| render | 渲染多选 | (options: 配置项) | 实例对象 |
|
||||||
|
| get | 获取页面中已经渲染的多选 | (filter: 过滤`el`) | 符合条件的实例数组 |
|
||||||
|
| batch | 批量操作已渲染的多选 | (filter: 过滤`el`, method: 方法, ...方法参数) | 符合条件的实例数组 |
|
||||||
|
|
||||||
|
```
|
||||||
|
//render 使用方式
|
||||||
|
xmSelect.render(OPTIONS);
|
||||||
|
|
||||||
|
//get 使用方式
|
||||||
|
xmSelect.get('#demo1'); //指定某一个获取
|
||||||
|
xmSelect.get(/.*demo1.*/); //正则获取
|
||||||
|
//自定义方法获取
|
||||||
|
xmSelect.get(function(el){
|
||||||
|
return el == '#demo1' || el == '#demo2';
|
||||||
|
});
|
||||||
|
|
||||||
|
//batch 使用方式
|
||||||
|
//批量执行禁用
|
||||||
|
xmSelect.batch(/.*demo/, 'update', {
|
||||||
|
disabled: true,
|
||||||
|
});
|
||||||
|
//批量执行warning
|
||||||
|
xmSelect.batch(/.*demo/, 'warning', '#F00', true);
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### 实例方法
|
||||||
|
|
||||||
:::warning
|
:::warning
|
||||||
xmSelect.render()后会返回一个xmSelect对象, 可以进行方法调用
|
xmSelect.render()后会返回一个xmSelect对象, 可以进行方法调用
|
||||||
@ -179,4 +212,4 @@ xmSelect.render()后会返回一个xmSelect对象, 可以进行方法调用
|
|||||||
| closed | 主动关闭下拉 | - |
|
| closed | 主动关闭下拉 | - |
|
||||||
| reset | 重置为上一次的render状态 | - |
|
| reset | 重置为上一次的render状态 | - |
|
||||||
| update | 更新多选选中, reset不保留 | (options: 见配置项) |
|
| update | 更新多选选中, reset不保留 | (options: 见配置项) |
|
||||||
| warning | 警告 | (color: 默认同theme.maxColor) |
|
| warning | 警告 | (color: 默认同theme.maxColor, sustain: 是否持续显示) |
|
||||||
|
@ -27,3 +27,34 @@
|
|||||||
### 4.占位标签为什么是div
|
### 4.占位标签为什么是div
|
||||||
|
|
||||||
演示中使用的是div, 不限制标签, 但是不建议使用`select`, 因为`layui`会渲染`select`标签
|
演示中使用的是div, 不限制标签, 但是不建议使用`select`, 因为`layui`会渲染`select`标签
|
||||||
|
|
||||||
|
|
||||||
|
### 5.动态数据渲染报错
|
||||||
|
|
||||||
|
![](../assets/dataNotArray.png)
|
||||||
|
|
||||||
|
检查设置的data数据是否为数组类型
|
||||||
|
|
||||||
|
```
|
||||||
|
var demo1 = xmSelect.render({
|
||||||
|
el: '#demo1',
|
||||||
|
data: []
|
||||||
|
})
|
||||||
|
|
||||||
|
//....N多操作以后
|
||||||
|
var arr = data;//这里的data可能是ajax返回的数据
|
||||||
|
|
||||||
|
//这里必须是 [object Array]
|
||||||
|
console.log(Object.prototype.toString.call(arr));
|
||||||
|
//如果是 [object String]
|
||||||
|
//1. JSON数据
|
||||||
|
arr = JSON.parse(arr);
|
||||||
|
//2. 类似JSON的数据
|
||||||
|
arr = eval('(' + arr + ')');
|
||||||
|
|
||||||
|
demo1.update({
|
||||||
|
data: arr,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
@ -72,6 +72,8 @@ export default [{
|
|||||||
{ path: '/example/XM23', name: 'HiddenIcon 隐藏图标', component: importMd('/XM23') },
|
{ path: '/example/XM23', name: 'HiddenIcon 隐藏图标', component: importMd('/XM23') },
|
||||||
{ path: '/example/XM24', name: 'Size 尺寸', component: importMd('/XM24') },
|
{ path: '/example/XM24', name: 'Size 尺寸', component: importMd('/XM24') },
|
||||||
{ path: '/example/XM25', name: 'Warning 警告', component: importMd('/XM25') },
|
{ path: '/example/XM25', name: 'Warning 警告', component: importMd('/XM25') },
|
||||||
|
{ path: '/example/XM26', name: 'Disabled 禁用', component: importMd('/XM26') },
|
||||||
|
{ path: '/example/XM27', name: 'Create 创建条目', component: importMd('/XM27') },
|
||||||
]
|
]
|
||||||
}, {
|
}, {
|
||||||
path: '/example-custom',
|
path: '/example-custom',
|
||||||
@ -85,6 +87,8 @@ export default [{
|
|||||||
{ path: '/example-custom/ZM04', name: '远程搜索', component: importMd('/ZM04') },
|
{ path: '/example-custom/ZM04', name: '远程搜索', component: importMd('/ZM04') },
|
||||||
{ path: '/example-custom/ZM05', name: '动态数据', component: importMd('/ZM05') },
|
{ path: '/example-custom/ZM05', name: '动态数据', component: importMd('/ZM05') },
|
||||||
{ path: '/example-custom/ZM06', name: '弹框中的多选', component: importMd('/ZM06') },
|
{ path: '/example-custom/ZM06', name: '弹框中的多选', component: importMd('/ZM06') },
|
||||||
|
{ path: '/example-custom/ZM07', name: '获取实例对象', component: importMd('/ZM07') },
|
||||||
|
{ path: '/example-custom/ZM08', name: '批量操作', component: importMd('/ZM08') },
|
||||||
]
|
]
|
||||||
}, {
|
}, {
|
||||||
path: '/example-plugin',
|
path: '/example-plugin',
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "xm-select",
|
"name": "xm-select",
|
||||||
"version": "1.0.10",
|
"version": "1.0.11",
|
||||||
"description": "始于Layui的select多选解决方案",
|
"description": "始于Layui的select多选解决方案",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -15,8 +15,12 @@ export default function (lan = 'zn') {
|
|||||||
name: 'select',
|
name: 'select',
|
||||||
//尺寸
|
//尺寸
|
||||||
size: 'medium',
|
size: 'medium',
|
||||||
|
//是否禁用多选
|
||||||
|
disabled: false,
|
||||||
//默认选中数据, 优先级大于selected
|
//默认选中数据, 优先级大于selected
|
||||||
initValue: null,
|
initValue: null,
|
||||||
|
//创建条目
|
||||||
|
create: null,
|
||||||
//默认提示
|
//默认提示
|
||||||
tips: setting.tips,
|
tips: setting.tips,
|
||||||
//空数据提示
|
//空数据提示
|
||||||
|
@ -162,11 +162,18 @@ class xmOptions {
|
|||||||
/**
|
/**
|
||||||
* 闪烁警告边框
|
* 闪烁警告边框
|
||||||
*/
|
*/
|
||||||
warning(color){
|
warning(color, sustain = false){
|
||||||
childs[this.options.el].updateBorderColor(color || this.options.theme.maxColor);
|
let showColor = color || this.options.theme.maxColor;
|
||||||
|
|
||||||
|
sustain === true ? (
|
||||||
|
childs[this.options.el].base.style.borderColor = showColor
|
||||||
|
) : (
|
||||||
|
childs[this.options.el].updateBorderColor(showColor)
|
||||||
|
)
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default xmOptions;
|
export default xmOptions;
|
||||||
|
@ -24,8 +24,9 @@ class Framework extends Component{
|
|||||||
reset(props){
|
reset(props){
|
||||||
//用于多选上限的边框颜色变化
|
//用于多选上限的边框颜色变化
|
||||||
this.updateBorderColor('');
|
this.updateBorderColor('');
|
||||||
|
let old = this.state.data;
|
||||||
this.resetDate(props.data);
|
this.resetDate(props.data);
|
||||||
this.value(props.initValue ? props.initValue : this.findValue(this.state.data), !!this.state.show);
|
JSON.stringify(props.data) !== JSON.stringify(old) && this.value(props.initValue ? props.initValue : this.findValue(this.state.data), !!this.state.show);
|
||||||
}
|
}
|
||||||
|
|
||||||
findValue(data){
|
findValue(data){
|
||||||
@ -115,6 +116,11 @@ class Framework extends Component{
|
|||||||
}
|
}
|
||||||
|
|
||||||
onClick(e){
|
onClick(e){
|
||||||
|
if(this.props.disabled){
|
||||||
|
this.state.show !== false && this.setState({ show: false });
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
let show = !this.state.show;
|
let show = !this.state.show;
|
||||||
|
|
||||||
if(show){
|
if(show){
|
||||||
@ -197,6 +203,9 @@ class Framework extends Component{
|
|||||||
this.updateBorderColor('')
|
this.updateBorderColor('')
|
||||||
}, 300);
|
}, 300);
|
||||||
}
|
}
|
||||||
|
if(config.disabled){
|
||||||
|
show = false;
|
||||||
|
}
|
||||||
|
|
||||||
//右边下拉箭头的变化class
|
//右边下拉箭头的变化class
|
||||||
const iconClass = show ? 'xm-icon xm-icon-expand' : 'xm-icon';
|
const iconClass = show ? 'xm-icon xm-icon-expand' : 'xm-icon';
|
||||||
@ -265,6 +274,7 @@ class Framework extends Component{
|
|||||||
<General { ...bodyProps } />
|
<General { ...bodyProps } />
|
||||||
) }
|
) }
|
||||||
</div>
|
</div>
|
||||||
|
{ config.disabled && <div class="xm-select-disabled"></div> }
|
||||||
</xm-select>
|
</xm-select>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -14,11 +14,11 @@ class Custom extends Component{
|
|||||||
}
|
}
|
||||||
|
|
||||||
shouldComponentUpdate(){
|
shouldComponentUpdate(){
|
||||||
return !this.already;
|
return !this.prepare;
|
||||||
}
|
}
|
||||||
|
|
||||||
render(config) {
|
render(config) {
|
||||||
this.already = true;
|
this.prepare = true;
|
||||||
return (
|
return (
|
||||||
<div onClick={ this.blockClick } class="xm-body-custom" dangerouslySetInnerHTML={{ __html: config.content }}>
|
<div onClick={ this.blockClick } class="xm-body-custom" dangerouslySetInnerHTML={{ __html: config.content }}>
|
||||||
|
|
||||||
|
@ -137,11 +137,11 @@ class General extends Component{
|
|||||||
|
|
||||||
render(config) {
|
render(config) {
|
||||||
|
|
||||||
let { data, prop, template, theme, radio, sels, empty, filterable, filterMethod, remoteSearch, remoteMethod, delay, searchTips } = config
|
let { data, prop, template, theme, radio, sels, empty, filterable, filterMethod, remoteSearch, remoteMethod, delay, searchTips, create } = config
|
||||||
|
|
||||||
const { name, value, disabled, children, optgroup } = prop;
|
const { name, value, disabled, children, optgroup } = prop;
|
||||||
|
|
||||||
let arr = deepMerge([], data);
|
let arr = deepMerge([], data), creator;
|
||||||
//是否开启了搜索
|
//是否开启了搜索
|
||||||
if(filterable){
|
if(filterable){
|
||||||
if(remoteSearch){//是否进行远程搜索
|
if(remoteSearch){//是否进行远程搜索
|
||||||
@ -181,6 +181,8 @@ class General extends Component{
|
|||||||
arr[arr.length - 1].__del = true;
|
arr[arr.length - 1].__del = true;
|
||||||
}
|
}
|
||||||
arr = arr.filter(item => !item.__del);
|
arr = arr.filter(item => !item.__del);
|
||||||
|
//创建条目
|
||||||
|
creator = this.state.filterValue && isFunction(create) && create(this.state.filterValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -352,9 +354,9 @@ class General extends Component{
|
|||||||
arr = arr.map(renderGroup);
|
arr = arr.map(renderGroup);
|
||||||
|
|
||||||
if(!arr.length){
|
if(!arr.length){
|
||||||
arr.push(
|
arr.push( creator ? renderItem(creator) : (
|
||||||
<div class="xm-select-empty">{ empty }</div>
|
<div class="xm-select-empty">{ empty }</div>
|
||||||
)
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
36
src/index.js
36
src/index.js
@ -3,13 +3,45 @@ import '@/components/common/expand'
|
|||||||
import Core from '@/components/core'
|
import Core from '@/components/core'
|
||||||
import '@/style/index.less'
|
import '@/style/index.less'
|
||||||
import '@/style/iconfont.less'
|
import '@/style/iconfont.less'
|
||||||
|
import { selector, warn } from '@/components/common/util'
|
||||||
|
|
||||||
|
const object = {}
|
||||||
const xmSelect = {
|
const xmSelect = {
|
||||||
name,
|
name,
|
||||||
version,
|
version,
|
||||||
render(options) {
|
render(options) {
|
||||||
return new Core(options);
|
let instance = new Core(options);
|
||||||
|
if(instance){
|
||||||
|
let { el } = options;
|
||||||
|
let select = object[el];
|
||||||
|
select !== undefined && (delete object[el]);
|
||||||
|
object[el] = instance;
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
},
|
||||||
|
get(filter){
|
||||||
|
let type = Object.prototype.toString.call(filter);
|
||||||
|
let method;
|
||||||
|
switch (type){
|
||||||
|
case '[object String]':
|
||||||
|
filter && (method = item => item === filter);
|
||||||
|
break;
|
||||||
|
case '[object RegExp]':
|
||||||
|
method = item => filter.test(item);
|
||||||
|
break;
|
||||||
|
case '[object Function]':
|
||||||
|
method = filter;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
let keys = Object.keys(object)
|
||||||
|
return (method ? keys.filter(method) : keys).map(key => object[key]).filter(instance => selector(instance.options.el));
|
||||||
|
},
|
||||||
|
batch(filter, method){
|
||||||
|
let args = [ ...arguments ];
|
||||||
|
args.splice(0, 2);
|
||||||
|
return this.get(filter).map(instance => instance[method](...args));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,6 +33,13 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.userselect(@v){
|
||||||
|
user-select: @v;
|
||||||
|
-ms-user-select: @v;
|
||||||
|
-moz-user-select: @v;
|
||||||
|
-webkit-user-select: @v;
|
||||||
|
}
|
||||||
|
|
||||||
xm-select{
|
xm-select{
|
||||||
*{
|
*{
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@ -42,10 +49,7 @@ xm-select{
|
|||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
// color: @fontColor;
|
// color: @fontColor;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
user-select: none;
|
.userselect(none);
|
||||||
-ms-user-select: none;
|
|
||||||
-moz-user-select: none;
|
|
||||||
-webkit-user-select: none;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
background-color: #FFF;
|
background-color: #FFF;
|
||||||
@ -363,6 +367,7 @@ xm-select{
|
|||||||
line-height: 1.3;
|
line-height: 1.3;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
|
.userselect(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
.dis{
|
.dis{
|
||||||
@ -401,6 +406,18 @@ xm-select{
|
|||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.xm-select-disabled{
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
cursor: no-drop;
|
||||||
|
z-index: 2;
|
||||||
|
opacity: 0.3;
|
||||||
|
background-color: #FFF;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//不同尺寸下的数据调整
|
//不同尺寸下的数据调整
|
||||||
|
Loading…
Reference in New Issue
Block a user