渠道云业务组件
Web project built on React.js + Typescript
Project setup
npm install
Compiles and hot-reloads for development on http://localhost:3000
npm run start
Compiles and minifies for production
npm run build
Usage
import {ValidationForm} from 'cloud-component'
const [valueObj, setValueObj] = useState<any>({})
const [formValidation, setFormValidation] = useState()
const formConfig = [
{
key: 'text',
value: valueObj.text,
type: 'text',
placeholder: "请输入文本信息",
horizontal: true,
label: "文本输入",
required: true,
clearable: true,
outerClassName: 'form-item',
disabled: false,
rules: [{
type: 'string',
required: true,
message: "不许为空"
}]
}]
function save() {
formValidation().then(isValid => {
if (!isValid) {
console.log("invalid")
} else {
console.log("valid")
}
})
}
function handleChange(obj, key) {
setValueObj(obj)
}
return (
<>
<ValidationForm formConfig={formConfig} onChange={handleChange} onValidate={(fn) => {
setFormValidation(fn)
}}></ValidationForm>
<Button type="primary" onClick={save}>保存</Button>
</>
)
表单配置说明
参数 | 是否必填 | 说明 |
---|
key | 是 | 唯一 key |
value | 是 | 值 |
type | 是 | text, select, number, checkbox, radio, switch, password, date, daterange, textarea |
placeholder | 否 | |
horizontal | 否 | 默认是否,true 代表水平表单项 |
label | 否 | 表单项 label |
required | 否 | 是:有必填标志,否:无必填标志 |
clearable | 否 | 是否有清除图标 |
outerClassName | 否 | 表单项自定义类名 |
disabled | 否 | 是否禁用 |
rules | 是 | 校验规则。数组形式,若无校验规则,传入空数组。数组内单一项数据结构如下说明 |
attrs | 否 | 其他信息,可参照各个组件参数 |
rules
参数 | 是否必填 | 说明 |
---|
type | 是 | array, object, string, email, number, url, password |
required | 是 | 是否必填 |
range | 否 | 若值为数字表示值是否在区间内,若值为字符串表示长度是否在区间内 |
message | 是 | 错误提示信息 |
maxLength | 否 | 字符串最大长度 |
pattern | 否 | 自定义正则 |
custom | 否 | 自定义函数, 结果须返回布尔值 |
attrs
参数 | 是否必填 | 说明 |
---|
className | 否 | 组件的自定义类名 |
options | 否 | checkbox, radio, select 的 options |
noOptionsMessage | 否 | select 的 noOptionsMessage |
mode | 否 | select 参数,若为多选 mode=multiple,不填默认单选 |
isShowTime | 否 | 日历参数 |
minDate | 否 | 日历参数,最小可选日期 |
maxDate | 否 | 日历参数,最大可选日期 |
rangeSeparator | 否 | 日历参数 |
- filter-form 使用规则 ####说明:查询条件
import { FilterForm } from 'cloud-component';
filterConf = [
{
name: '操作人',
type :'input',
placeholder: '请输入操作人',
value: '张**',
onChange : (res) => console.log(res)
},
{
name: '操作类型',
type :'select',
selectOpts: [{ value: 0, label: '登陆' }, { value: 1, label: '删除员工组' }],
value: 1,
onChange : (res) => console.log(res)
},
{
name: '起止时间',
type :'dateRange',
value: new Date(),
disabledDate: (time) => time > new Date(),
onChange : (res) => console.log(res)
},
{
name: '时间',
type :'dateTime',
value: new Date(),
onChange : (res) => console.log(res)
}
];
return (
<FilterForm filterFormConf={this.filterConf} />
)
filter-form 配置说明
参数 | 是否必填 | 类型 | 说明 |
---|
filterFormConf | array | 是 | 配置项 |
filterFormConf 参数说明
参数 | 是否必填 | 参数类型 | 说明 |
---|
type | 是 | string | input , select ,dateRange , dateTime |
name | 是 | string | 字段中文名 |
value | 是 | string , number , Date | 值 |
selectOpts | 否 | array | type 为 select 传的配置项 |
placeholder | 否 | string | placeholder |
onChange | 是 | function | 回调 |
format | 否 | string | 时间格式化 |
isReadOnly | 否 | boolean | 时间组件是否为只读 |
horizontal | 否 | boolean | 水平布局 |
说明: 页面级布局组件
import { PageLayout, FilterBox, FilterForm } from 'cloud-component';
return (
<PageLayout className={styles['layout']}>
<PageLayout.Header>
<PageLayout.Header.Left title="日志管理" />
<PageLayout.Header.Right>
<span>检索结果: 100条</span>
<Button.Box>
<Button
type="primary"
inverse={true}
>批量导出
</Button>
</Button.Box>
</PageLayout.Header.Right>
</PageLayout.Header>
<PageLayout.Content>
<PageLayout.Content.Left>
<FilterBox
onSearch={() => { }} onReset={() => { }}>
<FilterForm filterFormConf={this.filterConf} />
</FilterBox>
</PageLayout.Content.Left>
<PageLayout.Content.Right>
<div> content 部分</div>
</PageLayout.Content.Right>
</PageLayout.Content>
</PageLayout>
)
PageLayout 参数说明
参数 | 是否必填 | 参数类型 | 说明 |
---|
className | 否 | string | class 名称 |
style | 否 | string | 样式 |
title | 是 | string | <PageLayout.Header>页面左上角的 title 名称 |
说明: 页面级布局组件
import { Layout } from 'cloud-component';
const { Header, Content } = Layout;
return (
<Layout>
<Header
total={10000}
btns={[
{
name: "按钮1",
action: () => {
alert(1);
}
},
{
name: "按钮2",
action: () => {
alert(2);
}
}
]}
>
搜索栏占位
</Header>
<Content>
<Table>
<Table.Head>
<Th>抓拍照片</Th>
<Th>底库照片</Th>
<Th>姓名</Th>
<Th>人员类型</Th>
</Table.Head>
<Table.Body>
{recordList.map(item => (
<Tr key={item.deviceId}>
<Td>
<img src={item.snaphopUri} />
</Td>
<Td>
<img src={item.personImage} />
</Td>
<Td>{item.personName}</Td>
<Td>{item.personType}</Td>
<Td>{item.deviceName}</Td>
</Tr>
))}
</Table.Body>
</Table>
<Page
page={recordListPage}
onPageChange={pageNum =>
recordStore.getRecordList({ pageNum, pageSize })
}
onPageSizeChange={pageSize =>
recordStore.getRecordList({ pageNum, pageSize })
}
/>
</Content>
</Layout>
);
Layout.Header 参数说明
参数 | 是否必填 | 参数类型 | 说明 |
---|
total | 否 | number | 列表总数 |
btns | 否 | array:{name:string,action:function} | 按钮数组 |
说明: 页面左侧筛选容器
import { FilterBox } from 'cloud-component';
return (
<FilterBox onSearch={() => { }} onReset={() => { }}>
</FilterBox>
)
参数 | 是否必填 | 参数类型 | 说明 | 默认值 |
---|
className | 否 | string | class 名称 | 无 |
style | 否 | string | 样式 | 无 |
title | 否 | string | <PageLayout.Header>页面左上角的 title 名称 | 检索条件 |
resetText | 否 | string | 重置按钮文案 | 重置 |
confirmText | 否 | string | 检索按钮文案 | 检索 |
onReset | 否 | function | 重置按钮的回调 | 无 |
onSearch | 否 | function | 检索按钮的回调 | 无 |
horizontal | 否 | boolean | 水平布局,有高级搜索功能 | 无 |
onSeniorSearch | 否 | function | 高级搜索回调 | 无 |
import * as React from 'react';
import {Icon} from 'react-x-component'
import {ScrollableList} from "cloud-component";
export default ()=>{
const {useState, useEffect} = React;
const [data, setData] = useState([]);
let [page, setPage] = useState(0);
let [hasMore, setHasMore] = useState(true);
let [disabled, setDisabled] = useState(false);
const config = {
titleKey:'name',
subTitleKey:'remark',
actions:(row)=>{
return(
<>
<Icon name="edit" onClick={()=>handleEdit(row)}/>
<Icon name="trash" onClick={()=>handleDelete(row)}/>
</>
)
}
}
function handleLoad() {
const init:any = []
if(page < 4){
for(let i = page*15; i< (page+1)*15; i++){
init.push({id:i, name:`工作日${i}`,remark:`${i%2==0?'':'remark'}`})
}
setPage(page+1);
setData(data.concat(init));
}else{
setHasMore(false)
}
}
function handleEdit(row) {
setDisabled(true)
console.log('edit',row)
}
function handleDelete(row){
console.log('delete',row)
}
useEffect(()=>{
const init:any = [];
for(let i = 0; i< 15; i++){
init.push({id:i, name:`工作日${i}`,remark:`${i%2==0?'':'remark'}`});
}
setPage(page+1);
setData(init)
},[])
return(
<ScrollableList config={config} onLoad={handleLoad} data={data} hasMore={hasMore}
disabledOthers={disabled}/>
)
}
滚动列表参数
参数 | 是否必填 | 说明 |
---|
config | 是 | 每行的配置信息包括 titleKey, subTitleKey, actions |
data | 是 | 列表数据 |
onLoad | 是 | 处理每次 load 的函数 |
loader | 否 | loading 时候渲染的 react component |
hasMore | 是 | 是否还有数据需要加载 |
disabledOthers | 否 | 除选中行外,其他行置灰 |
import * as React from 'react';
import {CardBox} from "cloud-component";
export default () => {
function handleSearch() {
console.log('search')
}
function handleClick() {
console.log('click')
}
function handleInputChange() {
console.log('change')
}
function handleInputEnter() {
console.log('enter')
}
return (
<CardBox btnText="新增人员组" text="共100人" searchPlaceholder={'请输入人名'} onClick={handleClick} onSearch={handleSearch}
onChange={handleInputChange} onEnter={handleInputEnter}/>
)
}