• Stars
    star
    415
  • Rank 104,301 (Top 3 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 9 years ago
  • Updated over 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

[DEPRECATED] A Radio-button like logic wrapper for React Native

react-native-radio-buttons

IMPORTANT this package is deprecated and no longer maintained in favor of the official SegmentedControlIOS component.

A react component to implement radio buttons-like behaviors: multiple options, only one option can be selected at a given time.

Both the container and option nodes are customizable. Comes with SegmentedControls clone, only more customizable (see below, animations to come).

example

Install

npm i -S react-native-radio-buttons

Demo app

git clone https://github.com/ArnaudRinquin/react-native-radio-buttons.git
cd react-native-radio-buttons
npm run demo

Usage

Here is an extensive overview of the component usage.

import { RadioButtons } from 'react-native-radio-buttons'

// ...

render() {
  const options = [
    "Option 1",
    "Option 2"
  ];

  function setSelectedOption(selectedOption){
    this.setState({
      selectedOption
    });
  }

  function renderOption(option, selected, onSelect, index){
    const style = selected ? { fontWeight: 'bold'} : {};

    return (
      <TouchableWithoutFeedback onPress={onSelect} key={index}>
        <Text style={style}>{option}</Text>
      </TouchableWithoutFeedback>
    );
  }

  function renderContainer(optionNodes){
    return <View>{optionNodes}</View>;
  }

  return (
    <View style={{margin: 20}}>
      <RadioButtons
        options={ options }
        onSelection={ setSelectedOption.bind(this) }
        selectedOption={this.state.selectedOption }
        renderOption={ renderOption }
        renderContainer={ renderContainer }
      />
      <Text>Selected option: {this.state.selectedOption || 'none'}</Text>
    </View>);
}

Will render this

Example

Props

  • options - [] mandatory array of anything, will be passed to renderOption
  • onSelection - function(selectedOption, selectedIndex){} option selection callback
  • selectedIndex - index the initially selected index, optional.
  • selectedOption - option the initially selected option, optional
  • renderOption - function(option, selected, onSelect, index) should return an option node, default generate <Text> nodes and adds {fontWeight:'bold'} to the selected option.
  • renderContainer - function(optionsNodes) must render the container, default is RadioButtons.renderVerticalContainer (see below)
  • optionStyle - optional styles to be applied to the <Text> elements of the options themselves.
  • optionContainerStyle - optional styles to be applied to the the <View> that contain the options.
  • testOptionEqual- function(selectedOption, currentOption){} optional compares and returns bool.

Full JavaScript SegmentedControls clone

This library comes with a clone of the native SegmentedControls, based on RadioButtons.

import { SegmentedControls } from 'react-native-radio-buttons'

// ...

<SegmentedControls
  options={ options }
  onSelection={ setSelectedOption.bind(this) }
  selectedOption={ this.state.selectedOption }
/>

You override all the defaults through the props.

<SegmentedControls
  tint={'#f80046'}
  selectedTint= {'white'}
  backTint= {'#1e2126'}
  options={ options }
  allowFontScaling={ false } // default: true
  onSelection={ setSelectedOption.bind(this) }
  selectedOption={ this.state.selectedOption }
  optionStyle={{fontFamily: 'AvenirNext-Medium'}}
  optionContainerStyle={{flex: 1}}
/>

Here is the list of the props you might override:

const IOS_BLUE = '#007AFF';
const IOS_WHITE = '#ffffff';

const DEFAULTS = {
  direction: 'row',

  tint: IOS_BLUE,
  backTint: IOS_WHITE,

  paddingTop: 5,
  paddingBottom: 5,
  textAlign: 'center',

  selectedTint: IOS_WHITE,
  selectedBackgroundColor: IOS_WHITE,

  separatorTint: IOS_BLUE,
  separatorWidth: 1,

  containerBorderTint: IOS_BLUE,
  containerBorderWidth: 1,
  containerBorderRadius: 5,

}

You can also specify containerStyle, optionContainerStyle, and optionStyle to use any style you want:

  • containerStyle - optional styles to be applied to the outermost <View> component.
  • optionStyle - optional styles to be applied to the <Text> elements of the options themselves.
  • optionContainerStyle - optional styles to be applied to the the <View> that contain the options.

You can also specify how to extract the labels from the options through the extractText prop.

options = [
  {
    label: 'Option 1',
    value: 'opt1'
  },
  {
    label: 'Option 2',
    value: 'opt2'
  }
]

<SegmentedControls
  options={ options }
  onSelection={ setSelectedOption.bind(this) }
  selectedOption={ this.state.selectedOption }
  extractText={ (option) => option.label }
/>

If you decide to declare options as an array of objects, do also include a testOptionEqual prop for customized equality checking, otherwise changing selectedOption programmatically would not update the UI correctly.

With the above options, you'll need testOptionEqual to be as follows in order for selectedOption to display correctly.

  <SegmentedControls
    options={ options }
    onSelection={ setSelectedOption.bind(this) }
    selectedOption={ this.state.selectedOption }
    extractText={ (option) => option.label }
    testOptionEqual={(selectedValue, option) => selectedValue === option.value}
  />

Moreover, you can even specify the whole renderOption() function:

<SegmentedControls
  // ...
  renderOption={(option, selected) => {
    return (
      // ...render stuff
    )
  }}
}}

