Как установить флажок по умолчанию в ReactJS?


169

У меня проблемы с обновлением состояния флажка после того, как ему присвоено значение checked="checked"по умолчанию в React.

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

После назначения checked="checked"я не могу взаимодействовать с состоянием флажка, щелкнув по нему, чтобы снять / проверить.


6
facebook.github.io/react/docs/forms.html Проверьте разницу между контролируемыми и неконтролируемыми компонентами.
zerkms

Ответы:


235

Для взаимодействия с полем вам необходимо обновить состояние флажка после его изменения. И для установки по умолчанию вы можете использовать defaultChecked.

Пример:

<input type="checkbox" defaultChecked={this.state.chkbox} onChange={this.handleChangeChk} />

но я не создаю INPUT как класс, он создается с помощью React.createElement. Итак, как установить значение по умолчанию
Ярин Ним

6
@YarinNim Вы можете использовать renderс вышеуказанным <input>элементом. defaultCheckedМожет быть представлена в виде парам как checkedIS.
нитишагар

71

Есть несколько способов сделать это, вот несколько:

Написано с использованием State Hooks :

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

Вот живое демо на JSBin .

Написано с использованием компонентов :

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

Вот живое демо на JSBin .


3
Государственно-полной! Как насчет подхода без гражданства?
Green

53

Если флажок создан только с помощью, React.createElementто используется свойство defaultChecked.

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

Кредит @nash_ag


4
это не правильно, вы можете использовать defaultChecked также с обычным тегом html, так же как (class => className) и (for => htmlFor) и так далее ...
Фарид Алнамрути

31

В жизненном цикле рендеринга React атрибут value в элементах формы переопределяет значение в DOM. В случае неконтролируемого компонента вы часто хотите, чтобы React указывал начальное значение, но оставлял последующие обновления неуправляемыми. Чтобы справиться с этим случаем, вы можете указать атрибут defaultValue или defaultChecked вместо значения.

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

Или

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

Пожалуйста, ознакомьтесь с более подробной информацией о defaultCheckedфлажке ниже: https://reactjs.org/docs/uncontrolled-components.html#default-values


1
если вы используете проверенный параметр напрямую, вы не сможете снять его. для этого параметра defaultChecked должен использоваться. Спасибо.
Кодманьяга

12

кроме правильного ответа можно просто сделать: P

<input name="remember" type="checkbox" defaultChecked/>

1
Должен быть принятый ответ, так как именно это будет искать большинство людей: альтернатива нативному HTML checked.
Брэм Ванрой

4

Это работает

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

И функция init это

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

3

Вы можете передать "true" или "" в свойство флажка ввода. Пустые кавычки ("") будут восприниматься как ложные, а пункт будет не отмечен.

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>

проверено, устарело
Мбанда

@Mbanda Можете ли вы предоставить документацию для получения дополнительной информации об этом
Брэд

Вы не должны этого делать. Если вы передадите строку в свойство «selected», вы получите предупреждение: «Warning: Получена строка trueдля логического атрибута checked. Хотя это работает, если вы передадите строку« false », она не будет работать так, как ожидалось». проверено = {} верно?»
paul.ago

1

В моем случае я чувствовал, что defaultChecked не работает должным образом с состояниями / условиями. Поэтому я использовал «флажок» с «onChange» для переключения состояния.

Например.

checked={this.state.enabled} onChange={this.setState({enabled : !this.state.enabled})}

0

Вот код, который я сделал некоторое время назад, это может быть полезно. вы должны играть с этой строкой => this.state = {проверено: ложь, проверено2: истина};

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>

вот кодекс => http://codepen.io/parlop/pen/EKmaWM


Еще один ... Это государственный подход! Как насчет лиц без гражданства?
Green

Зеленый, что ты имеешь в виду?
Омароджо

0

Не делай это слишком сложно. Сначала разберитесь с простым примером, приведенным ниже. Это будет ясно для вас. В этом случае, сразу после нажатия на флажок, мы возьмем значение из состояния (изначально это ложь), изменим его на другое значение (изначально это правда) и соответственно установим состояние. Если флажок будет нажат во второй раз, он будет делать то же самое снова. Захватив значение (теперь это правда), измените его (на false), а затем установите соответствующее состояние (теперь это снова false. Код представлен ниже.

Часть 1

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

Часть 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 
  });
}; 

Часть 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

это можно сделать с чистым JS

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


0

Я попытался сделать это с помощью компонента класса: вы можете просмотреть сообщение для того же

.....

class Checkbox extends React.Component{
constructor(props){
    super(props)
    this.state={
        checked:true
    }
    this.handleCheck=this.handleCheck.bind(this)
}

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

render(){
    var msg=" "
    if(this.state.checked){
        msg="checked!"
    }else{
        msg="not checked!"
    }
    return(
        <div>
            <input type="checkbox" 
            onChange={this.handleCheck}
            defaultChecked={this.state.checked}
            />
            <p>this box is {msg}</p>
        </div>
    )
}

}


-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 (событие) {

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

описанный выше дескриптор дает вам значение true или false при включенном или отключенном


-2

Я устанавливаю состояние как любой тип []. и в конструкторе установите состояние равным нулю.

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

В элементе ввода

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

Я понял это через некоторое время. Думаю, это может помочь вам всем :)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.