在平时的业务开发中,基于Antd基础组件的二次封装,可以使我们事半功倍,大大提升开发效率。今天分享一个简单的二次封装组件—AutoLoadingButton
件如其名,我们希望得到这样一个Button,当传给它的onClick返回一个Promise时,他能自动呈现loading状态直到resolve或reject发生。
话不多说,上代码:
import React from 'react';import { Button } from 'antd';import { ButtonProps } from 'antd/lib/button';class AutoLoadingButton extends React.Component<ButtonProps> {state = { loading: false }handleClick = async (e: React.MouseEvent<HTMLElement, MouseEvent>) => {const { onClick } = this.props;if (onClick) {try {this.setState({ loading: true });await onClick(e);} catch(e) {throw e;} finally {this.setState({ loading: false });}}}render() {return <Buttonloading={this.state.loading} // 放在{...props}前,当props传入loading是,可以被覆盖{...this.props}onClick={this.handleClick} // 放在{...props}后,保证不被覆盖/>}}/* 以下为测试用例 */function waitms(ms: number) {return new Promise(function(resolve) {setTimeout(resolve, ms);})}export default function() {return <div><AutoLoadingButton onClick={waitms.bind(undefined, 1000)}>auto loading</AutoLoadingButton></div>}
听说用React hooks写出来更优雅:
function AutoLoadingButton(props: ButtonProps) {const [loading, setLoading] = useState(false);async function handleClick(e: React.MouseEvent<HTMLElement, MouseEvent>) {const { onClick } = props;if (onClick) {try {setLoading(true)await onClick(e);} catch (e) {throw e;} finally {setLoading(false)}}}return <Button loading={loading} {...props} onClick={handleClick} />}
以上,就实现了一个简单的AutoLoadingButton。
如何在项目中用起来:
// import { Button } from 'antd';import Button from 'components/AutoLoadingButton'; // 直接替换Antd Button即可,完美兼容
