【问题标题】:Efficient method of importing values from React to CSS将值从 React 导入 CSS 的有效方法
【发布时间】:2017-10-12 10:14:12
【问题描述】:

我一直在研究将值从 React 组件共享/导入到 Sass/CSS 文件的方法的一些不同选项。在接收到包含图像路径(来自 API)的道具后,我设置了组件的 background 属性。这被设置为内联样式。

我还想为组件图像悬停时添加一个不透明层。这可以通过常规 CSS 轻松完成,但是当鼠标悬停在上面时,我不能简单地将 background 属性覆盖为渐变或颜色。

我还需要获取组件内联样式中使用的图像路径,以便在图像上应用不透明度。

组件:

render() {
    const styles = {
      background: `url('...somepath.jpeg') no-repeat center`
    }
    const item = { ...type, ...this.props.metadata };

    return (
      <section className="card"
               onClick={this.props.cb.bind(null, item)}
               style={styles}>
      </section>
    );
  }

样式:

.card:hover {
        cursor: pointer;
        background: linear-gradient(rgba(20,20,20, .5), rgba(20,20,20, .5)) !important;
        // without the path to build the url, this just deletes the image
 }

基本上,我希望在悬停时应用的样式如下所示: linear-gradient(rgba(20,20,20, .5), rgba(20,20,20, .5)), url('...somepath.jpeg') no-repeat center

有没有一种有效的方法来完成这样的事情?我只能考虑向组件添加 mouseover/mouseout 事件侦听器以添加“悬停”内联样式......但我想避免过多地使用内联。

【问题讨论】:

  • 为什么不能使用css
  • @guest271314 图像的路径来自 API 调用,该 API 调用的响应作为道具传递给此卡片组件。我找不到将该路径导入 CSS 文件的方法。内联样式也不支持伪选择器。
  • 您可以在现有的CSSStyleSheet 中设置css 规则或将css 文本附加到document 中的&lt;style&gt; 元素。

标签: javascript css reactjs


【解决方案1】:

这是styled-components 的完美用例。使用样式化组件,您可以将 url 作为道具传递,同时仍然能够使用 CSS 的全部功能。

特定于您的案例的示例代码:

const Section = styled.section`
  &:hover {
    cursor: pointer;
    ${(props) => `background: url(${props.url}) no-repeat center` }
  }
`

render() {
  const item = { ...type, ...this.props.metadata };

  return (
    <Secion className="card"
             onClick={this.props.cb.bind(null, item)}
             url="...somepath.jpeg"
     />
  );
}

【讨论】:

  • 谢谢。这是一个有趣的问题解决方案。但是,您是否曾经担心这个库基本上是更多的内联样式?有人告诉我尽可能避免使用内联样式(尽管我不能确定为什么会这样)。
  • @Jose 这个库几乎具有通过 SASS 可用的所有功能(伪类、媒体查询等)。它绝对不同于普通的内联样式。
  • 这很酷。对于在 React 组件 样式表中维护样式的担忧如何?这不会在不同的文件中更加分散样式吗?
  • @Jose 从理论上讲,您应该将所有样式保留在组件中,并且全局样式很少。
猜你喜欢
  • 1970-01-01
  • 2020-06-24
  • 2017-11-21
  • 2012-01-18
  • 2018-08-31
  • 1970-01-01
  • 2018-12-18
  • 2019-05-01
相关资源
最近更新 更多