기본값을 설정하는 방법 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로 만듭니다. 그래서, 기본값을 설정하는 방법
Yarin Nim

6
@YarinNim render위의 <input>요소 와 함께 사용할 수 있습니다 . 는 defaultChecked같은 PARAM로서 제공 될 수 checked있다.
nitishagar

71

이를 수행하는 몇 가지 방법이 있습니다. 몇 가지가 있습니다.

상태 후크를 사용하여 작성 :

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
이것은 당신이 (클래스 => className) 및 (for => htmlFor)와 같은 일반 html 태그와 함께 defaultChecked를 사용할 수있는 것과는 다릅니다 ...
Fareed Alnamrouti

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
checked 파라미터를 직접 사용하면 체크를 해제 할 수 없습니다. 이 defaultChecked 매개 변수를 사용해야합니다. 감사.
kodmanyagha

12

정답 외에도 다음과 같이 할 수 있습니다. : P

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

1
이것이 대부분의 사람들이 찾는 것이므로 허용되는 답이어야합니다 checked. 기본 HTML의 대안 .
Bram Vanroy '

4

작동합니다

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

그리고 그것을 초기화하십시오

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

3

"true"또는 ""를 입력 확인란의 checked 속성으로 전달할 수 있습니다. 빈 따옴표 ( "")는 거짓으로 이해되며 항목은 선택 해제됩니다.

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

@Mbanda 자세한 정보를 제공하기위한 문서를 제공 할 수 있습니까
Brad

이러면 안됩니다. 문자열을 "checked"속성에 전달하면 "경고 : true부울 속성에 대한 문자열 을 수신했습니다checked
paul.ago

1

제 경우에는 "defaultChecked"가 상태 / 조건에서 제대로 작동하지 않는다고 생각했습니다. 따라서 상태를 전환하기 위해 "onChange"와 함께 "checked"를 사용했습니다.

예 :

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

0

얼마 전에 내가 한 코드가 있습니다. 유용 할 수 있습니다. 이 줄을 가지고 놀아야합니다 => this.state = {checked : false, checked2 : true};

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

그린, 무슨 뜻이야?
omarojo

0

너무 어렵게 만들지 마십시오. 먼저 아래 주어진 간단한 예를 이해하십시오. 당신에게 분명합니다. 이 경우 확인란을 누른 직후 상태에서 값을 가져오고 (초기 거짓) 다른 값으로 변경하고 (초기에는 참) 상태를 적절하게 설정합니다. 이 확인란을 두 번 누르면 동일한 과정을 다시 수행합니다. 값을 가져 와서 (현재는 true), 값을 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);
      })
  }


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

위의 핸들은 확인되거나 확인되지 않은 경우 true 또는 false 값을 제공합니다


-2

상태를 any [] 유형으로 설정했습니다. 생성자에서 상태를 null로 설정합니다.

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

나는 얼마 후 그것을 알아 냈습니다. 그것은 당신에게 도움이 될 수 있다고 생각했습니다 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.