如何处理样式组件中的条件

Posted

技术标签:

【中文标题】如何处理样式组件中的条件【英文标题】:How to handle conditionals in a styled component 【发布时间】:2019-08-29 21:35:08 【问题描述】:

我正在使用样式化组件和 ThemeProvider 为我的应用添加主题支持。有问题的组件已经有一个基于 prop 显示样式的条件。当我介绍主题时,我无法在边框属性上获得所需的样式。他们只是被忽略了。如果用十六进制值替换它们,我可以看到一个边框。

const Wrapper = styled.div`
  position: relative;
  width: 100px !important;
  height: 130px !important;
  opacity: $( isDragging ) => (isDragging ? 0.25 : 1);
  border: $( isSelected ) =>
    isSelected
      ? `1px solid $props => props.theme.CYAN`
      : `1px solid $props => new Color(props.theme.CYAN).alpha(0.25)`;
  text-align: center;
  padding: 10px !important;
  margin: 4px !important;
  box-shadow: none;
  border-radius: 0;
  cursor: pointer;
  box-sizing: border-box;
  background-color: $( isSelected ) =>
    isSelected
      ? props => new Color(props.theme.CYAN).alpha(0.25)
      : props => props.theme.DARK !important;

  & :hover 
    border-color: $props => props.theme.CYAN;
    box-shadow: none;
  


<Wrapper
        isDragging=isDragging
        isSelected=isSelected
        onClick=onClick
        className="daily-item"
      >


export const CLASSIC_THEME = 
  DARK: '#282a2b',
  LIGHT: 'white',
  CYAN: '#2edaf4',
  GREEN: '#26fba3',
  PURPLE: '#6f24bd',
  PINK: '#dd2df4',
  LIGHT_PURPLE: '#6d47f6',
  RED: '#f42d61',
  GREY: '#a6a6a6',
;

export const PRIMARY_THEME = 
  DARK: '#1f2630',
  LIGHT: '#EEEEFF',
  CYAN: '#BFC0C0',
  GREEN: '#9FB4C7',
  PURPLE: '#6f24bd',
  PINK: '#C89047',
  LIGHT_PURPLE: '#6d47f6',
  RED: '#f42d61',
  GREY: '#a6a6a6',
;

我知道这些键并不能准确地描述十六进制值 :) 我会讲到的

【问题讨论】:

可以分享一下 ThemeProvider 的代码吗? 我添加了 ThemeProvider 对不起,我的意思是你能分享实际的主题对象,例如 CLASSIC_THEME 也指的是什么。你确定它有一个名为 CYAN 的属性吗? 好的,更新帖子 【参考方案1】:

您在样式化的 div 上使用了标记的模板文字,这就是您获得对道具的引用的方式。但是,在您的方法中,我注意到您从道具中解构了 isSelected 属性,然后尝试通过在内部添加另一个箭头函数来使用道具,这不是标记模板文字的一部分。我猜这就是为什么它不起作用。请尝试以下操作:

const Wrapper = styled.div`
  position: relative;
  width: 100px !important;
  height: 130px !important;
  opacity: $( isDragging ) => (isDragging ? 0.25 : 1);
  border: $props =>
    props.isSelected
      ? `1px solid $props.theme.CYAN`
      : `1px solid $new Color(props.theme.CYAN).alpha(0.25)`;
  text-align: center;
  padding: 10px !important;
  margin: 4px !important;
  box-shadow: none;
  border-radius: 0;
  cursor: pointer;
  box-sizing: border-box;
  background-color: $props =>
    props.isSelected
      ? new Color(props.theme.CYAN).alpha(0.25)
      : props.theme.DARK !important;

  & :hover 
    border-color: $props => props.theme.CYAN;
    box-shadow: none;
  
`;

【讨论】:

成功了!非常感谢【参考方案2】:

props.theme.CYAN 看起来像什么?正如你所说,如果你用 HEX 替换它就可以了,这让我相信问题可能不是有条件的,而是new Color(props.theme.CYAN).alpha(0.25)

【讨论】:

这个模式适用于我使用它的任何其他地方,只要它不是这样的条件的一部分。这是我登录时得到的 ``` ƒ (props) return props.theme.CYAN; ``` 你能确认`new Color`是一个外部库吗? (这可能只是我在 JS 中不熟悉的东西)。话虽如此,props.theme.CYAN 的值可能与该库不兼容。您可以控制台记录该值吗?让我们知道它是什么? :1px solid $props =&gt;console.log('color', props.theme.CYAN) || new Color(props.theme.CYAN).alpha(0.25); 问题可能是您传递给它的对象,正如上面的 etarhan 所说。 props.theme.CYAN 可能不是有效的颜色值。您可以注销props.theme 以便我们知道我们正在处理的数据吗? 你能用 console.log 100% 确认它吗?这可能很愚蠢,但在这种情况下消除任何疑问将导致答案。 1px solid $props =&gt; console.log('props.theme.CYAN', props.theme.CYAN) || new Color(props.theme.CYAN).alpha(0.25)替换1px solid $props =&gt; new Color(props.theme.CYAN).alpha(0.25)

以上是关于如何处理样式组件中的条件的主要内容,如果未能解决你的问题,请参考以下文章

Android 中的两个并发 AsyncTasks - 如何处理竞争条件?

如何处理 React / Flux 组件中的状态转换

reactjs 如何处理一个组件中的多个单选按钮组?

侦听firebase数据库节点时如何处理kotlin中的竞争条件

在 monorepo 中的多个应用程序之间共享组件时如何处理共享依赖项

Symfony:如何处理表单中的日期字段