Reputation: 15
I'm new to react. I figured out how to make buttongroup act like multiselect, but I cannot figure out how to do that if at least one filter is selected, “All” would be unselected and if “All” is clicked, all filters are unselected, “All” then would be selected?
Here's what i currently have: https://jsbin.com/xiwuyemeva/edit?js,console,output
const Button = ReactBootstrap.Button;
const ButtonGroup = ReactBootstrap.ButtonGroup;
class Options extends React.Component {
constructor(props) {
super(props);
this.toggleOption = this.toggleOption.bind(this);
this.getBsStyle = this.getBsStyle.bind(this);
this.state = {
selected: {
A: false,
B: false,
C: false,
}
}
}
toggleOption(e) {
const key = e.target.value; // e.g. 'A'
const value = !this.state.selected[key];
const newSelected = Object.assign(this.state.selected, {[key]: value});
this.setState({ selected: newSelected });
console.log('this.state', this.state);
}
getBsStyle(key) {
return this.state.selected[key] ? 'primary' : 'default';
}
render() {
return (
<ButtonGroup>
<Button onClick={this.toggleOption} value='A' bsStyle={this.getBsStyle('A')}>
All
</Button>
<Button onClick={this.toggleOption} value='B' bsStyle={this.getBsStyle('B')}>
Option B
</Button>
<Button onClick={this.toggleOption} value='C' bsStyle={this.getBsStyle('C')}>
Option C
</Button>
</ButtonGroup>
);
}
}
ReactDOM.render(<Options />, document.getElementById('app'));
Any ideas or guidelines how i could handle those events would be really appreciated
Upvotes: 0
Views: 215
Reputation: 633
if I understood you, you wanted only one button style would be primary
. every other will be default
. then here is the normal solution i have provided.
const Button = ReactBootstrap.Button;
const ButtonGroup = ReactBootstrap.ButtonGroup;
class Options extends React.Component {
constructor(props) {
super(props);
this.toggleOption = this.toggleOption.bind(this);
this.state = {
selected: {
A:true,
B:false,
C:false,
}
}
}
toggleOption(e) {
const key = e.target.value;
let selected = JSON.parse(JSON.stringify(this.state.selected))
if (key == 'A' && !selected.A) {
selected.B = selected.C = false
}else if (key != 'A') {
selected.A = false
}
selected[key] = !selected[key]
this.setState({selected})
}
render() {
const {selected} = this.state
return (
<ButtonGroup>
<Button onClick={this.toggleOption} value='A' bsStyle={selected.A ? 'primary' : 'default'}>
All
</Button>
<Button onClick={this.toggleOption} value='B' bsStyle={selected.B ? 'primary' : 'default'}>
Option B
</Button>
<Button onClick={this.toggleOption} value='C' bsStyle={selected.C ? 'primary' : 'default'}>
Option C
</Button>
</ButtonGroup>
);
}
}
ReactDOM.render(<Options />, document.getElementById('app'));
Demo : https://jsbin.com/topuwocosa/edit?js,console,output
Upvotes: 1