hooks组件封装 react_「React组件封装」「实例」文件选择按钮组件封装

文件选择器是我们经常会使用到的,一般都是通过点击某个按钮然后选取文件。

所以封装一个文件选择按钮还是有必要的。

首先,这个按钮使用起来必须和普通按钮一模一样,否则就失去了封装的意义。

其次也要基本符合我[基础]中讲到的几点。

于是(注意在chrome中使用image/*会很慢):(基础版本)

0dfe9408597da4514fef48f244635ccb.png
import React, { PureComponent } from 'react';import CSSModules from 'react-css-modules'; import Tools from '../../common_js/Tools' import styles from './FileButton.css' class FileButton extends PureComponent { constructor(props) { super(props);  this.getFiles = this.getFiles.bind(this) this.onChange = this.onChange.bind(this) }  getFiles() { let ans = [] let files = this.refs.fileLoader.files for (let i = 0; i < files.length; i++) { ans.push(files[i]) } return ans }  onChange(e) { if (!Tools.isNone(this.props.onChange)) { this.props.onChange(this.getFiles()) } this.refs.fileLoader.value = '' }  render() { let accept = this.props.accept if (Tools.isNone(accept)) { accept = 'image/*' if (Tools.isChrome()) { accept = 'image/jpeg,image/gif,image/png,image/bmp' } } return (  {this.props.children} { this.props.multiple == true ?  :  }  ); }} export default CSSModules(FileButton, styles);

input_area样式:

2c8036b5c5f09b165770a7fcbce367c7.png
.input-area { width: 0px; height: 0px; position:absolute; clip:rect(0 0 0 0);}

此外:(@material-ui中Button的封装版本)

592b0ec014ffb7c899b5e5bc75b6b59a.png
import React, { PureComponent } from 'react';import CSSModules from 'react-css-modules'; import Button from '@material-ui/core/Button';import Tools from '../../../common_js/Tools' import styles from './FileButton.css' class FileButton extends PureComponent { constructor(props) { super(props);  this.getFiles = this.getFiles.bind(this) this.onChange = this.onChange.bind(this) }  getFiles() { let ans = [] let files = this.refs.fileLoader.files for (let i = 0; i < files.length; i++) { ans.push(files[i]) } return ans }  onChange(e) { if (!Tools.isNone(this.props.onChange)) { this.props.onChange(this.getFiles()) } this.refs.fileLoader.value = '' }  render() { let {accept, onChange, children, multiple, ...other} = this.props if (Tools.isNone(accept)) { accept = 'image/*' if (Tools.isChrome()) { accept = 'image/jpeg,image/gif,image/png,image/bmp' } }  return (  { this.props.multiple == true ?  :  } {this.props.children}  ); }} export default CSSModules(FileButton, styles);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值