0.5.14 • Published 6 years ago

lm-ui-react v0.5.14

Weekly downloads
4
License
ISC
Repository
github
Last release
6 years ago

lm-ui-react

Build Status

项目描述

  • 58金融贷款组ui库

应用技术

  • react
  • jest && enzyme(单元测试)
  • travis(持续集成)

目标

  • 拥抱函数式无状态组件,使组件更加简洁可靠
  • 单元测试覆盖率达到80%以上

测试点(渲染,初始化,交互)

  • 1.render结构是否正常
  • 2.检查初始值
  • 3.检查点击事件,反馈是否正常
  • 4.根据测试覆盖率,作stmts, branch, funcs, lines相应的fill,希望达到70%以上

目录结构

  • /src 存放es6编写的源码
  • /lib 存放经过babel编译的es5代码
  • /example 存放开发用例代码
  • /tool 存放文件编译脚本
  • /test 存放单元测试代码

开始运行

  • 安装依赖包
npm install
  • 查看用例
npm run example
  • 进行单元测试
npm test
  • 编译生成lib文件
npm run lib
  • 编译生成lib&&dist文件
npm run build

基本原则

  • 对于展示组件来说,多用函数式无状态组件
    • 语法简洁性(fb)
    • 初始化快(就是一个纯函数,不需要在构建类)首次render性能好
    • 占内存少
  • 请慎用setState,确保你的每一次setState都确实会体现到UI上
    • 每次setState都会引起组件重新渲染,确保你的每一次setState都是有意义的。(性能相关)
    • 某些setState前先判断新旧值是否相同
  • 请慎将component当作props传入
    • 这种方式性能消耗较大
    • 推荐这种包裹方式
    • 如果是前缀后缀之类的情景,请传入函数式无状态组件
  • 请将方法的bind函数一律置于constructor
    • 在constructor只需要bind一次,如果在render中每次render都会去执行bind方法(性能相关)
  • 请只将组件需要的props传入组件,避免其他不相关props改变引起组件重新渲染
    • 避免引起组件不必要的渲染
  • 请在希望发生重新渲染的dom或组件上设置唯一key,否则react可能在某些情况下不会重新渲染
    • 如果你希望某个状态改变后,这个组件会执行卸载并重建操作,那么请给他一个key(可以用这个改变的状态当key!)否则很有可能会执行更新操作(特定需求场景)
  • 慎用太新ES6语法
    • 比如:Object.assign进行浅复制(微信上不支持)等...
    • 如果一定要用得话,请增加对应polyfile

进一步优化原则

  • 请将jsbundle拆分为几个chunk,进行异步加载。router中内置require.ensure

    • 原则上控制主包大小在100KB左右
  • 请使用immutable和PureComponent对渲染进行优化,提升项目性能

    • 务必一起使用
    • immutable不可变数据结构
    • PureComponent实质在组件shouldComponentUpdate生命周期中对新旧props,state做了次浅对比


DOC


控件列表


Dialog

  • props
参数说明类型默认值是否必要
modelStyle遮罩层样式设置object{}可选
opacity背景蒙层透明度number5可选
showState展示状态boolfalse必要
dialogType展示形式stringConfirm(Alert CustomPrompt CustomForm Custom)必要
dialogStyle弹窗样式设置object{}可选
headerType弹窗头部展示类型stringAlert(Confirm CustomPrompt CustomForm)可选
headText提示头文字string'提示'可选
headerStyle弹窗头部样式设置object{}可选
contentText提示内容文字string'提示内容'可选
contentStyle弹窗内容样式设置object{}可选
footerTypee弹窗底部展示类型stringAlert(Confirm Close)可选
btnLeftText左按钮文案string'取消'可选
btnRightText右按钮文案string'确定'可选
btnLeftCbFun左按钮点击时触发的函数fun()=>{}可选
btnRightCbFun右按钮点击时触发的函数fun()=>{}可选
btnCommonFun按钮点击触发的共用函数fun()=>{}可选
btnCloseFun点击关闭按钮时触发的函数fun()=>{}可选
<Dialog 
	dialogType={'Confirm'}
	showState={true}
	headText={'test head'}
	contentText={'提示内容提示内容提示内容'} 
	btnCommonFun={() => {this.setState({dialogState: false})}}
	btnLeftCbFun={() => {console.log('left fun')}}
	btnRightCbFun={() => {console.log('right fun')}}/>

