React 中的内联 CSS 样式:如何实现 a:hover?

IT技术 reactjs
2021-03-25 05:49:08

我非常喜欢React 中内联 CSS 模式并决定使用它。

但是,您不能使用:hover和类似的选择器。那么在使用内联 CSS 样式时实现悬停高亮的最佳方法是什么?

#reactjs 的一个建议是拥有一个Clickable组件并像这样使用它:

<Clickable>
    <Link />
</Clickable>

Clickable有一个hovered状态,并将其作为props的链接。但是,Clickable(我实现它的方式)将 包装Link在 a 中,div以便它可以设置onMouseEnteronMouseLeave到它。这让事情变得有点复杂(例如,span包裹在 a 中的div行为与 不同span)。

有没有更简单的方法?

6个回答

我认为 onMouseEnter 和 onMouseLeave 是可行的方法,但我认为不需要额外的包装器组件。这是我如何实施它:

var Link = React.createClass({
  getInitialState: function(){
    return {hover: false}
  },
  toggleHover: function(){
    this.setState({hover: !this.state.hover})
  },
  render: function() {
    var linkStyle;
    if (this.state.hover) {
      linkStyle = {backgroundColor: 'red'}
    } else {
      linkStyle = {backgroundColor: 'blue'}
    }
    return(
      <div>
        <a style={linkStyle} onMouseEnter={this.toggleHover} onMouseLeave={this.toggleHover}>Link</a>
      </div>
    )
}

然后,您可以使用悬停状态 (true/false) 来更改链接的样式。

@AdamTuttle react 有一个onFocus事件;所以你可以对:focusas做同样的事情:hover,除了不需要onMouseEnteronMouseLeave你只需要onFocus
2021-05-24 05:49:08
请注意,此方法强制在主线程上执行,而典型的 CSS 事件处理效率更高。
2021-05-29 05:49:08
这似乎涵盖:hover但不是:focus
2021-06-07 05:49:08

聚会迟到,但有解决方案。您可以使用“&”来定义悬停第 n 个子项等的样式:

day: {
    display: "flex",
    flex: "1",
    justifyContent: "center",
    alignItems: "center",
    width: "50px",
    height: "50px",
    transition: "all 0.2s",
    borderLeft: "solid 1px #cccccc",

    "&:hover": {
      background: "#efefef"
    },
    "&:last-child": {
      borderRight: "solid 1px #cccccc"
    }
},
它不适用于内联样式,这个例子会带来混乱。如果它真的有效,请提供一个更好的完整组件示例。
2021-05-26 05:49:08
这不是解决方案,问题是如何使用 INLINE css 而不是单独的样式表。
2021-06-03 05:49:08
这不适用于 React。你需要一个额外的库,比如 styled-components。
2021-06-09 05:49:08
这不能完全在 React 上工作,在codeandbox.io/s/zealous-roentgen-yo57x上测试
2021-06-17 05:49:08
哥们,仔细看看。这是内联样式。
2021-06-21 05:49:08

我处于同样的情况。真的很喜欢在组件中保持样式的模式,但悬停状态似乎是最后一个障碍。

我所做的是编写一个 mixin,您可以将其添加到需要悬停状态的组件中。这个 mixin 会hovered为你的组件的状态添加一个新的属性。true如果用户将鼠标悬停在组件的主 DOM 节点上,它将被设置为,并false在用户离开元素时将其设置回

现在在您的组件渲染函数中,您可以执行以下操作:

<button style={m(
     this.styles.container,
     this.state.hovered && this.styles.hover,
)}>{this.props.children}</button>

现在每次hovered状态改变时组件都会重新渲染。

我还为此创建了一个沙箱存储库,用于自己测试其中的一些模式。如果您想查看我的实现示例,请查看它。

https://github.com/Sitebase/cssinjs/tree/feature-interaction-mixin

使用普通的传播运算符不是更有意义吗?
2021-05-22 05:49:08
@abhirathore2006 Radium 的工作方式相同,问题是具体如何在不使用外部样式表的情况下执行此操作
2021-05-30 05:49:08
长期运行不是一个好的解决方案,镭将是更好的选择或使用外部样式表
2021-05-31 05:49:08
一个什么是m按照上面的?
2021-06-21 05:49:08

你可以使用 Radium——它是一个用于 ReactJS 内联样式的开源工具。它准确地添加了您需要的选择器。非常受欢迎,请查看 - npm 上的 Radium

我刚刚看到这篇文章,你会如何在以下情况下实现镭? module.exports = React.createClass({ displayName: 'App',})
2021-06-02 05:49:08
@Rkhayat您可以将其包装为module.exports = Radium(React.createClass({ displayName: 'App',}))或将类分配给一个值并在其@Radium上方添加装饰器作为文档提到的github.com/FormidableLabs/radium#usage
2021-06-05 05:49:08
还有一个很棒的东西叫做 CSS ;)
2021-06-07 05:49:08

这是我使用 React Hooks 的解决方案。它结合了扩展运算符和三元运算符。

样式.js

export default {
  normal:{
    background: 'purple',
    color: '#ffffff'
  },
  hover: {
    background: 'red'
  }
}

按钮.js

import React, {useState} from 'react';
import style from './style.js'

function Button(){

  const [hover, setHover] = useState(false);

  return(
    <button
      onMouseEnter={()=>{
        setHover(true);
      }}
      onMouseLeave={()=>{
        setHover(false);
      }}
      style={{
        ...style.normal,
        ...(hover ? style.hover : null)
      }}>

        MyButtonText

    </button>
  )
}
我喜欢有创造力的人对这些类型的东西是多么有创意,你可能可以使用自定义钩子使它更干净,更可重用const {onMouseEnter, onMouseLeave, styles } = useHoverStyle(style.hover) 话虽如此,这让我感到难过,因为缺乏内联样式支持,我们不得不依赖如此复杂的 JS用于悬停状态😞
2021-06-03 05:49:08