A simple and elegant checkbox tree for React Native. Implemented using react-native-vector-icons
npm install react-native-checkbox-tree --save
or
yarn add react-native-checkbox-tree
Now we need to install react-native-vector-icons.
npm install react-native-vector-icons --save
or
yarn add react-native-vector-icons
react-native-template-components A beautiful template for React Native.
Props | Params | isRequire | Description |
---|---|---|---|
data | Array | Yes | Data is a plain array |
textField | String | Yes | Extract the lable from the data item |
childField | String | Yes | Extract the field children from the data item |
onSelect | (item[])=> void | Yes | Selection callback |
style | ViewStyle | No | Styling for container view |
textStyle | TextStyle | No | Styling for text |
iconSize | Number | No | Customize icon size |
iconColor | String | No | Customize icon color |
autoSelectChilds | Boolean | No | Automatically select childs when selecting an item, default is true |
autoSelectParents | Boolean | No | Automatically select parent when all childs are selected, default is true |
openIcon | Element | No | Customize open icon. Only using react-native-vector-icons |
closeIcon | Element | No | Customize close icon. Only using react-native-vector-icons |
checkIcon | Element | No | Customize check icon. Only using react-native-vector-icons |
unCheckIcon | Element | No | Customize uncheck icon. Only using react-native-vector-icons |
renderItem | (item, isSelect, isOpen, onOpen, onClose, onSelect)=> Element | No | Takes an item from data and renders it into the list |
API | Description |
---|---|
clear | Refresh data |
setSelectedItem | The input value is the result returned from onSelect |
import React, { useEffect, useRef, useState } from 'react';
import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
import CheckboxTree from 'react-native-checkbox-tree';
import AntDesign from 'react-native-vector-icons/AntDesign';
import Ionicons from 'react-native-vector-icons/Ionicons';
const recursiveData = [
{
shopReportName: 'Name 1',
shopCode: '00001',
shopType: '2',
shopId: 1,
shopName: 'Name 1',
childs: [
{
shopReportName: 'Name 2',
shopCode: '00002',
shopType: '3',
shopId: 2,
shopName: 'Name 2',
childs: [
{
shopReportName: 'Name 3',
shopCode: '00003',
shopType: '4',
shopId: 3,
shopName: 'Name 3',
childs: [
{
shopReportName: 'Name 4',
shopCode: '00004',
shopType: '4',
shopId: 4,
shopName: 'Name 4',
},
{
shopReportName: 'Name 5',
shopCode: '00005',
shopType: '4',
shopId: 5,
shopName: 'Name 5',
childs: [
{
shopReportName: 'Name 6',
shopCode: '00006',
shopType: '4',
shopId: 7,
shopName: 'Name 6',
childs: [
{
shopReportName: 'Name 7',
shopCode: '00007',
shopType: '4',
shopId: 7,
shopName: 'Name 7',
},
],
},
],
},
{
shopReportName: 'Name 8',
shopCode: '00008',
shopType: '4',
shopId: 8,
shopName: 'Name 8',
},
],
},
],
},
],
},
];
export interface Props {}
const CheckboxTreeScreen: React.FC<Props> = _props => {
const [data] = useState<any[]>(recursiveData);
const ref: any = useRef();
useEffect(() => {
if (ref && ref.current) {
ref.current.setSelectedItem([
{
shopReportName: 'Name 1',
shopCode: '00001',
shopType: '2',
shopId: 1,
shopName: 'Name 1',
},
{
shopReportName: 'Name 2',
shopCode: '00002',
shopType: '3',
shopId: 2,
shopName: 'Name 2',
},
]);
}
}, [ref]);
return (
<View style={styles.container}>
<CheckboxTree
ref={ref}
data={data}
textField="shopName"
childField="childs"
textStyle={{ color: 'black' }}
iconColor="black"
iconSize={26}
openIcon={<AntDesign name="arrowdown" size={26} />}
closeIcon={<AntDesign name="arrowright" size={26} />}
renderItem={({ item, isSelect, isOpen, onOpen, onClose, onSelect }) => (
<View style={styles.wrapItem}>
{isOpen ? (
<TouchableOpacity onPress={onClose}>
<AntDesign size={30} name="arrowright" />
</TouchableOpacity>
) : (
<TouchableOpacity onPress={onOpen}>
<AntDesign size={30} name="arrowdown" />
</TouchableOpacity>
)}
<TouchableOpacity onPress={onSelect}>
<Ionicons
size={26}
name={isSelect ? 'checkbox-outline' : 'square-outline'}
/>
</TouchableOpacity>
<Text style={styles.name}>{item.shopName}</Text>
</View>
)}
onSelect={item => {
console.log(`Selected ${item.length} item`);
}}
/>
</View>
);
};
export default CheckboxTreeScreen;
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 20,
},
wrapItem: {
flexDirection: 'row',
alignItems: 'center',
marginVertical: 8,
},
icon: {
marginHorizontal: 8,
},
name: {
fontSize: 20,
marginLeft: 8,
},
});
import React from 'react';
import { StyleSheet, View } from 'react-native';
import CheckboxTree from 'react-native-checkbox-tree';
import AntDesign from 'react-native-vector-icons/AntDesign';
const recursiveData = [
{
shopReportName: 'Name 1',
shopCode: '00001',
shopType: '2',
shopId: 1,
shopName: 'Name 1',
childs: [
{
shopReportName: 'Name 2',
shopCode: '00002',
shopType: '3',
shopId: 2,
shopName: 'Name 2',
childs: [
{
shopReportName: 'Name 3',
shopCode: '00003',
shopType: '4',
shopId: 3,
shopName: 'Name 3',
childs: [
{
shopReportName: 'Name 4',
shopCode: '00004',
shopType: '4',
shopId: 4,
shopName: 'Name 4',
},
{
shopReportName: 'Name 5',
shopCode: '00005',
shopType: '4',
shopId: 5,
shopName: 'Name 5',
childs: [
{
shopReportName: 'Name 6',
shopCode: '00006',
shopType: '4',
shopId: 7,
shopName: 'Name 6',
childs: [
{
shopReportName: 'Name 7',
shopCode: '00007',
shopType: '4',
shopId: 7,
shopName: 'Name 7',
},
],
},
],
},
{
shopReportName: 'Name 8',
shopCode: '00008',
shopType: '4',
shopId: 8,
shopName: 'Name 8',
},
],
},
],
},
],
},
];
const CheckboxTreenScreen = _props => {
return (
<View style={styles.container}>
<CheckboxTree
data={recursiveData}
textField="shopName"
childField="childs"
textStyle={{ color: 'black' }}
iconColor="black"
iconSize={26}
openIcon={<AntDesign name="arrowdown" size={26} />}
closeIcon={<AntDesign name="arrowright" size={26} />}
checkIcon={<View />}
unCheckIcon={<View />}
renderItem={item => (
<View style={styles.wrapItem}>
<AntDesign
style={styles.iconItem}
name="folderopen"
size={20}
/>
<Text style={styles.text}>{item.shopName}</Text>
</View>
)}
onSelect={item => {
console.log(`Selected ${item.length} item`);
}}
/>
</View>
);
};
export default CheckboxTreenScreen;
const styles = StyleSheet.create({
container: {
flex: 1,
paddingVertical: 40,
},
wrapItem: {
flexDirection: 'row',
marginVertical: 8
},
text: {
fontSize: 18
},
iconItem:{
marginHorizontal: 8
}
});