Toast

  • props
参数说明类型默认值是否必要
toastTypetoast类型stringHint(Loading Success Fail Netless)必要
showState展示状态boolfalse必要
opacity背景蒙层透明度number5可选
message显示文案string'提示'可选
timeControl配置展示时间obj可选
<Toast
	showState={this.state.showState}
	toastType={'Hint'}
	opacity={0}
	timeControl={{ time: 2000, cbFun: () => {this.setState({showState: false})}}}
	message={'提示文字'} />

Form

  • props
参数说明类型默认值是否必要
listenRequireMapFun监听内部条件验证选项的实时信息fun可选
style增加样式obj可选
<Form listenRequireMapFun={(mapData) => { console.log(mapData) }} >
...
</Form>

FormGroup

  • props
参数说明类型默认值是否必要
groupId赋予组内空间idnumber or string可选
layout组内成员布局obj可选
style增加样式obj可选
children子类node必要
//PropTypes.string
<FormGroup  groupId={'inputId'}>
//PropTypes.obj,参照flex布局
<FormGroup layout={{ direction: 'row', justifyContent: 'space-between', alignItems: 'center' }}>

Label

  • props
参数说明类型默认值是否必要
children子类node必要
style增加样式obj可选
<Label>		
	<span>姓名</span>				
</Label>

Input

  • props
参数说明类型默认值是否必要
typeinput的类型'input' or 'textarea''input'必要
value输入的值all必要
defaultText默认placeholderall''必要
onChange值更改时触发次函数fun()=>{}必要
maxLengthtextarea中最大长度,超出文字标红number200可选
validateData验证信息obj{ promptText: string, validateFun: fun }可选
cleanBtn右侧清除按钮则配置obj{ state: true, cleanFun: fun }可选
preffix输入框前缀node可选
suffix输入框后缀node可选
disabled是否不可操作boolfalse可选
style增加样式obj可选
<Input
	type='input' 
	validateData={{ promptText: '请输入正确的姓名', validateFun: (value) => { return !!value && (value.trim() != '') && /^[\.·\u4e00-\u9fa5]{2,20}$/.test(value); } }}
	value={this.state.test5}
	cleanBtn={{ state: true, cleanFun: () => {this.setState({test5: ''})} }}
	defaultText={'aaa'}
    suffix={<GetCodeBtn onClick={() => {}} countNum={60} />} />
	onChange={(e) => {this.setState({test5: e.target.value})}} />

Switch

  • props
参数说明类型默认值是否必要
checked选中状态boolfalse必要
onChange选择时,调用此函数fun必要
disabled是否不可操作boolfalse可选
style增加样式obj可选
<Switch
	disabled={true}
	checked={this.state.checked} 
	onChange={() => { this.setState({checked: !this.state.checked}) }} />

Select

  • props
参数说明类型默认值是否必要
selectedValue选中的值string or number or bool必要
onChange选择时,调用此函数fun()=>{}必要
optionMapoption信息数组array{ text: string or number, value: string or number }...必要
disabled是否不可操作boolfalse可选
style增加样式obj可选
<Select
	selectedValue={this.state.selectVal}
	onChange={(e) => {this.setState({selectVal: e.target.value})}}
	optionMap={[{text:1, value:1}, {text:2, value:2}, {text:3, value:4}]} />

RadioGroup

  • props
参数说明类型默认值是否必要
nameRadio的name属性string必要
selectedValue选中的值array...必要
onChange选择时,调用此函数fun必要
style增加样式obj可选
children子类node必要

Radio

  • props
参数说明类型默认值是否必要
text选择项显示的文字string or number必要
value选择项实际的值string or number or bool必要
preffix前缀node可选
mode展现模式stringform(button)必要
uniqueId唯一idstring or number可选(如果mode==='button'则必要)
disabled是否不可操作boolfalse可选
style增加样式obj可选
<RadioGroup
	name={'radioName'}
	selectedValue={this.state.radioVal}
	onChange={(val) => {this.setState({ radioVal: val }) }}
	>
	<Radio text={'11'} value={1} />
	<Radio text={'22'} value={2} />
	<Radio text={'33'} value={3} />

	<Radio mode={'button'} uniqueId={111} text={'44'} value={4}  />
