我正在开发这个项目,我的要求是在运行时动态创建动态复选框。我从componentWillMount中的API获取数组中的值,数组如下所示:
[" Diesel"," SomeTeam"," demo"," lazyTeam"," demoTeam",& #34; X& G"," Kteam"]
我一直在试图解决这个问题,到目前为止,我一直在componentWillMount中创建动态状态,以便最初将所有复选框标记为False,并通过使用map函数解析数组来呈现复选框。
componentWillMount如下所示:
axios.get(`/teams/tlist`).then(response => {
let tempTeamArr = []
Object.keys(response.data.teams).map((key, index) => {
tempTeamArr.push(response.data.teams[key].name)
console.log(tempTeamArr)
if(index == Object.keys(response.data.teams).length-1) {
this.setState({
allTeams: tempTeamArr,
[`${response.data.teams[key].name}CheckedStat`]: false
}, () => {
console.log(`dynamic state: this.state[${response.data.teams[key].name}CheckedStat]`, this.state[`${response.data.teams[key].name}CheckedStat`])
})
}
})
})
我的复选框组件如下所示:
{allTeams.map((data, index) => {
return (
<Checkbox
label={data}
id={data}
checked={this.state[`${data}CheckedStat`]}
onChecked={bool => {this.setState({[`${data}CheckedStat`]: !this.state[`${data}CheckedStat`]})}}
/>
)})
复选框组件代码是:
const Checkbox = ({ label, id, onChecked, checked }) => (
<StyledCheckbox>
<input
className="checkbox"
type="checkbox"
id={id}
value={id}
onChange={e => onChecked(e.target.checked)}
checked={checked}
/>
<label htmlFor={id}>{label}</label>
</StyledCheckbox>
)
export { Checkbox }
我面临的问题是,这会呈现复选框,但检查取消选中非常不稳定且失控。我需要你的帮助真的很糟糕,如果你能帮我解决这个问题会非常好。这将有助于更多像我这样的人,如果这些琐碎的UI呈现问题仍然存在复杂的问题。
谢谢。
答案 0 :(得分:2)
从我的头顶,我想出了这个灵魂。丑陋,但想要工作。
你可以通过使用复选框组件等来简化它。希望你明白这一点。
对于简单的事情,只是填充像那样的数组
componentWillMount() {
var me = this,
teams = ["Diesel", "SomeTeam", "demo", "lazyTeam", "demoTeam", "X & G", "Kteam"],
setupCheckboxes = (function () {
return teams.map((el) => {
return {
teamName: el,
isChecked: false
}
});
})();
this.setState({
allTeamsCbData: setupCheckboxes
});
}
渲染
render() {
let teamsCbData = this.state.allTeamsCbData,
me = this;
return (
<div>
{teamsCbData.map((el, index) => {
return (
<div key={el.teamName}>
<input type="checkbox" name={el.teamName} checked={el.isChecked} onChange={
function () {
let curData = me.state.allTeamsCbData,
id = curData.findIndex(function(elem){ return elem.teamName == el.teamName});
curData[id].isChecked = !curData[id].isChecked;
me.setState({allTeamsCbData:curData})
}
} />
<label >{el.teamName}</label>
</div>
);
})}
</div>
);
};
顺便问一下你的意思是什么?
检查取消选中是非常不稳定的
答案 1 :(得分:2)
好的,我已经解决了。
问题就像:
<DropDownBox style={{ marginRight: '30px' }} className="DropDownBoxA" onClick={e=>this.toggleDropDownView}>
<DropdownView style={DropdownViewVisibleA ? { opacity: '1', zIndex: '1' } : { opacity: '0', zIndex: '-1' }} className="DropdownViewA">
... rest UL LI list code
</DropdownView>
</DropDownBox>
问题出现在this.toggleDropDownView中,当下拉视图可见并且我尝试检查下拉视图中的复选框时,首先在toggleDropDown函数中触发set,强制视图重新渲染,单击复选框的状态失败立即渲染。当我选中一个复选框时,关闭下拉菜单并再次打开它,我看到复选框已选中。
我通过重写上面的代码来纠正状态冲突问题,稍作改动:
<DropDownBox style={{ marginRight: '30px' }} className="DropDownBoxA" onClick={e=>this.setState({ DropdownViewVisibleA: !this.state.DropdownViewVisibleA, DropdownViewVisibleB: false })}>
<DropdownView style={DropdownViewVisibleA ? { opacity: '1', zIndex: '1' } : { opacity: '0', zIndex: '-1' }} className="DropdownViewA">
... rest UL LI list code
</DropdownView>
</DropDownBox>
希望这有助于其他人,并感谢大家帮助我解决这个问题。