Reactjs 为具有className的菜单元素动态设置一个类
如果我将菜单项标记为高亮显示,我会告诉我的渲染只填充类名(我使用的是类名btw) 有两个限制:Reactjs 为具有className的菜单元素动态设置一个类,reactjs,Reactjs,如果我将菜单项标记为高亮显示,我会告诉我的渲染只填充类名(我使用的是类名btw) 有两个限制: 一些菜单项是指向应用程序部分的href/nav链接,单击它们时必须应用我想要的样式,以支持整个组件的方式构造代码,以便能够检查其所在的地址,并决定菜单项是否应具有该样式,这也取决于此。(如支持用户通过手动导航(在地址栏中键入/项)而不是单击菜单项来“中断”应用程序) 有些菜单项展开有些不展开,单击链接菜单项或展开下拉列表是应用样式的两个有效原因,请记住,在其他位置导航时,展开的元素保持展开状态 因此
constructor(props) {
super(props);
this.state = {
selected: null;
};
this.setSelected = this.setSelected.bind(this);
}
setSelected(row) {
return () => {
this.setState({ selected: row });
}
}
render() {
var classes = classNames(this.props.className, {
// if(this.selected)
'selected': (this.props.selected === this.props.className),
});
return (
<div id="menu">
<div
onClick={this.setSelected(1)}
className={classNames(this.props.className, {
'selected': this.state.selected === 1,
})}
>
Dropdown 1
</div>
<div
onClick={this.setSelected(1)}
className={classNames(this.props.className, {
'selected': this.state.selected === 1,
})}
>
Menu item 2
</div>
<div
onClick={this.setSelected(1)}
className={classNames(this.props.className, {
'selected': this.state.selected === 1,
})}
>
Menu item 3
</div>
</div>
);
}
构造函数(道具){
超级(道具);
此.state={
选中:空;
};
this.setSelected=this.setSelected.bind(this);
}
已选定(世界其他地区){
return()=>{
this.setState({selected:row});
}
}
render(){
var classes=className(this.props.className{
//如果(选择此选项)
'selected':(this.props.selected==this.props.className),
});
返回(
下拉列表1
菜单项2
菜单项3
);
}
thta的问题是它没有考虑下拉行为(单击一次以再次选择以取消选择)
所以我在上面写下了我的观点:
constructor(props) {
super(props);
this.state = {
tttattta: '',
selected: null,
dropDownOne: false,
dropDownTwo: false,
};
this.setSelected = this.setSelected.bind(this);
}
setSelected(row) {
let tttattta = this.state.tttattta;
let drop1 = this.state.dropDownOne;
let drop2 = this.state.dropDownTwo;
if (row === 1) {
if (drop1) {
drop1 = false;
} else {
drop1 = true;
}
} else if (row === 3) {
if (drop2) {
drop2 = false;
} else {
drop2 = true;
}
} else {
tttattta = row;
}
return () => {
this.setState({ selected: tttattta,
dropDownOne: drop1,
dropDownOne: drop2,
});
};
}
render() {
var classes = classNames(this.props.className, {
// if(this.selected)
'selected': (this.props.selected === this.props.className),
});
return (
<div id="menu">
<div
onClick={this.setSelected(1)}
className={classNames(this.props.className, {
'selected': this.state.selected === 1,
})}
>
Dropdown 1
</div>
<div
onClick={this.setSelected(1)}
className={classNames(this.props.className, {
'selected': this.state.selected === 1,
})}
>
Menu item 2
</div>
<div
onClick={this.setSelected(1)}
className={classNames(this.props.className, {
'selected': this.state.selected === 1,
})}
>
Menu item 3
</div>
</div>
);
}
构造函数(道具){
超级(道具);
此.state={
tttattta:“”,
选中:空,
错,,
下拉列表二:错误,
};
this.setSelected=this.setSelected.bind(this);
}
已选定(世界其他地区){
设tttattta=this.state.tttatta;
让drop1=this.state.dropDownOne;
让drop2=this.state.dropDownTwo;
如果(行===1){
如果(drop1){
drop1=假;
}否则{
drop1=真;
}
}else if(行===3){
如果(下降2){
drop2=假;
}否则{
drop2=真;
}
}否则{
tttattta=行;
}
return()=>{
this.setState({selected:tttattta,
dropDownOne:drop1,
dropDownOne:drop2,
});
};
}
render(){
var classes=className(this.props.className{
//如果(选择此选项)
'selected':(this.props.selected==this.props.className),
});
返回(
下拉列表1
菜单项2
菜单项3
);
}
问题在于,您正在渲染函数中调用setSelected
:
<div className={classes} onClick={this.setSelcted(1)}> Menu item 1</div>
更新:
似乎您正在试图找到更好的方式来表示所选项目,这很好:)。我建议将所选项目的id存储在您的状态中,而不是存储一个布尔数组。然后,您的类将如下所示:
class MenuComponent extends Component {
constructor(props) {
super(props);
this.state = {
selected: null;
};
this.setSelected = this.setSelected.bind(this);
}
setSelected(row) {
return () => {
this.setState({ selected: row });
}
}
render() {
var classes = classNames(this.props.className, {
// if(this.selected)
'selected': (this.props.selected === this.props.className),
});
return (
<div id="menu">
<div
onClick={this.setSelcted(<REPLACE_WITH_ROW_NUM>)}
className={classNames(this.props.className, {
'selected': this.state.selected === <REPLACE_WITH_ROW_NUM>,
})}
>
Menu item 1
</div>
{ /* rest of your menu items here */ }
</div>
);
}
class MenuComponent扩展组件{
建造师(道具){
超级(道具);
此.state={
选中:空;
};
this.setSelected=this.setSelected.bind(this);
}
已选定(世界其他地区){
return()=>{
this.setState({selected:row});
}
}
render(){
var classes=className(this.props.className{
//如果(选择此选项)
'selected':(this.props.selected==this.props.className),
});
返回(
菜单项1
{/*此处的其他菜单项*/}
);
}
关于更新的答案:哇,更像是这样!不过我们完全是在灌输下拉列表和链接之间行为差异的概念。这种行为非常适合下拉列表(单击一次时选择,再次单击时取消选择)对于普通的菜单项来说就不那么重要了,它们需要单独拥有自己的“选择”特性(它们不能是几个突出显示的).有没有进一步的想法来区分这两个?也许我只是简单地创建了两个不同的方法和两个不同的类名?一个用于下拉列表,一个用于链接。没有,实际上我想它必须是同一个函数,但有一个额外的参数,以便我们保留“如果选择了下拉列表,则取消选择所有其他函数”功能。处理它。事实证明,为每个折页单独设置功能,再为普通菜单项添加一个与您类似的额外功能是最好的解决方案。我将您标记为解决方案!:)
class MenuComponent extends Component {
constructor(props) {
super(props);
this.state = {
selected: null;
};
this.setSelected = this.setSelected.bind(this);
}
setSelected(row) {
return () => {
this.setState({ selected: row });
}
}
render() {
var classes = classNames(this.props.className, {
// if(this.selected)
'selected': (this.props.selected === this.props.className),
});
return (
<div id="menu">
<div
onClick={this.setSelcted(<REPLACE_WITH_ROW_NUM>)}
className={classNames(this.props.className, {
'selected': this.state.selected === <REPLACE_WITH_ROW_NUM>,
})}
>
Menu item 1
</div>
{ /* rest of your menu items here */ }
</div>
);
}