Como definir o padrão Marcado na caixa de seleção ReactJS?

168

Estou com problemas para atualizar o estado da caixa de seleção depois que ele é atribuído com o valor padrão checked="checked"em React.

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

Após a atribuição checked="checked", não consigo interagir com o estado da caixa de seleção clicando para desmarcar / marcar.

Yarin Nim
fonte
6
facebook.github.io/react/docs/forms.html Verifique a diferença entre componentes controlados e não controlados.
Zerkms

Respostas:

234

Para interagir com a caixa, você precisa atualizar o estado da caixa de seleção depois de alterá-la. E para ter uma configuração padrão, você pode usar defaultChecked.

Um exemplo:

<input type="checkbox" defaultChecked={this.state.chkbox} onChange={this.handleChangeChk} />
nitishagar
fonte
mas eu não crio o INPUT como classe, ele é criado por React.createElement. Então, como definir o padrão
Yarin Nim
6
@YarinNim Você pode usar rendercom o <input>elemento acima . O defaultCheckedpode ser fornecido como um parâmetro checked.
Nitishagar
70

Existem algumas maneiras de conseguir isso, eis algumas:

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'),
);

Aqui está uma demonstração ao vivo no 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'),
);

Aqui está uma demonstração ao vivo no JSBin .

Jon Saw
fonte
3
Estado cheio! E a abordagem apátrida?
Verde
53

Se a caixa de seleção for criada apenas com React.createElement, a propriedade defaultCheckedserá usada.

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

Crédito para @nash_ag

Yarin Nim
fonte
4
isso não está certo, você pode usar defaultChecked também com a tag html normal, igual a (class => className) e (for => htmlFor) e assim por diante ...
Fareed Alnamrouti
31

No ciclo de vida React rendering, o atributo value nos elementos do formulário substituirá o valor no DOM. Com um componente não controlado, você geralmente deseja que o React especifique o valor inicial, mas deixa as atualizações subseqüentes descontroladas. Para lidar com esse caso, você pode especificar um atributo defaultValue ou defaultChecked em vez de valor.

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

Ou

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

Confira mais detalhes sobre defaultCheckeda caixa de seleção abaixo: https://reactjs.org/docs/uncontrolled-components.html#default-values

Murtaza Hussain
fonte
1
se você usar o parâmetro verificado diretamente, não poderá desmarcá-lo. para esse parâmetro defaultChecked deve ser usado. obrigado.
kodmanyagha 6/01
12

Além da resposta correta, você pode simplesmente fazer: P

<input name="remember" type="checkbox" defaultChecked/>
Alnamrouti com tarifa
fonte
1
Deve ser a resposta aceita, pois é isso que a maioria das pessoas procurará: uma alternativa ao HTML nativo checked.
Bram Vanroy 6/08
4

Está funcionando

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

E a função init it

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

Você pode passar "true" ou "" para a propriedade marcada da caixa de seleção de entrada. As aspas vazias ("") serão entendidas como falsas e o item será 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
fonte
verificado está obsoleto
Mbanda
@Mbanda Você pode fornecer documentação para fornecer mais informações sobre isso?
Brad
Você não deve fazer isso. Se você passar uma sequência para a propriedade "marcada", receberá o aviso: "Aviso: recebeu a sequência truepara o atributo booleano checked. Embora isso funcione, ela não funcionará conforme o esperado se você passar a sequência" false ". verificado = {verdadeiro}? "
paul.ago 6/06/19
1

No meu caso, senti que "defaultChecked" não estava funcionando corretamente com estados / condições. Então, usei "marcado" com "onChange" para alternar o estado.

Por exemplo.

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

Aqui está um código que fiz há algum tempo, pode ser útil. você tem que brincar com esta linha => this.state = {marcada: falsa, verificada2: verdadeira};

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>

aqui está o codepen => http://codepen.io/parlop/pen/EKmaWM

Canhoto
fonte
Mais uma ... Esta é uma abordagem completa! E apátridas?
Verde
Verde, o que você quer dizer?
Omarojo 9/0918
0

Não dificulte demais. Primeiro, entenda um exemplo simples dado abaixo. Ficará claro para você. Nesse caso, logo após pressionar a caixa de seleção, pegaremos o valor do estado (inicialmente é falso), alteramos para outro valor (inicialmente é verdade) e definiremos o estado de acordo. Se a caixa de seleção for pressionada pela segunda vez, ele fará o mesmo processo novamente. Agarrando o valor (agora é verdadeiro), altere-o (para falso) e defina o estado de acordo (agora é falso novamente. O código é compartilhado abaixo.

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
fonte
0

isso pode ser feito com js puros

              <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
fonte
-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 (event) {

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

o identificador acima fornece o valor de verdadeiro ou falso após verificado ou não verificado

user2903536
fonte
-2

Defino o estado como qualquer tipo []. e no construtor, defina o estado como 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)
    }))
}

No elemento de entrada

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

Eu descobri isso depois de algum tempo. Pensei que poderia ajudar vocês :)

Sachin R
fonte