チェックボックスが true に切り替わるたびに配列を更新したいです。現在のコードでは、チェックボックスをクリックすると false とログに記録されます。状態を更新したばかりなのにです。setState は API 呼び出しのように時間がかかるのでしょうか? 私には意味がわかりません。
import React, {Component} from 'react';
class Person extends Component {
constructor(props) {
super(props);
this.state = {
boxIsChecked: false
};
this.checkboxToggle = this.checkboxToggle.bind(this);
}
checkboxToggle() {
// state is updated first
this.setState({ boxIsChecked: !this.state.boxIsChecked });
console.log("boxIsChecked: " + this.state.boxIsChecked);
if (this.state.boxIsChecked === false) {
console.log("box is false. should do nothing.");
}
else if (this.state.boxIsChecked === true) {
console.log("box is true. should be added.");
this.props.setForDelete(this.props.person._id);
}
}
render() {
return (
<div>
<input type="checkbox" name="person" checked={this.state.boxIsChecked} onClick={this.checkboxToggle} />
{this.props.person.name} ({this.props.person.age})
</div>
);
}
}
export default Person;
onClickの代わりにonChangeを試してみました。基本的なコンポーネントの定式化については、すでに読んだアドバイスに従っているように感じます。ここそしてここ他の値に Redux を使用しているという事実は何か影響しますか? チェックボックスを制御するのではなく、チェックボックスの内容を読み取る方法はありますか? (チェックボックス自体は正常に動作し、チェックされているかどうかに関係なく DOM が正しく更新されます。)
ベストアンサー1
このスレッドには回答があることは承知していますが、私もこれに対する解決策を持っています。チェックボックスが、setState の指定された値で更新されなかったことがわかります。この問題の正確な理由はわかりませんが、ここに解決策があります。
<input
key={Math.random()}
type="checkbox"
name="insurance"
defaultChecked={data.insurance}
/>
キー値に random を指定すると、チェックボックスが再レンダリングされ、チェックボックスの値が更新されます。これは私の場合はうまくいきました。また、フックを使用していますが、クラスベースの実装でも機能するはずです。
参照:https://www.reddit.com/r/reactjs/comments/8unyps/am_i_doing_stupid_or_is_this_a_bug_checkbox_not/