ReactJs中的导航ul标签绑定错误

时间:2018-09-17 16:29:38

标签: css reactjs

我是ReactJ的新手。我正在尝试制作一个电子商务网站并创建导航。但是我面临一个特定的问题。

enter image description here

从屏幕截图中可以看到,我的ul标签正在重复,这不应该是这种情况。

我正在分享下面实现的代码。

topNavigation.js

import React, { Component } from 'react';
import axios from 'axios';
import SubMenu from './subMenu';



class Navigation extends Component {

  state = {
    mainCategory: []
  }

  componentDidMount() {
    axios.get('http://localhost:3030/topCategory')
      .then(res => {
        console.log(res.data.express);
        this.setState({
          mainCategory: res.data.express.catalogGroupView
        })
      })
  }



  render() {

    const { mainCategory } = this.state;
    return mainCategory.map(navList => {
      return (

        <ul className="header">
          <li key={navList.uniqueID}>
            <a className="dropbtn ">{navList.name} </a>
            <ul className="dropdown-content">
              <SubMenu below={navList.catalogGroupView} />
            </ul>


          </li>
        </ul>

      )

    })

  }


}

export default Navigation;

subMenu.js

import React, { Component } from 'react';
import SubListMenu from './subListMenu';


class SubMenu extends Component {
    render() {
        const { below } = this.props;
        return below.map(sub => {

            return (

                <React.Fragment>

                    <li key={sub.uniqueID}>

                        <a>{sub.name}</a>

                        {
                            <ul className="sub-menu">
                                {sub.catalogGroupView !== undefined && <SubListMenu subBelow={sub.catalogGroupView} />}
                            </ul>


                        }

                    </li>

                </React.Fragment>

            )
        })

    }

}

export default SubMenu;

subListMenu.js

import React, { Component } from 'react';


class SubListMenu extends Component {

    render() {
        const { subBelow } = this.props;
        console.log(subBelow)
        return subBelow.map(subl => {

            return (


                <li key={subl.uniqueID}><a>{subl.name}</a></li>




            )
        })

    }

}

export default SubListMenu;

index.css

.header{
  display:inline-block;
  vertical-align: top;
  list-style-type: none;

}

.header .dropbtn {
  font-size: 16px;    
  border: none;
  color: #111;
  padding: 14px 16px;
  margin: 0;
  background: inherit;
}

.header:hover .dropbtn {
  background-color: #00b5cc;
}


.dropdown-content {
  list-style-type: none;
  margin: 0px;
  padding: 0px;
  display: none;
  list-style-type: none;
  position: absolute;
  background-color: #f9f9f9;
  min-width: 160px;
  box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
  z-index: 1;
}

.dropdown-content li a {
  color: black;
  padding: 12px 16px;
  text-decoration: none;
  display: block;
  text-align: left;
}

.dropdown-content li a:hover {
  background-color: #ddd;
}

.header:hover .dropdown-content {
  display: block;
}

.drop-button {
  font-size: 16px;    
  border: none;
  color: #111;
  padding: 14px 16px;
  margin: 0;
  background: inherit;
}

.sub-menu{
  list-style-type: none;
  display:none;
}

.dropdown-content:hover .submenu{
 background-color: red;
}
.dropdown-content li:hover .sub-menu { 

  display: block; 

}

img{ 
    width:100%;
  }

每当我在控制台窗口中看到我的代码时,ul标签就会重复。我不知道我在哪里弄错了。有人可以指导我。或深入了解如何继续解决该问题。

4 个答案:

答案 0 :(得分:0)

您正在返回地图中的<ul>个元素。

 return mainCategory.map(navList => {
      return (

        <ul className="header">
          <li key={navList.uniqueID}>
            <a className="dropbtn ">{navList.name} </a>
            <ul className="dropdown-content">
              <SubMenu below={navList.catalogGroupView} />
            </ul>


          </li>
        </ul>

      )

    })

  }

将地图包装在<ul>内,如下所示:

<ul className="header">
    {mainCategory.map(navList => 
        (
            <li key={navList.uniqueID}>
                <a className="dropbtn ">{navList.name} </a>
                <ul className="dropdown-content">
                    <SubMenu below={navList.catalogGroupView} />
                </ul>
            </li>
        )
    })}
    }
</ul>

答案 1 :(得分:0)

您的ul在mainCategory.map内部,因此将为每个映射的项目生成一个新的ul。

return <ul className="header"> {mainCategory.map(funtion)}</ul>将产生一ul

答案 2 :(得分:0)

因为您的ul位于map内部。您的渲染方法应如下所示:

render() {
  const { mainCategory } = this.state;
  return (
    <ul className="header">
      {
        mainCategory.map(navList => (
          <li key={navList.uniqueID}>
            <a className="dropbtn ">{navList.name} </a>
            <ul className="dropdown-content">
            <SubMenu below={navList.catalogGroupView} />
            </ul>
          </li>
        ))
      }
    </ul>
  )
}

答案 3 :(得分:0)

由于您在.map方法中包含了父列表标签<ul>,因此在每次迭代时都会创建新的<ul>结构。您需要做的就是将.map方法包装在<ul></ul>中。