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

fhu*_*cho 148 reactjs

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

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

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

<Clickable>
    <Link />
</Clickable>
Run Code Online (Sandbox Code Playgroud)

Clickable有一个hovered状态,并将其作为道具的链接.但是,Clickable(我实现它的方式)包装了Link一个,div以便它可以设置onMouseEnteronMouseLeave它.这使得事情有点复杂(例如,span包裹在一个div不同的行为span).

有更简单的方法吗?

Jon*_*han 93

我认为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>
    )
}
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,此方法会强制在主线程上执行,而典型CSS事件的处理效率更高。 (4认同)
  • @AdamTuttle react有一个`onFocus`事件; 所以你可以为`:focus`做同样的事情``hover`,除了不需要`onMouseEnter`和`onMouseLeave`你只需要`onFocus` (3认同)
  • 这似乎涵盖了 `:hover` 而不是 `:focus` (2认同)

Wim*_*ans 40

我处于同样的境地.真的喜欢在组件中保持样式的模式,但悬停状态似乎是最后一道障碍.

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

现在,在组件渲染功能中,您可以执行以下操作:

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

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

我还为此创建了一个沙盒仓库,我用它来测试一些这些模式.如果您想查看我的实现示例,请查看它.

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

  • @ abhirathore2006 Radium以同样的方式工作,问题是具体如何在不使用外部样式表的情况下执行此操作 (15认同)
  • 对于长时间运行来说,不是一个好的解决方案,Radium将是更好的选择或使用外部样式表 (2认同)
  • 上面的“m”是什么? (2认同)

Gyr*_*yro 25

您可以使用Radium - 它是使用ReactJS的内联样式的开源工具.它完全添加了您需要的选择器.非常受欢迎,请查看 - 镭星期二


yea*_*xon 20

这是使用 CSS 变量的另一种选择。这需要提前定义 css 悬停定义,所以我猜它不是纯粹的内联,但代码很少且灵活。

css(设置悬停状态):

.p:hover:{
 color:var(--hover-color) !important,
 opacity:var(--hover-opacity)
}
Run Code Online (Sandbox Code Playgroud)

反应:

<p style={{'color':'red','--hover-color':'blue','--hover-opacity':0.5}}>
Run Code Online (Sandbox Code Playgroud)


PAT*_*ION 16

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

样式.js

export default {
  normal:{
    background: 'purple',
    color: '#ffffff'
  },
  hover: {
    background: 'red'
  }
}
Run Code Online (Sandbox Code Playgroud)

按钮.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>
  )
}
Run Code Online (Sandbox Code Playgroud)


3dG*_*ber 14

我找到了一种干净的方法来做到这一点useState,用一个包装器,我称之为useHover
不需要额外的库/框架。

const App = () => {

    const hover = useHover({backgroundColor: "LightBlue"})

    return <p {...hover}>Hover me!</p>
}
Run Code Online (Sandbox Code Playgroud)

包装器的代码:

function useHover(styleOnHover: CSSProperties, styleOnNotHover: CSSProperties = {})
{
    const [style, setStyle] = React.useState(styleOnNotHover);

    const onMouseEnter = () => setStyle(styleOnHover)
    const onMouseLeave = () => setStyle(styleOnNotHover)

    return {style, onMouseEnter, onMouseLeave}
}
Run Code Online (Sandbox Code Playgroud)

请注意,useHover当组件未悬停时,样式有一个可选的第二个参数。

在这里尝试一下


Ole*_*nen 10

完全CSS支持正是这个庞大的CSSinJS库的原因,为了有效地执行此操作,您需要生成实际的CSS,而不是内联样式.在更大的系统中,内联样式的响应速度要慢得多.免责声明 - 我维护JSS.

  • @ICW因为JS参与其中。 (2认同)

Hit*_*ahu 10

晚会,但要有解决方案。您可以使用“&”为第n个Child等定义样式:

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"
    }
},
Run Code Online (Sandbox Code Playgroud)

  • 它不适用于内联样式,这个例子会带来混乱。如果它真的有效,请提供一个更好的完整组件示例。 (17认同)
  • 这并不纯粹在 React 上工作,在 https://codesandbox.io/s/zealous-roentgen-yo57x 上进行了测试 (16认同)
  • 杜德,仔细看看。这是内联样式。 (8认同)
  • 这不是解决方案,问题是如何使用 INLINE css 而不是单独的样式表。 (7认同)
  • 此解决方案仅适用于使用 Material UI 的用户。 (5认同)
  • 这不适用于React。您需要一个额外的库,例如样式组件。 (3认同)
  • 出色的!奇迹般有效! (2认同)
  • 这不需要 Sass 依赖吗? (2认同)
  • 这确实对我有用,但是我使用 Material ui 中的 withStyles 函数为我的组件提供“classes”属性。不确定这是否与此有关。 (2认同)
  • 伙计,这在普通的 React 中会很好。React 希望用户使用“style”属性来设置组件的样式,但由于默认情况下不能在“style”属性中使用任何类型的媒体查询或选择器,因此很快就无法坚持使用它来进行样式设置。非常不幸。 (2认同)

小智 9

onMouseEnter={(e) => {
    e.target.style.backgroundColor = '#e13570';
    e.target.style.border = '2px solid rgb(31, 0, 69)';
    e.target.style.boxShadow = '-2px 0px 7px 2px #e13570';
}}
onMouseLeave={(e) => {
    e.target.style.backgroundColor = 'rgb(31, 0, 69)';
    e.target.style.border = '2px solid #593676';
    e.target.style.boxShadow = '-2px 0px 7px 2px #e13570';
}}
Run Code Online (Sandbox Code Playgroud)

在样式或类中设置默认属性,然后调用 onMouseLeave() 和 onMouseEnter() 以创建悬停功能。

  • 对于打字稿,首先使用 `const target = e.target as HTMLElement;` (2认同)

Jos*_*son 8

制作样式 - 部分 - 由于这个原因(其他人对其他库/语法的实现存在分歧,并且内联样式缺乏对属性值前缀的支持).相信我们应该能够简单地在JavaScript中编写CSS并拥有完全自包含的组件HTML-CSS-JS.使用ES5/ES6模板字符串,我们现在可以,它也可以!:)

npm install style-it --save

功能语法(JSFIDDLE)

import React from 'react';
import Style from 'style-it';

class Intro extends React.Component {
  render() {
    return Style.it(`
      .intro:hover {
        color: red;
      }
    `,
      <p className="intro">CSS-in-JS made simple -- just Style It.</p>
    );
  }
}

export default Intro;
Run Code Online (Sandbox Code Playgroud)

JSX语法(JSFIDDLE)

import React from 'react';
import Style from 'style-it';

class Intro extends React.Component {
  render() {
    return (
      <Style>
      {`
        .intro:hover {
          color: red;
        }
      `}

        <p className="intro">CSS-in-JS made simple -- just Style It.</p>
      </Style>
    );
  }
}

export default Intro;
Run Code Online (Sandbox Code Playgroud)


Isa*_*Pak 6

关于样式化组件react-router v4,您可以执行以下操作:

import {NavLink} from 'react-router-dom'

const Link = styled(NavLink)`     
  background: blue;

  &:hover {
    color: white;
  }
