¿Cómo configurar la casilla de verificación predeterminada ReactJS?

168

Tengo problemas para actualizar el estado de la casilla de verificación después de asignarlo con el valor predeterminado checked="checked"en React.

var rCheck = React.createElement('input',
                                 {type: 'checkbox', checked:'checked', value: true},
                                 'Check here');

Después de asignar checked="checked", no puedo interactuar el estado de la casilla haciendo clic para desmarcar / marcar.

Yarin Nim
fuente
66
facebook.github.io/react/docs/forms.html Compruebe la diferencia entre componentes controlados y no controlados.
zerkms

Respuestas:

234

Para interactuar con el cuadro, debe actualizar el estado de la casilla de verificación una vez que lo cambie. Y para tener una configuración predeterminada que puede usar defaultChecked.

Un ejemplo:

<input type="checkbox" defaultChecked={this.state.chkbox} onChange={this.handleChangeChk} />
nitishagar
fuente
pero no creo la ENTRADA como clase, es creada por React.createElement. Entonces, cómo configurar el valor predeterminado
Yarin Nim
66
@YarinNim Puede usar rendercon el <input>elemento anterior . El defaultCheckedpuede proporcionarse como un parámetro como checkedes.
nitishagar
70

Hay algunas maneras de lograr esto, aquí hay algunas:

Escrito usando ganchos de estado :

function Checkbox() {
  const [checked, setChecked] = React.useState(true);

  return (
    <label>
      <input type="checkbox"
        checked={checked}
        onChange={() => setChecked(!checked)}
      />
      Check Me!
    </label>
  );
}

ReactDOM.render(
  <Checkbox />,
  document.getElementById('checkbox'),
);

Aquí hay una demostración en vivo en JSBin .

Escrito usando componentes :

class Checkbox extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      isChecked: true,
    };
  }
  toggleChange = () => {
    this.setState({
      isChecked: !this.state.isChecked,
    });
  }
  render() {
    return (
      <label>
        <input type="checkbox"
          checked={this.state.isChecked}
          onChange={this.toggleChange}
        />
        Check Me!
      </label>
    );
  }
}

ReactDOM.render(
  <Checkbox />,
  document.getElementById('checkbox'),
);

Aquí hay una demostración en vivo en JSBin .

Jon vio
fuente
3
¡Lleno de estado! ¿Qué tal acercamiento sin estado?
Verde
53

Si la casilla de verificación se crea solo con, React.createElemententonces defaultCheckedse usa la propiedad .

React.createElement('input',{type: 'checkbox', defaultChecked: false});

Crédito a @nash_ag

Yarin Nim
fuente
44
esto no es correcto, puede usar defaultChecked también con la etiqueta html normal, igual que (class => className) y (for => htmlFor) y así sucesivamente ...
Fareed Alnamrouti
31

En el ciclo de vida de representación de React, el atributo de valor en los elementos del formulario anulará el valor en el DOM. Con un componente no controlado, a menudo desea que React especifique el valor inicial, pero deja las actualizaciones posteriores sin control. Para manejar este caso, puede especificar un atributo defaultValue o defaultChecked en lugar de un valor.

        <input
          type="checkbox"
          defaultChecked={true}
        />

O

React.createElement('input',{type: 'checkbox', defaultChecked: true});

Consulte más detalles sobre la defaultCheckedcasilla de verificación a continuación: https://reactjs.org/docs/uncontrolled-components.html#default-values

Murtaza Hussain
fuente
1
Si usa el parámetro marcado directamente, no podrá desmarcarlo. para este parámetro defaultChecked tiene que ser utilizado. Gracias.
kodmanyagha
12

Además de la respuesta correcta, simplemente puede hacer: P

<input name="remember" type="checkbox" defaultChecked/>
Alnamrouti Fareed
fuente
1
Debería ser la respuesta aceptada, ya que esto es lo que la mayoría de la gente buscará: una alternativa al HTML nativo checked.
Bram Vanroy
4

Esta trabajando

<input type="checkbox" value={props.key} defaultChecked={props.checked} ref={props.key} onChange={this.checkboxHandler} />

Y la función init it

{this.viewCheckbox({ key: 'yourKey', text: 'yourText', checked: this.state.yourKey })}
user2061097
fuente
3

Puede pasar "verdadero" o "" a la propiedad marcada de la casilla de entrada. Las comillas vacías ("") se entenderán como falsas y el elemento estará desmarcado.

let checked = variable === value ? "true" : "";
<input
     className="form-check-input"
    type="checkbox"
    value={variable}
    id={variable}
    name={variable}
    checked={checked}
/>
<label className="form-check-label">{variable}</label>
ponteskl
fuente
marcado está en desuso
Mbanda
@Mbanda ¿Puede proporcionar documentación para proporcionar más información sobre esto
Brad
No deberías hacer esto. Si pasa una cadena a la propiedad "marcada", recibirá la advertencia: "Advertencia: recibió la cadena truepara el atributo booleano checked. Aunque esto funciona, no funcionará como se espera si pasa la cadena" falso ". ¿Quiso decir? marcado = {verdadero}? "
paul.ago
1

