ReactJSチェックボックスのデフォルトを設定するにはどうすればよいですか?


168

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 2015

回答:


234

ボックスを操作するには、変更したチェックボックスの状態を更新する必要があります。また、デフォルト設定を使用するには、を使用できますdefaultChecked

例:

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

しかし、私はINPUTをクラスとして作成しません、それはReact.createElementによって作成されます。したがって、デフォルトを設定する方法
Yarin Nim

6
@YarinNim render上記の<input>要素で使用できます。defaultChecked同様のparamとして提供することができるcheckedされています。
nitishagar 2015

70

これを行うにはいくつかの方法があります。ここにいくつかあります:

ステートフックを使用して記述

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
これは正しくありません(class => className)や(for => htmlFor)と同じように、通常のhtmlタグでもdefaultCheckedを使用できます...
Fareed Alnamrouti '21

31

Reactレンダリングライフサイクルでは、フォーム要素のvalue属性がDOMの値をオーバーライドします。制御されていないコンポーネントでは、Reactで初期値を指定し、その後の更新は制御しないままにすることがよくあります。このケースを処理するために、値の代わりにdefaultValueまたはdefaultChecked属性を指定できます。

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

または

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

defaultChecked以下のチェックボックスに関する詳細をチェックアウトしてください:https : //reactjs.org/docs/uncontrol-components.html#default-values


1
チェックされたパラメータを直接使用する場合、チェックを外すことができません。このdefaultCheckedパラメータを使用する必要があります。ありがとう。
kodmanyagha

12

正しい答えに加えて、あなたはただ行うことができます:P

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

1
これは、ほとんどの人が探しているものであるため、受け入れられる答えになるはずcheckedです。ネイティブHTMLの代替です。
Bram Vanroy、2018

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

入力チェックボックスのcheckedプロパティに「true」または「」を渡すことができます。空の引用符( "")はfalseとして認識され、アイテムはチェックされません。

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。これは機能しますが、文字列「false」を渡した場合、期待どおりに機能しません。 checked = {true}?」
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>

これがcodepen => http://codepen.io/parlop/pen/EKmaWMです


さらに別の...これはステートフルアプローチです!ステートレスはどうですか?
Green

緑、どういう意味ですか?
omarojo 2018

0

難しくしすぎないでください。まず、以下の簡単な例を理解してください。それはあなたには明らかでしょう。この場合、チェックボックスを押した直後に、状態(最初はfalse)から値を取得し、他の値(最初はtrue)に変更して、それに応じて状態を設定します。チェックボックスを2回目に押すと、同じプロセスが再度実行されます。値(現在は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.