我覺得我已經做了這一百萬次,但可能沒有映射函數。我有我要創建的複選框活動集合的代碼如下(__map
從Lodash過來的方式):反應,爲什麼標籤不發射onChange複選框?
<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
處理程序是這樣的:
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 我玩弄,並決定replce onChange
與onClick
,現在我能點擊實際複選框打toggleActivity
。有沒有人有關於onChange爲什麼不開火的想法?
感謝您的漁獲物。出於某種原因,我仍然無法弄清楚點擊輸入會阻止我的標籤。 'toggleActivity'根本不會觸發。在函數頂部放置一個調試器不會執行任何操作。 –
在您的示例中,您沒有正確更新本地狀態,因此沒有爲您選中的新複選框https:// codesandbox。io/s/wqyolw50vl - 工作示例 –
我剛剛在我的文件中編輯了您的示例,刪除了所有其他代碼,但它仍然不適用於我。 **編輯**同樣在絕望的行爲中,我將您的解決方案完全複製到了我的解決方案中,仍然沒有觸發點擊。 –