변경 사항을 보내지 않는 반응 확인란


136

TLDR : 확인 된 jsbin 대신 defaultChecked를 사용하십시오 .

레이블 텍스트를 확인할 때 간단한 확인란을 설정하려고합니다. 어떤 이유로 든 구성 요소를 사용할 때 handleChange가 실행되지 않습니다. 아무도 내가 뭘 잘못하고 있는지 설명 할 수 있습니까?

var CrossoutCheckbox = React.createClass({
  getInitialState: function () {
    return {
        complete: (!!this.props.complete) || false
      };
  },
  handleChange: function(){
    console.log('handleChange', this.refs.complete.checked); // Never gets logged
    this.setState({
      complete: this.refs.complete.checked
    });
  },
  render: function(){
    var labelStyle={
      'text-decoration': this.state.complete?'line-through':''
    };
    return (
      <span>
        <label style={labelStyle}>
          <input
            type="checkbox"
            checked={this.state.complete}
            ref="complete"
            onChange={this.handleChange}
          />
          {this.props.text}
        </label>
      </span>
    );
  }
});

용법:

React.renderComponent(CrossoutCheckbox({text: "Text Text", complete: false}), mountNode);

해결책:

checked를 사용하면 기본 값이 변경되지 않으므로 onChange 핸들러를 호출하지 않습니다. defaultChecked로 전환하면 다음과 같이 수정됩니다.

var CrossoutCheckbox = React.createClass({
  getInitialState: function () {
    return {
        complete: (!!this.props.complete) || false
      };
  },
  handleChange: function(){
    this.setState({
      complete: !this.state.complete
    });
  },
  render: function(){
    var labelStyle={
      'text-decoration': this.state.complete?'line-through':''
    };
    return (
      <span>
        <label style={labelStyle}>
          <input
            type="checkbox"
            defaultChecked={this.state.complete}
            ref="complete"
            onChange={this.handleChange}
          />
          {this.props.text}
        </label>
      </span>
    );
  }
});

3
먼저, this.setState({checked: !this.state.checked})값을 저장하는 것보다 쉬운 onChange를 추가하지 마십시오 . 체크 attrubute에서 그런 다음 삼항 연산자 :checked={this.state.checked ? 'checked': null}
zackify

그렇게 시작되었지만 업데이트 된 것 같지 않았습니다. 그래서 나는 여기저기서 불을 피우기 시작했고 해고되지 않은 것을 디버깅했습니다. 이상적으로 간단한 형태로 돌아갈 때 완료 :)
jdarling

mountNode가 실제 dom 노드라고 가정하면을 사용해야 this.refs.complete.getDOMNode().checked합니다. fiddle 참조 jsfiddle.net/d10xyqu1
trekforever

jsfiddle.net/d10xyqu1/1 하지만 dom 노드를 가져 오는 대신 state를 사용할 수 있습니다. 잘 작동합니다. 잘못 입력 한 것이어야합니다.
zackify

2
TLDR 주석 무시-defaultChecked가 항상 정답은 아닙니다
Chris

답변:


207

체크 박스의 체크 상태를 얻으려면 경로는 다음과 같습니다.

this.refs.complete.state.checked

대안은 handleChange메소드 로 전달 된 이벤트에서 가져 오는 것입니다 .

event.target.checked

3
handleChange가 호출되지 않습니다. 확인란이나 레이블을 클릭해도 handleChange가 호출되지 않습니다 :(.
jdarling

13
입력에서 "checked"대신 defaultChecked = {this.state.complete}를 사용해보십시오.
zbyte

그게 다야 .. 영원히 찾고 둘러보고 다른 사람들 도이 문제를 해결할 경우 완전한 작업 답변으로 질문을 업데이트합니다.
jdarling

그러나 왜-같은 문제가 있지만 checked제어 된 구성 요소 에 사용해야 합니다 : /
Dominic

4
설정 checked은 상태가 구성 요소 외부에서 관리됨을 의미합니다. 사용자가 클릭하면 handleChange상태가 업데이트되지 않으므로 호출 할 것이 없습니다 . 대신 onClick상태 업데이트 를 수신 하고 트리거 해야합니다 .
zbyte

29

이러한 경우 심판을 사용하지 않는 것이 좋습니다. 사용하다:

<input
    type="checkbox"
    checked={this.state.active}
    onClick={this.handleClick}
/>

몇 가지 옵션이 있습니다.

checked vs defaultChecked

전자는 상태 변경 클릭 에 모두 응답 합니다. 후자는 상태 변화를 무시할 것이다.

onClick vs onChange

전자는 항상 클릭을 유발합니다. 후자는 checked속성이 input요소 에 있으면 클릭시 트리거되지 않습니다 .


10

시나리오에서는 입력 DOM에서 onChange 핸들러를 사용하지 않으려는 경우이 onClick특성을 대안으로 사용할 수 있습니다 . 는 defaultChecked, 조건은 V16의 IINM에 대한 고정 된 상태로 남아있을 수 있습니다.

 class CrossOutCheckbox extends Component {
      constructor(init){
          super(init);
          this.handleChange = this.handleChange.bind(this);
      }
      handleChange({target}){
          if (target.checked){
             target.removeAttribute('checked');
             target.parentNode.style.textDecoration = "";
          } else {
             target.setAttribute('checked', true);
             target.parentNode.style.textDecoration = "line-through";
          }
      }
      render(){
         return (
            <span>
              <label style={{textDecoration: this.props.complete?"line-through":""}}>
                 <input type="checkbox"
                        onClick={this.handleChange}
                        defaultChecked={this.props.complete}
                  />
              </label>
                {this.props.text}
            </span>
        )
    }
 }

나는 이것이 미래의 누군가를 돕기를 바랍니다.


10

handleChange다음과 같은 함수 가있는 경우 :

handleChange = (e) => {
  this.setState({
    [e.target.name]: e.target.value,
  });
}

onChange텍스트 입력처럼 작동하도록 사용자 정의 함수를 작성할 수 있습니다 .

<input
  type="checkbox"
  name="check"
  checked={this.state.check}
  onChange={(e) => {
    this.handleChange({
      target: {
        name: e.target.name,
        value: e.target.checked,
      },
    });
  }}
/>

하지 handleChangeinput있어야한다 this.handleChange?
Ardhi

5

누군가 범용 이벤트 핸들러를 찾고있는 경우 다음 코드를 어느 정도 사용할 수 있습니다 ( 모든 입력에 대해 name 특성이 설정되어 있다고 가정 ).

    this.handleInputChange = (e) => {
        item[e.target.name] = e.target.type === "checkbox" ? e.target.checked : e.target.value;
    }

2

defaultChecked를 사용할 때 onChange는 mobile에서 handleChange를 호출하지 않습니다. 대안으로 onClick 및 onTouchEnd를 사용할 수 있습니다.

<input onClick={this.handleChange} onTouchEnd={this.handleChange} type="checkbox" defaultChecked={!!this.state.complete} />;

1

소재 UI에서 확인란 상태는 다음과 같이 가져올 수 있습니다.

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