¿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.


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} />

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 .


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


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


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/>

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 })}

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>

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})}

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


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>

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);
      })
  }


-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


-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 :)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.