样式化的组件 选定的导航项

Posted

技术标签:

【中文标题】样式化的组件 选定的导航项【英文标题】:Styled Components Selected Nav Item 【发布时间】:2019-07-08 00:47:51 【问题描述】:

我正在尝试学习基于道具的样式化组件的渲染。我只是想创建一个简单的导航栏。是的,我确实意识到您可以使用基于位置的 React Router 来设置活动链接。这对我来说更像是一次学习经历。

class Nav extends Component 
  constructor (props) 
    super(props)

    this.state = 
      isActive: 0
    
    this.handleClick = this.handleClick.bind(this)
  

  handleClick (n) 
    console.log('Hello There')

    this.setState = 
      isActive: n
    
  

  render () 
    const NAV = styled.div`
      display: flex;
      flex-direction: row;
      justify-content: space-between;
      width: 100%;
      background-color: black;
    `
    const SPAN = styled.span`
      font-size: 3.5vmin;
      cursor: pointer;
      color: white;
      $props =>
    props.selected &&
        css`
          color: cornflowerblue;
        `
    `
    const TEXT = styled.p``

    return (
      <NAV links=this.props.links>
        this.props.links.map((i, ii) => (
          <SPAN
            onClick=e => this.handleClick(ii)
            key=ii
            selected=this.state.isActive === ii ? true : ''
          >
            <TEXT>i</TEXT>
          </SPAN>
        ))
      </NAV>
    )
  

我正在尝试通过更改链接的文本颜色来激活链接。当我映射链接时,我提供导航,如果数组的索引等于活动状态,我使该链接处于活动状态。

然后,在单击时,我将状态的 isActive 更新为选定的索引。不用说,它不起作用。我猜地图的索引仅在渲染时可用,而在 onClick 事件中不可用。但是,我不确定要传递什么 handleClick 函数。

该应用程序在我的本地环境中渲染得很好。我用这个例子做了一个 Codepen,但它没有在那里渲染。我从来没有使用过 Codepen for React,这里是链接:https://codepen.io/anon/pen/daqGQQ

另外,我意识到我可以使用 className 属性创建一个 CSS 类,以使所选链接处于活动状态,但是,我宁愿学习“样式化组件”的方式。

任何帮助将不胜感激。谢谢

编辑

根据评论重新格式化:

import React,  Component  from 'react'
import styled,  css  from 'styled-components'

const NAV = styled.div`
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  width: 100%;
  background-color: black;
`
const SPAN = styled.span`
  font-size: 3.5vmin;
  cursor: pointer;
  color: white;
  $props =>
    props.selected &&
    css`
      color: cornflowerblue;
    `
`
const TEXT = styled.p``

class Nav extends Component 
  constructor (props) 
    super(props)

    this.state = 
      isActive: 0
    
    this.handleClick = this.handleClick.bind(this)
  

  handleClick (e) 
    console.log('Hello There')
    console.log(e.target.key)

    this.setState = 
      isActive: 1
    
  

  render () 
    return (
      <NAV links=this.props.links>
        this.props.links.map((i, ii) => (
          <SPAN
            id=ii
            onClick=e => this.handleClick(e)
            key=ii
            selected=this.state.isActive === ii ? true : ''
          >
            <TEXT>i</TEXT>
          </SPAN>
        ))
      </NAV>
    )
  


export default Nav

【问题讨论】:

1.您需要停止污染渲染方法,将 NAV 和 SPAN 移出渲染方法。 2.我不明白你的问题的逻辑,在你的代码中,我只看到状态控制 isActive,但是你根据道具改变颜色?你如何改变 props.selected 值?也就是说,state 控制 isAvtive,而 props 控制颜色?逻辑未连接。 嘿。我将组件移到了课堂之外。没错,我的逻辑有缺陷,这就是我发布问题寻求帮助的原因。我只希望 1 个组件基于点击处于活动状态。 【参考方案1】:

我通过使用 e.currentTarget.textContent 然后设置状态 isSelected: e.currentTarget.textContent onClick 来解决这个问题。代码:

import React,  Component  from 'react'
import styled,  css  from 'styled-components'

const NAV = styled.div`
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  width: 100%;
  background-color: black;
`
const SPAN = styled.span`
  font-size: 3.5vmin;
  cursor: pointer;
  color: white;
  $props =>
    props.selected &&
    css`
      color: cornflowerblue;
    `
`
const TEXT = styled.p``

class Nav extends Component 
  constructor (props) 
    super(props)

    this.state = 
      isSelected: 'Home'
    
    this.handleClick = this.handleClick.bind(this)
  

  componentDidMount () 

  handleClick (e) 
    this.setState(
      isSelected: e.currentTarget.textContent
    )
  

  render () 
    return (
      <NAV links=this.props.links>
        this.props.links.map((i, ii) => (
          <SPAN
            id=ii
            onClick=e => this.handleClick(e)
            key=ii
            selected=this.state.isSelected === i ? true : ''
          >
            <TEXT>i</TEXT>
          </SPAN>
        ))
      </NAV>
    )
  


export default Nav

【讨论】:

以上是关于样式化的组件 选定的导航项的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 高亮当前选中的导航项

“导航项中不支持普通样式”警告我的自定义条形按钮项

如何分别为wordpress导航的每个列表项背景设置样式

segue 样式“替换”后缺少导航栏按钮项

vue导航条选中项样式

不同控制器中的导航栏样式不同?