Helpers

RadioButtons.renderVerticalContainer;

A super simple renderContainer function that generates a with {flexDirection: "column"}. It is used as default renderContainer if you don't specify it.

Usage:

<RadioButtons
  options={ options }
  onSelection={ setSelectedOption }
  renderContainer={RadioButtons.renderVerticalContainer}
/>

RadioButtons.renderHorizontalContainer;

Another super simple renderContainer function that generates a with {flexDirection: "row"}

Usage:

<RadioButtons
  options={ options }
  onSelection={ setSelectedOption }
  renderContainer={RadioButtons.renderHorizontalContainer}
/>

RadioButtons.getViewContainerRenderer(viewContainerStyle);

An helper that generates a simple <View> with the provided style.

Usage:

<RadioButtons
  options={ options }
  onSelection={ setSelectedOption }
  renderContainer={RadioButtons.getViewContainerRenderer({
    backgroundColor: '#f80046',
    flexDirection: 'row',
    justifyContent: 'space-around',
  })}
/>

RadioButtons.getTextOptionRenderer(normalStyle, selectedStyle, extractText);

An helper that generates <Text> options wrapped in <TouchableWithoutFeedback>. normalStyle and selectedStyle will be applied to the nodes, depending on state. extractText(options) can be specified.

Usage:

const normalStyle = {
  color: 'white'
};

const selectedStyle = {
  color: '#f80046',
  fontWeight: 'bold'
};

const extractText = (option) => option.label;

<RadioButtons
  options={ options }
  onSelection={ setSelectedOption }
  renderOptions={RadioButtons.getTextOptionRenderer(normalStyle, selectedStyle, extractText)}
/>

More Repositories

1

local_modules_poc

`local_modules` usage Proof of Concept
JavaScript
95
star
2

redux-reroute

Location reducer and routing helpers for redux.
JavaScript
81
star
3

atom-zentabs

Keep the opened tabs amount below sanity.
CoffeeScript
49
star
4

darkest-companion

A Darkest Dungeon curios and provisions helper
JavaScript
23
star
5

rm-local-modules

Removes your locally installed modules
JavaScript
21
star
6

make2tap

Leverage TAP to transform your ugly make outputs into nice readable ones using any TAP reporter
JavaScript
18
star
7

blog

My blog articles and drafts
16
star
8

fetch-decorators

A set of ES7 composable decorators around the fetch api
JavaScript
13
star
9

babel-plugin-discard-module-references

Babel plugin to discard all code using specified imported modules
JavaScript
12
star
10

express-plates

a (flatiron) Plates.js template engine adapter for Express.js
JavaScript
10
star
11

browser-tap

JavaScript
9
star
12

sass2scss

JavaScript
5
star
13

immutable-partition

A partitioning helper returning ImmutableJS structures
JavaScript
4
star
14

atom-language-gettext

Gettext files support for Atom
CoffeeScript
4
star
15

grunt-sass-to-scss

Grunt plugin to converts sass files to scss files
JavaScript
3
star
16

peristream

A wrapper around periscope.tv event streams, allowing you to easilly access them
JavaScript
3
star
17

wayzer

Yet another (AngularJS) weather app
JavaScript
2
star
18

adventofcode

My adventofcode.com solutions written in nodeJS
JavaScript
2
star
19

slack-bot

A slack bot seed
JavaScript
2
star
20

Chrono.js

High accuracy Javascript timer and chronometer library written in CoffeeScript
CoffeeScript
2
star
21

checkmate

Checkmate is a very simple data validator
JavaScript
1
star
22

resume

My resume as json, exportable to html and pdf
1
star
23

wallet

Very simple wallet app under AngularJS
CoffeeScript
1
star
24

node-red-contrib-interval

A simple node-red node that sends a message at regular intervals.
HTML
1
star
25

shuss

Super simple yet comprehensive static files server.
JavaScript
1
star