私はこれを何百万回もやったような気がしますが、おそらくマッピング機能ではないでしょう。React、なぜラベルは発射しないのですか?チェックボックスを変更しますか?
:<div className="activity-blocks">
{
__map(this.state.activities, (activity, i) => {
return (
<div key={ i } className="single-activity">
<input id={ `register-activity-${ i }` }
type="checkbox" className="register-multiselect"
name="main_activity" checked={ !!activity.checked }
onChange={ (e) => this.toggleActivity(e, activity.id) }
/>
<label htmlFor={ `register-activity-${ i }` }>{ activity.name }</label>
</div>
)
})
}
は
私onChange
ハンドラは次のようになります。コードは次のようであると私は(__map
は途中でLodashから来ている)私は、チェックボックスを作成しています活動のコレクションを持っています
toggleActivity(e, activityId) {
let activities = { ...this.state.activities };
__forEach(this.state.activities, (activity) => {
if (activityId === activity.id) {
activity = __assign(activity, { checked: e.target.checked });
return false;
}
});
this.setState({ activities: activities });
}
ハンドラはうまく動作しますが、主に参照用です。私の問題は、ラベルがハンドラを起動していないということです。私は、ラベルのないチェックボックス入力だけをテストして、ハンドラを起動します。誰かがラベルがそうしていない理由を知っていますか?
詳細情報:私は以前にこの問題を抱えていましたが、通常はidの不一致やそのような単純なことが判明しています。今回はそう信じられない。
編集 私は私のファイルから、ほとんどすべてのコードを削除し、以下のSlawaの答えを組み込み、予想通り、それはまだ動作しませんしています。
import React from 'react';
import __forEach from 'lodash/forEach';
import __assign from 'lodash/assign';
import __map from 'lodash/map';
export default class RegisterActivities extends React.Component {
constructor(props) {
super(props);
this.state = {
activities: [
{
id: 1,
name: 'label-1'
},
{
id: 2,
name: 'label-2'
},
{
id: 3,
name: 'label-3'
}
],
}
}
toggleActivity(e, activityId) {
const { activities } = this.state;
const updated = activities.map((activity) => {
if (activity.id === activityId){
return {
...activity,
checked: e.target.checked
}
}
return activity;
});
}
render() {
return (
<div>
<p>what do you do?</p>
<div>
{
__map(this.state.activities, (activity, i) => {
return (
<div key={ i }>
<input id={ `register-activity-${ i }` }
type="checkbox"
name="main_activity" checked={ !!activity.checked }
onChange={ (e) => this.toggleActivity(e, activity.id) }
/>
<label htmlFor={ `register-activity-${ i }` }>{ activity.name }</label>
</div>
)
})
}
</div>
</div>
);
}
}
EDIT2 私が遊んとonClick
でonChange
をreplceすることを決定し、今私ができるよよ:ここでは、すべての輸入品を含むコード、クラス構造やスタイルを含め取り除かすべての不要なコードは、あります実際のチェックボックスをクリックしてtoggleActivity
をクリックします。 onChangeが発砲していない理由を知っている人はいますか?
おかげで私は動作しませんでした
コードを更新/リンクを後で編集します。なんらかの理由で、私のラベルが入力をクリックするのを妨げているものがまだ分かりません。 'toggleActivity'はまったく起動しません。デバッガを関数の先頭に置いても何もしません。 –
の例では、ローカル状態を正しく更新しないため、チェックボックスの新しいチェック値https:// codesandboxはありません。io/s/wqyolw50vl - 作業例 –
ファイル内であなたのサンプルを編集して、他のコードをすべて削除しましたが、それでもまだ動作しません。 **編集**また、絶望的な行為で、Appクラス内のソリューションを私のソリューションに完全にコピーしましたが、まだクリックは発生しません。 –