react native 多选按钮
在做项目的时候有一个需求,是可以选择多个条件的,特地在Github上找了一些案例,发现没有什么合适的,于是自己根据这些案例,改装一下,封装了一个合适自己的。先看我封装的代码。
import React, {Component} from 'react';
import {
StyleSheet,
View,
Image,
Text,
TouchableHighlight,
} from 'react-native'
export default class CheckBox extends Component {
constructor(props) {
super(props);
this.state = {
isChecked: this.props.isChecked,
}
}
/**
* propTypes是React内部提供的校验器,如果通过props传过的数据与之不匹配,则会抛出异常。
*
*/
static propTypes = {
...View.propTypes,
leftText: React.PropTypes.string,
leftTextView: React.PropTypes.element,
rightText: React.PropTypes.string,
leftTextStyle: Text.propTypes.style,
rightTextView: React.PropTypes.element,
rightTextStyle: Text.propTypes.style,
checkedImage: React.PropTypes.element,
unCheckedImage: React.PropTypes.element,
onClick: React.PropTypes.func.isRequired,
isChecked: React.PropTypes.bool
}
/**
* 如果没有通过props传过来数据,则默认的是这样
* @type
*/
static defaultProps = {
isChecked: false,
leftTextStyle: {},
rightTextStyle: {}
}
/**
* 左边文字
*/
_renderLeft() {
if (this.props.leftTextView) {
return this.props.leftTextView;
}
if (!this.props.leftText) {
return null;
}
return (
<Text style={[styles.leftText, this.props.leftTextStyle]}>{this.props.leftText}</Text>
)
}
/**
* 右边的文字
* @returns {*}
* @private
*/
_renderRight() {
if (this.props.rightTextView) {
return this.props.rightTextView;
}
if (!this.props.rightText) {
return null;
}
return (
<Text style={[styles.rightText, this.props.rightTextStyle]}>{this.props.rightText}</Text>
)
}
/**
* 选中和为选中的图片按钮样式
* @returns {*}
* @private
*/
_renderImage() {
if (this.state.isChecked) {
return this.props.checkedImage ? this.props.checkedImage : this.genCheckedImage();
} else {
return this.props.unCheckedImage ? this.props.unCheckedImage : this.genCheckedImage();
}
}
genCheckedImage() {
var source = this.state.isChecked ? require('./img/ic_check_box.png') : require('./img/ic_check_box_outline_blank.png');
return (
<Image source={source}/>
)
}
onClick() {
this.setState({
isChecked: !this.state.isChecked
})
this.props.onClick();
}
render() {
return (
<TouchableHighlight
style={this.props.style}
onPress={()=>this.onClick()}
underlayColor='transparent'
>
<View style={styles.container}>
{this._renderLeft()}
{this._renderImage()}
{this._renderRight()}
</View>
</TouchableHighlight>
)
}
}
const styles = StyleSheet.create({
container: {
flexDirection: 'row',
alignItems: 'center'
},
leftText: {
flex: 1,
},
rightText: {
flex: 1,
marginLeft: 10
}
})
基本上这些需要的属性都是通过props来传递过来的。
用法也比较简单:
import React, {Component} from 'react';
import {
StyleSheet,
ScrollView,
View,
} from 'react-native'
import keys from './keys.json'
import Toast from 'react-native-easy-toast'
export default class example extends Component {
constructor(props) {
super(props);
this.state = {
dataArray: []
}
}
componentDidMount() {
this.loadData();
}
loadData() {
this.setState({
dataArray: keys
})
}
onClick(data) {
data.checked = !data.checked;
let msg=data.checked? 'you checked ':'you unchecked '
this.toast.show(msg+data.name);
}
renderView() {
if (!this.state.dataArray || this.state.dataArray.length === 0)return;
var len = this.state.dataArray.length;
var views = [];
for (var i = 0, l = len - 2; i < l; i += 2) {
views.push(
<View key={i}>
<View style={styles.item}>
{this.renderCheckBox(this.state.dataArray[i])}
{this.renderCheckBox(this.state.dataArray[i + 1])}
</View>
<View style={styles.line}/>
</View>
)
}
views.push(
<View key={len - 1}>
<View style={styles.item}>
{len % 2 === 0 ? this.renderCheckBox(this.state.dataArray[len - 2]) : null}
{this.renderCheckBox(this.state.dataArray[len - 1])}
</View>
</View>
)
return views;
}
renderCheckBox(data) {
var leftText = data.name;
return (
<CheckBox
style={{flex: 1, padding: 10}}
onClick={()=>this.onClick(data)}
isChecked={data.checked}
leftText={leftText}
/>);
}
render() {
return (
<View style={styles.container}>
<ScrollView>
{this.renderView()}
</ScrollView>
<Toast ref={e=>{this.toast=e}}/>
</View>
)
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#f3f2f2',
marginTop:30
},
item: {
flexDirection: 'row',
},
line: {
flex: 1,
height: 0.3,
backgroundColor: 'darkgray',
},
})
react native 多选按钮的更多相关文章
- [RN] React Native 获取验证码 按钮
React Native 获取验证码 按钮 效果如图: 实现方法: 一.获取验证码 按钮组件 封装 CountDownButton.js "use strict"; import ...
- react native 键盘遮挡按钮点击事件
在做项目的时候,我遇到一个很奇怪的问题,我先描述一下问题,在InputText输入内完成以后,点击按钮进行下一步的操作的时候,第一次点击的时候,按钮没有响应,第二次点击的时候才会响应.这样对用户体验有 ...
- react native 底部按钮切换
在react native 中底部按钮的切换 主要的是运用的是<TabBarNavigator/>这个组件,具体的代码实现如下: render() { return ( <T ...
- 如何用 React Native 创建一个iOS APP?(三)
前两部分,<如何用 React Native 创建一个iOS APP?>,<如何用 React Native 创建一个iOS APP (二)?>中,我们分别讲了用 React ...
- [RN] React Native 实现 多选标签
React Native 实现 多选标签 效果如下: 实现代码: import React, {Component} from 'react'; import {Button, StyleSheet, ...
- 史上最全Windows版本搭建安装React Native环境配置
史上最全Windows版本搭建安装React Native环境配置 配置过React Native 环境的都知道,在Windows React Native环境配置有很多坑要跳,为了帮助新手快速无误的 ...
- React Native:使用 JavaScript 构建原生应用
[转载] 本篇为联合翻译,译者:寸志,范洪春,kmokidd,姜天意 数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生 ...
- react native 入门实践
上周末开始接触react native,版本为0.37,边学边看写了个demo,语法使用es6/7和jsx.准备分享一下这个过程.之前没有native开发和react的使用经验,不对之处烦请指出.希望 ...
- React Native填坑之旅--Navigation篇
React Native的导航有两种,一种是iOS和Android通用的叫做Navigator,一种是支持iOS的叫做NavigatorIOS.我们这里只讨论通用的Navigator.会了Naviga ...
随机推荐
- XML文件(2)--使用DOM4J示例
其他依赖字段/方法 private List<Book> bookList = new LinkedList<Book>(); public List<Book> ...
- webSphere内存溢出
有一个做了很长时间的项目,是用websphere做生产环境的,可是一旦加载的项目过多,webSphere就很傲娇的内存溢出,这是一个折腾了公司里某个前辈很久很久的问题,因为是测试版,所以各种官方文档说 ...
- Oracle函数组的使用
--1.组函数--COUNT():用来统计记录的条数 如果没有记录,返回 0--COUNT函数可以根据一列或多列进行计算,没有排重功能--统计EMP表一共有多少条记录select count(empn ...
- [从产品角度学EXCEL 03]-单元格的秘密
这是<从产品角度学EXCEL>系列——单元格的秘密. 前言请看: 0 为什么要关注EXCEL的本质 1 EXCEL是怎样运作的 2 EXCEL里的树形结构 或者你可以去微信公众号@尾巴说数 ...
- 【IOS】自定义可点击的多文本跑马灯YFRollingLabel
需求 项目中需要用到跑马灯来仅展示一条消息,长度合适则不滚动,过长则循环滚动. 虽然不是我写的,但看了看代码,是在一个UIView里面放入两个UILabel, 在前一个快结束的时候,另一个显示.然而点 ...
- Spring4读书笔记(1)-模块
Srping主要模块 Core Container spring-core,spring-beans: 提供基础功能,包括IoC和DI等特性.对依赖起到解耦作用(BeanFactory). sprin ...
- mySQL 中主键值自动增加
转 http://stevenjohn.iteye.com/blog/976397 MySql 主键自动增长 博客分类: DataBase MySQLSQL 创建数据库,创建表. mysql> ...
- 关于JS事件的几点总结
1.理解事件(2点) 事件行为本身:没有给事件绑定方法事件也是一直存在的,当触发行为的时候,也对触发对应的行为,只不过由于没有绑定事件,导致没有任何事件发生: 事件绑定:给元素绑定一个方法:触发行为, ...
- JS学习:第一周——NO.3面向对象
[面向对象基础知识] 封装:对于功能相同的代码,我们只需封装一次,以后再遇到类似的功能,只需调用即可,无需重写,避免大量冗余代码. 对象的特征:方法和属性: 面向对象的特点: 封装:低耦合高内聚: 继 ...
- BZOJ 2079: [Poi2010]Guilds
Description 问一个图是否有二染色方案,满足每个点都跟他颜色不用的点有连边. Sol 结论题. 除了只有一个点,否则任何图都能被二染色. Code /******************** ...