</RadioGroup>

CheckboxGroup

  • props
参数说明类型默认值是否必要
nameCheckbox的name属性string必要
selectedValue选中的值array...必要
onChange选择时,调用此函数fun必要
style增加样式obj可选
children子类node必要

Checkbox

  • props
参数说明类型默认值是否必要
text选择项显示的文字string or number必要
value选择项实际的值string or number or bool必要
preffix前缀node可选
mode展现模式stringform(button)必要
uniqueId唯一idstring or number可选(如果mode==='button'则必要)
disabled是否不可操作boolfalse可选
style增加样式obj可选
<CheckboxGroup
	name={'checkboxName'}
	selectedValue={this.state.checkboxVal}
	onChange={(val) => {console.log(`checkbox/${val}`); this.setState({ checkboxVal: val })}}>
	<Checkbox text={'11'} value={1} />
	<Checkbox text={'22'} value={2} />
	<Checkbox text={'33'} value={3} />
	
	<Checkbox mode={'button'} uniqueId={111} text={'22'} value={2} />

</CheckboxGroup>

CheckBtn

  • props
参数说明类型默认值是否必要
btnMap选择按钮的信息array{ text: string or number, value: string or number }...必要
selectedValue被选中的值string or number or bool必要
onChange选择时,调用此函数func()=>{}必要
disabled是否不可操作boolfalse可选
style增加样式obj可选
<CheckBtn
	btnMap={[{ text: '有', value: true }, { text: '无', value: false }]}
	selectedValue={this.state.checkBtn}
	onChange={(val) => {this.setState({ checkBtn: val })}} />

GetCodeBtn(表单中特殊按钮)

  • props
参数说明类型默认值是否必要
text按钮显示的文字string'获取验证码'可选
countNum倒计时时间number60可选
onClick点击时调用的函数func() => {}可选
disabled是否不可操作boolfalse可选
style增加样式obj可选
<GetCodeBtn 
      text={ '获取验证码'}
      countNum={60}
      onClick={() => {}} />

Button

  • props
参数说明类型默认值是否必要
size按钮大小string(small,big,long)small可选
type按钮类型string(primary,colorfulHollow,grayHollow)primary可选
icon按钮内图标地址string可选
isDisabled是否禁用boolfalse可选
isRadius是否有圆角booltrue可选
onClick点击事件func()=>{}可选
<Button
	size='small'
	btnType='primary'
	onClick={(e)=>{this.callbackFun(e)}}
>开关按钮</Button>

Icon

  • desc

    普通icon,可自定义添加属性className,style,或在中添加任意inline或inline-block元素。

    默认inline-block区域大小:20px*20px

  • props

参数说明类型默认值是否必要
children任意inline或inline-block元素node可选

其他属性(eg: className等未在文档中声明的属性),也可加到当前元素上

<Icon className="demo-icon-test" style={{color: 'red'}}>
   <img />
   ...
</Icon>

SvgIcon

  • desc

    svgIcon

    默认svg区域大小:20px*20px

  • props

参数说明类型默认值是否必要
children任意有效的svg图形路径node可选
viewBox设定svg内图形展示范围string'0 0 20 20'可选
colorsvg内图形填充色,对应style中的fillstring'#333'可选

其他属性(eg: className等未在文档中声明的属性),也可加到当前元素上

<SvgIcon className="test" color="#333" viewBox="0 0 20 20">
    <path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/>
</SvgIcon>

Tab标签切换

  • Tabs props
参数说明类型默认值是否必要
childrennode可选
value选中和当前value匹配的tab.当设置value且与相应的tab匹配,则initSelectedIndex无效string可选
onSelectedChange选中项改变时触发.参数(value, tab)func() => {}可选
initSelectedIndex初始选中的tab indexnumber0可选

其他属性(eg: className等未在文档中声明的属性),也可加到当前元素上

  • Tab props