`

...
<Clickable><Link to="/somewhere">somewhere</Link></Clickable>
Run Code Online (Sandbox Code Playgroud)


tom*_*cco 6

这对于在 React 组件中使用内联样式(以及使用 :hover CSS 函数)来说是一个很好的技巧:

...

<style>
  {`.galleryThumbnail.selected:hover{outline:2px solid #00c6af}`}
</style>

...

Run Code Online (Sandbox Code Playgroud)


Kor*_*rdi 6

您可以只创建一个abstract悬停类,例如颜色。

.hoverClassColor:hover {
  color:var(--hover-color) !important;
}
Run Code Online (Sandbox Code Playgroud)

然后对于您想要将鼠标悬停时的颜色更改为的所有元素red

render() {
  return <a className={'hoverClassColor'} style={{'--hover-color':'red'}}>Test</a>
}
Run Code Online (Sandbox Code Playgroud)

对我来说,它就像内联,因为这些类是抽象的,可以重用于您想要实现颜色悬停的所有元素。


pai*_*boo 5

结帐Typestyle如果您使用的是与做出反应打字稿。

以下是:hover的示例代码

import {style} from "typestyle";

/** convert a style object to a CSS class name */
const niceColors = style({
  transition: 'color .2s',
  color: 'blue',
  $nest: {
    '&:hover': {
      color: 'red'
    }
  }
});

<h1 className={niceColors}>Hello world</h1>
Run Code Online (Sandbox Code Playgroud)


小智 5

除了乔纳森(Jonathan)的答案,以下是涵盖焦点和活动状态的事件,以及使用onMouseOver而不是的情况,onMouseEnter因为如果您将事件应用到目标中的任何子元素,后者将不会冒泡。

var Link = React.createClass({

  getInitialState: function(){
    return {hover: false, active: false, focus: false}
  },

  toggleHover: function(){
    this.setState({hover: !this.state.hover})
  },

  toggleActive: function(){
    this.setState({active: !this.state.active})
  },

  toggleFocus: function(){
    this.setState({focus: !this.state.focus})
  },

  render: function() {
    var linkStyle;
    if (this.state.hover) {
      linkStyle = {backgroundColor: 'red'}
    } else if (this.state.active) {
      linkStyle = {backgroundColor: 'blue'}
    } else if (this.state.focus) {
      linkStyle = {backgroundColor: 'purple'}
    } 

    return(
      <div>
        <a style={linkStyle} 
          onMouseOver={this.toggleHover} 
          onMouseOut={this.toggleHover} 
          onMouseUp={this.toggleActive} 
          onMouseDown={this.toggleActive} 
          onFocus={this.toggleFocus}> 
          Link 
        </a>
      </div>
    )
  }
Run Code Online (Sandbox Code Playgroud)


Hem*_*ari 5

简单的方法是使用三元运算符

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={this.state.hover ? {"backgroundColor": 'red'}: {"backgroundColor": 'blue'}} onMouseEnter={this.toggleHover} onMouseLeave={this.toggleHover}>Link</a>
      </div>
    )
  }
Run Code Online (Sandbox Code Playgroud)


Ask*_*k P 5

2022 年最简单的方法:useRef + 内联 onMouseOver/onMouseOut

例子:

 var bottomAtag = useRef(null)
    
   
Run Code Online (Sandbox Code Playgroud)

...然后在里面返回(

 <a ref={bottomAtag} onMouseOver={() => bottomAtag.current.style.color='#0F0'} ...></a>
Run Code Online (Sandbox Code Playgroud)