En mi caso, sentí que "defaultChecked" no funcionaba correctamente con estados / condiciones. Así que usé "marcado" con "onChange" para alternar el estado.

P.ej.

checked={this.state.enabled} onChange={this.setState({enabled : !this.state.enabled})}
Rishijay Shrivastava
fuente
0

Aquí hay un código que hice hace algún tiempo, podría ser útil. tienes que jugar con esta línea => this.state = {marcado: falso, marcado2: verdadero};

class Componente extends React.Component {
  constructor(props) {
    super(props);

    this.state = { checked: false, checked2: true};
    this.handleChange = this.handleChange.bind(this);
    this.handleChange2 = this.handleChange2.bind(this);

  }  

  handleChange() {
    this.setState({
        checked: !this.state.checked      
    })
  }

  handleChange2() {
    this.setState({
        checked2: !this.state.checked2      
    })
  }

  render() {
    const togglecheck1 = this.state.checked ? 'hidden-check1' : '';
    const togglecheck2 = this.state.checked2 ? 'hidden-check2' : '';

    return <div>
        <div>
        <label>Check 1</label>
        <input type="checkbox" id="chk1"className="chk11" checked={ this.state.checked } onChange={ this.handleChange } />
        <label>Check 2</label>
        <input type="checkbox" id="chk2" className="chk22" checked={ this.state.checked2 } onChange={ this.handleChange2 } />
      </div>

      <div className={ togglecheck1 }>show hide div with check 1</div>
      <div className={ togglecheck2 }>show hide div with check 2</div>

    </div>;
  }
}

ReactDOM.render(
  <Componente />,
  document.getElementById('container')
);

CSS

.hidden-check1 {
  display: none;  
  }

.hidden-check2 {
  visibility: hidden;
}

HTML

  <div id="container">
      <!-- This element's contents will be replaced with your component. -->
  </div>

Aquí está el codepen => http://codepen.io/parlop/pen/EKmaWM

Zurdo
fuente
Otro más ... ¡Este es un enfoque completo del estado! ¿Qué tal apátridas?
Verde
Verde, ¿qué quieres decir?
omarojo
0

No lo hagas demasiado difícil. Primero, comprenda un ejemplo simple dado a continuación. Te quedará claro. En este caso, justo después de presionar la casilla de verificación, tomaremos el valor del estado (inicialmente es falso), lo cambiaremos a otro valor (inicialmente es verdadero) y estableceremos el estado en consecuencia. Si se presiona la casilla de verificación por segunda vez, volverá a realizar el mismo proceso. Agarrando el valor (ahora es verdadero), cámbielo (a falso) y luego establezca el estado en consecuencia (ahora es falso nuevamente. El código se comparte a continuación.

Parte 1

state = {
  verified: false
} // The verified state is now false

Parte 2

verifiedChange = e => {
  // e.preventDefault(); It's not needed
  const { verified } = e.target;
  this.setState({
    verified: !this.state.verified // It will make the default state value(false) at Part 1 to true 
  });
}; 

Parte 3

  <form> 
      <input
          type="checkbox"
          name="verified"
          id="verified"
          onChange={this.verifiedChange} // Triggers the function in the Part 2
          value={this.state.verified}
      />
      <label for="verified">
      <small>Verified</small>
      </label>
  </form>
Md Fazlul Karim
fuente
0

esto se puede hacer con js puro

              <Form.Group controlId="categoryStatus">
                <Form.Check
                  type="checkbox"
                  label="Category Status Active/In-active"
                  onChange={this.handleChecked}                 
                />
              </Form.Group>
  //Load category to form : to edit
  GetCategoryById(id) {
    this.UpdateId = id
    axios.get('http://localhost:4000/Category/edit/' + id)
      .then(response => {
        this.setState({
          category_name: response.data.category_name,
          category_description: response.data.category_description,
          is_active: response.data.is_active,
        });

        response.data.is_active == 1 ? document.getElementById("categoryStatus").checked = true : document.getElementById("categoryStatus").checked = false;
      })
      .catch(function (error) {
        console.log(error);
      })
  }

Chamath Viranga
fuente
-2
 <div className="form-group">
          <div className="checkbox">
            <label><input type="checkbox" value="" onChange={this.handleInputChange.bind(this)}  />Flagged</label>
            <br />
            <label><input type="checkbox" value=""  />Un Flagged</label>
          </div>
        </div

handleInputChange (evento) {

console.log("event",event.target.checked)   }

el controlador anterior le da el valor de verdadero o falso al marcar o no

usuario2903536
fuente
-2

Establezco el estado como cualquier tipo []. y en el constructor establece el estado en nulo.

onServiceChange = (e) => {
    const {value} = e.target;
    const index = this.state.services.indexOf(value);
    const services = this.state.services.filter(item => item !== value);
    this.setState(prevState => ({
        services: index === -1 ? prevState.services.push(value) && prevState.services : this.state.services.filter(item => item !== value)
    }))
}

En el elemento de entrada

this.onServiceChange (e)} /> this.onServiceChange (e)} /> this.onServiceChange (e)} /> this.onServiceChange (e)} />

Lo descubrí después de un tiempo. Pensé que podría ayudarlos a todos :)

Sachin R
fuente