Reactjs 为具有className的菜单元素动态设置一个类

Reactjs 为具有className的菜单元素动态设置一个类,reactjs,Reactjs,如果我将菜单项标记为高亮显示,我会告诉我的渲染只填充类名(我使用的是类名btw) 有两个限制: 一些菜单项是指向应用程序部分的href/nav链接,单击它们时必须应用我想要的样式,以支持整个组件的方式构造代码,以便能够检查其所在的地址,并决定菜单项是否应具有该样式,这也取决于此。(如支持用户通过手动导航(在地址栏中键入/项)而不是单击菜单项来“中断”应用程序) 有些菜单项展开有些不展开,单击链接菜单项或展开下拉列表是应用样式的两个有效原因,请记住,在其他位置导航时,展开的元素保持展开状态 因此

如果我将菜单项标记为高亮显示,我会告诉我的渲染只填充类名(我使用的是类名btw)

有两个限制:

  • 一些菜单项是指向应用程序部分的href/nav链接,单击它们时必须应用我想要的样式,以支持整个组件的方式构造代码,以便能够检查其所在的地址,并决定菜单项是否应具有该样式,这也取决于此。(如支持用户通过手动导航(在地址栏中键入/项)而不是单击菜单项来“中断”应用程序)

  • 有些菜单项展开有些不展开,单击链接菜单项或展开下拉列表是应用样式的两个有效原因,请记住,在其他位置导航时,展开的元素保持展开状态

  • 因此,这不仅仅是“如果你不是最后一个点击的项目,就失去风格”

    更新(2017年8月23日):

    我从@taylorc93得到了这个,这是向前迈出的一步:

    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>
        );
    }