I am new in react, I have certain domain in JS, I imagine this is a simple question but I have been searching for 2 hours and I haven't found a satisfactory answer :(
I have the check boxes:
<Col md="4">
<FormGroup>
<Label>Have Children</Label>
<CustomInput type="radio" name="customRadio" label="Yes" value="yes" />
<CustomInput type="radio" name="customRadio" label="No" value="no" />
</FormGroup>
</Col>
<Col md="4">
<FormGroup>
<Label>Have Spouse</Label>
...(same as children input)
</FormGroup>
</Col>
<Col md="4">
<FormGroup>
<Label>Have Family Members</Label>
...(same as children input)
</FormGroup>
</Col>
If you click on "have children"
I want that some divs after, related to children, to be displayed. If not, they should be hidden. And the same for the other options.
I want to know what is the cleanest way to do this.
The checkbox should toggle a boolean in state.
You then conditionally render the children if the value in state is true.
So attach a checked value and change handler to your groups:
<FormGroup>
<Label>Have Children</Label>
<CustomInput type="radio" name="customRadio" label="Yes" value="yes" onChange={() => this.handleChange} checked={this.state.visibility} />
<CustomInput type="radio" name="customRadio" label="No" value="no" onChange={() => this.handleChange} checked={!this.state.visibility}/>
</FormGroup>
The create the state value in your class and toggle it with the handleChange method
state = {visibility: false}
handleChange = () => this.setState({visibility: !this.state.visibility})
Then you can conditionally render your thing based on the visibility boolean, so...
<div>{this.state.visibility && <p>Now You see me</p>}</div>
Just think of the data structure beforehand.
From your question, I assume you simply want something like this:
If children checkbox is checked, show elements related to children
If spouse checkbox is checked, show elements related to spouse.
etc.
The way I see it, you need an array of checkboxes with each of their statuses (checked or not). You can store this information in the component state.
// in the constructor
this.state = {
checkboxes: [
{ id: 1, label: 'children', checked: false },
{ id: 2, label: 'spouse', checked: false },
],
}
Then, in your render() function, you just need to loop through the array like this:
const { checkboxes } = this.state;
return (
<div>
{checkboxes.map((checkbox, index) => (
<div>
<label>{checkbox.label}</label>
<input type="checkbox" checked={checkbox.checked} onClick={() => this.toggleCheckBox(index)} />
{checkbox.checked && <div>show this if the checkbox is checked</div>}
</div>
))}
</div>
);
Just remember to implement this.toggleCheckBox method in the class. If you are unsure of how to do it, here's a codesandbox for you to check out.
Related
I would like to only be able to select a single checkbox and not all or more than one. I would like to use checkbox instead of radio because I can disable it without having to mark another radio
<C.SingleCard>
<h2>Pizza</h2>
<div>
<hr />
<h3>Flavors</h3>
<hr />
</div>
<div>
<h4>Pepperoni</h4>
<input type="checkbox" name='flavor' />
</div>
<div>
<h4>Chicken</h4>
<input type="checkbox" name='flavor' />
</div>
<div>
<h4>Bacon</h4>
<input type="checkbox" name='flavor' />
</div>
<div>
<button>Add</button>
</div>
</C.SingleCard>
Here's the simplest way I can think of:
Put the options in an array and just keep track of the selected index. Set the index to null if the user selected the same index. Use the index parameter of map to set checked=true on the selected box. The onChange callback will trigger when the user selects one of the boxes, you can ignore the event parameter and just pass the index of the box.
const options = ['pepperoni', 'chicken', 'bacon'];
export default function App() {
const [selected, setSelected] = useState(null);
function onChange(i) {
setSelected((prev) => (i === prev ? null : i));
}
function whatDidIPick() {
console.log(options[selected] || 'nothing');
}
return (
<div>
{options.map((o, i) => (
<label key={i}>
{o}
<input
type="checkbox"
checked={i === selected}
onChange={() => onChange(i)}
/>
</label>
))}
<br />
<button onClick={whatDidIPick}>Log what I picked</button>
</div>
);
}
https://stackblitz.com/edit/react-ts-1uwfcq?file=App.tsx
The code below does hides/shows if in the conditional rendering is only one element either label or text input but it doesn't work if I want to hide both elements. I need solution which will hide at least 2 or more elements.
{trueMode === false && (<label htmlFor="car">Car</label> &&
<input onChange={handleChange} id="car"
value={newVehicle.car} type="text" />)}
You have to wrap the elements with a fragment for example
{trueMode === false && (
<>
<label htmlFor="car">Car</label>
<input onChange={handleChange} id="car" value={newVehicle.car} type="text" />
</>
)}
Okay, so in my code, I have these two radio inputs, one with a fixed value, one with an input-field to take the dynamic value.
Now what I wanted to do is, when the user enters value in the input field, the corresponding radio button will get selected automatically, and the values will get updated as well. and if the user selects the default value, the state will get updated with the default value.
My code looks like this..
<ul className='list-unstyled mb-0 d-flex flex-column flex-lg-row justify-content-around'>
<li className='mr-4'>
<input
defaultChecked
onChange={() => updateState('timeLimit',defaultTime)}
type="radio"
value={defaultTime}
name='time'
className='mr-2'
id="defaultTime"/>
<label htmlFor="defaultTime"> {defaultTime} Mins. (default)</label>
</li>
<li>
<input
onChange={(e) => updateState('timeLimit',e.target.value)}
type="radio"
name='time'
value={customTime}
ref={customTimeRef}
className='mr-2'
id="customTime"/>
<label htmlFor="customTime">
<input
onChange={(e) => updateCustomTime(e.target.value)}
style={{outline:'none', border:'none',width:'9rem'}}
placeholder='Enter Your Time'
min='0'
className='border-bottom border-info pl-2 pb-1'
type="number"/> Mins. (custom)
</label>
</li>
</ul>
The functions are defined as
const updateCustomTime = (val) => {
if(customTimeRef.current.checked){
setCustomTime(val)
updateState('timeLiimit',val)
}
else{
customTimeRef.current.checked=true
setCustomTime(val)
updateState('timeLiimit',val)
}
}
Now the issue is, when I type into my input field, the updateState function is fired, the radio gets checked, but if I click on the radio buttons afterwards, they aren't firing the onchange events associated.
What's wrong here ? And how to achieve the desired result ??
Check this component
use a boolean state to set the checked property
const App = () => {
const [useDefault, setUseDefault] = React.useState(true)
return (
<div>
<div>
<input type="radio" name="time" checked={useDefault} onClick={() => setUseDefault(true)} />
</div>
<div>
<input type="radio" name="time" checked={!useDefault} />
<input type="text" onKeyUp={() => setUseDefault(false)} />
</div>
</div>
)
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
I have a checkbox filters. The problem is that I need to display all checked checkbox label (e.g. if clicked Vimeo there should be a <h1> with Vimeo filter applied).
const checkboxTarget = ['Dailymotion', 'Vimeo', 'VK']
{checkboxTarget.map((text, index) => (
<div>
<input type="checkbox" id="flexCheckIndeterminate" />
<label style={{ marginLeft: '5px' }} class="form-check-label" for="flexCheckIndeterminate">
{text}
</label>
</div>
))}
In a functional component,
const[selectedCheckbox, setSelectedCheckbox] = useState("");
And then, add an OnClick Listener to the checkbox. Don't forget to check if the checkbox is checked. I would write a function to update SelectedCheckbox if multiple selection is a possibility.
<input type="checkbox" value={text} id="flexCheckIndeterminate" onClick={(e) => {if(e.target.checked){setSelectedCheckbox(e.target.value)} }} />
I found many checkbox related questions but not was related like mine. Please check and help.
I have 10+ checkboxs which are dynamically creating as per the API data (looping list).
Here I want to know onClick whether the checkbox is unchecked or checked (accordingly i'll call different API).
To know/tack the checked or unchecked, i tried using the state. But the problem is while i'm checking/ unchecking all checkboxs are affecting with same.
Please help me handle that individually.
My code as follows:
this.state = {
isChecked: true,
};
handleClick = (e) => {
console.log("clicked", e.fieldId);
this.setState((prevState) => ({
isChecked: !prevState.isChecked,
}));
if(this.state.isChecked){
// update to API 1
}else{
// update to API 2
}
};
<input
type="checkbox"
checked={this.state.isChecked}
onClick={() => this.handleClick(subitems)}
name="check"
/>
<label className="form-check-label cost-blue">
{subitems.message}
</label>
Note: some checkboxs are already checked as per API list data. But by using the state, i unable to handle that also
Edit: This how i'm looping from API
Object.keys(dataMap).map((value, key) => {
return (
<div className="mt-10">
<div className="row text-center m-0 p-box white">
<div>
<img src={plant_icon} alt="plant" />
<span className="mb-0"> {value}</span>
</div>
</div>
{dataMap[value].map((subitems) => {
return (
<div className="form-check custom-cb m-10">
<input
className="form-check-input mt-7"
type="checkbox"
checked={this.state.isChecked}
onClick={() => this.handleClick(subitems)}
name="check"
/>
<label className="form-check-label cost-blue">
{subitems.message}
</label>
</div>
);
})}
</div>
);
})