javascript - 使用 styled-components : How to properly use class selectors? 的下拉菜单

标签 javascript html css reactjs

使用样式化组件,我想构建一个 React 组件,它将模仿 W3 Schools 中的以下代码:

ul {
  list-style-type: none;
  margin: 0;
  padding: 0;
  overflow: hidden;
  background-color: #333;
}

li {
  float: left;
}

li a, .dropbtn {
  display: inline-block;
  color: white;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
}

li a:hover, .dropdown:hover .dropbtn {
  background-color: red;
}

li.dropdown {
  display: inline-block;
}

.dropdown-content {
  display: 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 a {
  color: black;
  padding: 12px 16px;
  text-decoration: none;
  display: block;
  text-align: left;
}

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

.dropdown:hover .dropdown-content {
  display: block;
}
<body>

<ul>
  <li><a href="#home">Home</a></li>
  <li><a href="#news">News</a></li>
  <li class="dropdown">
    <a href="javascript:void(0)" class="dropbtn">Dropdown</a>
    <div class="dropdown-content">
      <a href="#">Link 1</a>
      <a href="#">Link 2</a>
      <a href="#">Link 3</a>
    </div>
  </li>
</ul>

<h3>Dropdown Menu inside a Navigation Bar</h3>
<p>Hover over the "Dropdown" link to see the dropdown menu.</p>

</body>
</html>

这是我的 React 组件:

import React, { Component } from "react";
import PropTypes from "prop-types";
import styled, { ThemeProvider } from "styled-components";


const StyledUl = styled.ul`
    list-style-type: none;
    margin: 0;
    overflow: hidden;
    background-color: #333;
    padding: 0px;
    background-color: lightblue;
    color: black;
    font-weight: bold;
`;

const StyledLi = styled.li`
    float: left;
    height: 100%;
    padding: 10px;
    &:hover {
        background-color: red;
    }
`;

const DropDownContent = styled.div`
    display: none;
    position: absolute;
    min-width: 160px;
    z-index: 1;
`;

const DropDownLi = styled(StyledLi)`
    display: inline-block;
    &:hover ${DropDownContent} {
        display: block;
    }
`;

const StyledA = styled.a`
    display: inline-block;
    text-align: center;
    text-decoration: none;
`;

const SubA = styled(StyledA)`
    text-decoration: none;
    display: block;
    text-align: left;
    background-color: lightblue;
    padding: 10px;
`;

class Menu extends Component {
    handleClick = action => {
        if (!action) return;

        if (this.props.onClick) this.props.onClick(action);
    };

    render = () => {
        return (
            <StyledUl>
                <StyledLi>
                    <StyledA onClick={() => this.handleClick("Home")}>
                        Home
                    </StyledA>
                </StyledLi>
                <StyledLi>
                    <StyledA onClick={() => this.handleClick("News")}>
                        Home
                    </StyledA>
                </StyledLi>
                <DropDownLi>
                    <StyledA onClick={() => this.handleClick("DropDown")}>
                        DropDown
                    </StyledA>
                    <DropDownContent>
                        {" "}
                        <SubA onClick={() => this.handleClick("Link1")}>
                            Link 1
                        </SubA>
                        <SubA onClick={() => this.handleClick("Link2")}>
                            Link 2
                        </SubA>
                        <SubA onClick={() => this.handleClick("Link3")}>
                            Link 3
                        </SubA>
                    </DropDownContent>
                </DropDownLi>
            </StyledUl>
        );
    };
}

export default Menu;

结果不一样,主要是因为我不确定如何在 styled-component 中使用选择器。

如何修复我的 ReactJs 组件 Menu 代码,使其表现得与 W3 示例完全一样?

最佳答案

您在翻译代码时犯了一些小错误,但语法和概念都是正确的。您对选择器的使用是正确的:

/* Hovering over current component */
&:hover {
  background-color: red;
}

/* Selecting another styled component                 */
/* calls DropDownContent.toString(), which returns    */
/* the class name of the styled component: .sc-bxivhb */
&:hover ${DropDownContent} {
  display: block;
}

这是更正后的版本:

import React, { Component } from "react";
import styled from "styled-components";

const StyledUl = styled.ul`
  list-style-type: none;
  margin: 0;
  padding: 0;
  overflow: hidden;
  background-color: #333;
`;

const StyledLi = styled.li`
  float: left;
`;

const Dropbtn = styled.div`
  display: inline-block;
  color: white;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
`;

const DropDownContent = styled.div`
  display: none;
  position: absolute;
  background-color: #f9f9f9;
  min-width: 160px;
  box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
  z-index: 1;
`;

const DropDownLi = styled(StyledLi)`
  display: inline-block;
  &:hover {
    background-color: red;
  }
  &:hover ${DropDownContent} {
    display: block;
  }
`;

const StyledA = styled.a`
  display: inline-block;
  color: white;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
  &:hover {
    background-color: red;
  }
`;

const SubA = styled.a`
  color: black;
  padding: 12px 16px;
  text-decoration: none;
  display: block;
  text-align: left;
  &:hover {
    background-color: #f1f1f1;
  }
`;

class Menu extends Component {
  handleClick = action => {
    if (!action) return;

    if (this.props.onClick) this.props.onClick(action);
  };

  render = () => {
    return (
      <StyledUl>
        <StyledLi>
          <StyledA onClick={() => this.handleClick("Home")}>Home</StyledA>
        </StyledLi>
        <StyledLi>
          <StyledA onClick={() => this.handleClick("News")}>Home</StyledA>
        </StyledLi>
        <DropDownLi>
          <Dropbtn onClick={() => this.handleClick("DropDown")}>
            DropDown
          </Dropbtn>
          <DropDownContent>
            {" "}
            <SubA onClick={() => this.handleClick("Link1")}>Link 1</SubA>
            <SubA onClick={() => this.handleClick("Link2")}>Link 2</SubA>
            <SubA onClick={() => this.handleClick("Link3")}>Link 3</SubA>
          </DropDownContent>
        </DropDownLi>
      </StyledUl>
    );
  };
}

export default Menu;

关于javascript - 使用 styled-components : How to properly use class selectors? 的下拉菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58963030/

相关文章:

javascript - $(...).DataTable(...).rows 不是函数

javascript - 如何避免在 native react 中首次渲染或如何仅渲染获取数据避免一次未定义?

javascript - 使用基于 html id 的 JavaScript 循环

javascript - 响应式网站不适用于平板电脑版本

javascript - 代码很少或不完整的文档工具

javascript - 滚动到每个div后如何重复ScrollTop函数重复?

javascript - 类博客的 Google Firestore 规则

javascript - 变量 |= 0; 是什么意思?做?

css - 为什么在 rails 中链接 css 中的图像时使用 ASSET_PATH 而不是 Image-url

css - 为 html5(或任何文档类型)添加文档类型会破坏我的网站