参数说明类型默认值是否必要
children任意html元素,即当前tab下的内容node可选
value用于标识唯一的tab,不能重复string可选
labeltab文字string
iconicon图标node可选
onSelectAction当前选中某项触发.参数(tab)func() => {}可选

其他属性(eg: className等未在文档中声明的属性),也可加到当前元素上

<Tabs value='a' initSelectedIndex={0}>
    <Tab value='a'>
        <p>content</p>
    </Tab>
    <Tab value='b'/>
        ...
    <Tab value='c'/>
</Tabs>

TabsFooter标签切换

  • props 与 Tabs props一致

List

  • List props
参数说明类型默认值是否必要
childrennode可选
value适用于增加SelectableListHOC后。选中和当前value匹配的itemstring必选
onSelectedChange适用于增加SelectableListHOC后。选中项改变时触发.参数(value, item)func() => {}可选
  • ListItem props
参数说明类型默认值是否必要
primaryText文字string'list-item'可选
secondaryText右侧文字string''可选
leftIcon左侧图标number''可选
rightArrow右侧箭头element''可选
value适用于增加SelectableListHOC后。区分不同item唯一值string必选
onClick列表点击行为.若为可选择的列表,参数({value);若为普通列表,参数(event)func() => {}可选
children自定义组件内容nodenull可选

其他属性(eg: className等未在文档中声明的属性),也可加到当前元素上

当ListItem设置children,则primaryText, secondaryText失效

<List>
    <ListItem primaryText="内容" secondaryText="其他内容"/>
    ...
</List>


<ListItem onClick={ () => {} }>
    <div>
       自定义内容
    </div>
</ListItem>

Sort排序

  • SortGroup props
参数说明类型默认值是否必要
children, , , 其中一个或多个的集合node
onSortInfoUpdate筛选条件变化后的回调,参数(sortInfo)当前的筛选条件func() => {}可选
  • SortLabel、SortList、SortToggle props
参数说明类型默认值是否必要
filterItem筛选条件,具体格式如下说明array{label: '筛选',value: '1'}
onClick点击排序后的回调。参数:(当前选中的筛选条件, 选中状态)func() => {}可选
name唯一,sortGroup用来搜集当前选中的项string'sort_index'可选

filterItem说明:对于SortList可为函数,且返回promise,用于异步获取list

参数说明类型
value筛选key值,唯一string
label文本,即选择某项筛选条件后显示的名称string
displayLabel文本,通常用于SortList下拉列表中选中某项后,最终展示的标题string
isDefault是否默认选中.通常用于SortListbool
isAll点击该项时,不进行筛选.通常用于SortListbool
  • SortMulti props
参数说明类型默认值是否必要
filterItem筛选条件array{title: '多选标题', items: [{label: xx, value: xx}]
onClick同上func() => {}可选
name同上string''可选
const onSortInfoUpdate = (ret) => {
    console.log(ret)
    // {
    //    sort_0:  {label: 'xx', value: '1'},
    //    sort_1: {xxxxx}
    // }
}

<SortGroup onSortInfoUpdate={onSortInfoUpdate}>
    <SortLabel filterItem={[{label: '筛选', value: '1'}]}/>
    <SortList filterItem={
       [
          label: '条件1',
          vlaue: '1',
          isDefault: true
       ],
       [
          label: '条件2',
          value: '2'
       ]
    }/>
</SortGroup>

SelectableListHOC

  • desc

    给列表提供可选择的功能

  • params

参数说明类型默认值是否必要
config自定义选中项样式,可添加selectedClassName或selectedStyle,obj{selectedClassName: '', selectedStyle: {color: '#ff552e'}}可选
componentListnode必选
childrenListItemnode必选
value当前选中项,受控,需要在onSelectedChange中手动更新valuestring必选
initValue初始选中项string
onSelectedChange点击某项触发func必选
const SelectableList = SelectableListHOC({
      selectedClassName: 'active'
  })(List);

<SelectableList value='a' onSelectedChange={ (event, value, item) => {} }>
   <ListItem value="a" onClick={ () => {} } >
      <自定义内容/>
   </ListItem>
   <ListItem value="a" >
      <自定义内容/>
   </ListItem>
</SelectableList>

ActionSheet

  • desc

    功能操作弹层

  • params

参数说明类型默认值是否必要
showState状态,boolfalse必选
label操作说明node操作的说明或提示必选
tip其他文字说明node可选
onActionChange选中触发function() => {}必选
list操作列表1array[]必选
bottom操作列表2array[]必选
const handleActionChange = (item) => {
    // {label: 'xx', key: 'xxx'}
};

<ActionSheet
	showState={ true }
	list={ [
           			{
           				label: '确定',
           				key: 'ok',
           			},
           			{
           				label: '其他操作',
           				key: 'other',
           			}
           		]
           }
	bottom={ [{
             			label: '取消',
             			key: 'cancel'
             		}]
             }
	onActionChange={ handleActionChange }
	className="choose-type-modal"
/>

NotifyLabel props

  • desc

    通知标签,一版般用在列表右侧,默认20x20圆形图标

  • params

参数说明类型默认值是否必要
content内容element可选
style自定义样式obj可选
<NotifyLabel content={1} style={{color: 'red'}}/>

Carousel

  • desc

    跑马灯

  • params

参数说明类型默认值是否必要
width宽度number or string100%可选
height高度number200可选
slideIndex当前所处焦点number0可选
swipeSpeed切换命中比例number3可选
speed切换时间number300可选
easing动画曲线stringeaseOutCirc(https://github.com/chenglou/tween-functions)可选
autoplay是否自动播放boolfalse可选
autoplayInterval自动播放时间间隔number8000可选
arrow下方圆点booltrue可选
page页码boolfalse可选
beforeSlide滑动前函数fun() => {}可选
beforeSlide滑动后函数fun() => {}可选
<Carousel autoplay={true}>

	<div className="test-page1">1</div>
	<div className="test-page2">2</div>
	<div className="test-page3">3</div>
	<div className="test-page4">4</div>

</Carousel>

Slider

  • desc

    slider 横向滚动

  • params

参数说明类型默认值是否必要
childrennode可选
<Slider>

	<div style={{width: 200, height: 150, backgroundColor: '#cccccc'}}></div>
	<div style={{width: 200, height: 150, backgroundColor: 'pink'}}></div>
	<div style={{width: 200, height: 150, backgroundColor: '#8a2be2'}}></div>
	<div style={{width: 200, height: 150, backgroundColor: '#FF9912'}}></div>

</Slider>

Divider props

  • desc

    分割线,一般用于列表之间

  • params

参数说明类型默认值是否必要
inset是否有14px的左右paddingbooleanfalse可选
style自定义样式obj可选
<List>
    <ListItem />
    <Divider />
    <ListItem />
</List>

0.5.14

6 years ago

0.5.13

6 years ago

0.5.12

6 years ago

0.5.11

6 years ago

0.5.10

6 years ago

0.5.9

6 years ago

0.5.8

6 years ago

0.5.7

6 years ago

0.5.6

6 years ago

0.5.5

6 years ago

0.5.4

6 years ago

0.5.3

6 years ago

0.5.2

6 years ago

0.5.1

6 years ago

0.5.0

7 years ago

0.4.8

7 years ago

0.4.7

7 years ago

0.4.6

7 years ago

0.4.5

7 years ago

0.4.4

7 years ago

0.4.3

7 years ago

0.4.2

7 years ago

0.4.1

7 years ago

0.4.0

7 years ago

0.3.9

7 years ago

0.3.8

7 years ago

0.3.7

7 years ago

0.3.6

7 years ago

0.3.5

7 years ago

0.3.4

7 years ago

0.3.3

7 years ago

0.3.2

7 years ago

0.3.1

7 years ago

0.3.0

7 years ago

0.2.5

7 years ago

0.2.4

7 years ago

0.2.3

7 years ago

0.2.2

7 years ago

0.2.1

7 years ago

0.2.0

7 years ago

0.1.9

7 years ago

0.1.8

7 years ago

0.1.7

7 years ago

0.1.6

7 years ago

0.1.5

7 years ago

0.1.4

7 years ago

0.1.3

7 years ago

0.1.2

7 years ago

0.1.1

7 years ago