警告:对于非布尔属性,收到`false`。如何为自定义布尔属性传递布尔值?

时间:2018-04-11 20:53:08

标签: reactjs styled-components react-16

Warning: Received `false` for a non-boolean attribute `comingsoon`.

If you want to write it to the DOM, pass a string instead: 
comingsoon="false" or comingsoon={value.toString()}.

如何在React的自定义属性中传递布尔值?

我使用样式组件并通过组件传递属性。这是我如何通过attr。

的图片

passing boolean custom attr as "comingsoon"

styled-components css props

9 个答案:

答案 0 :(得分:17)

请改为尝试:

comingsoon={value ? 1 : 0}

答案 1 :(得分:7)

就我而言,这是因为我不小心将{...@props}传递到了div中。

通常传递attribute={false}很好,但不能传递给本机元素。

答案 2 :(得分:6)

5.1开始,您现在可以使用transient props,这可以防止将道具传递给DOM元素。

const Comp = styled.div`
  color: ${props =>
    props.$draggable || 'black'};
`;

render(
  <Comp $draggable="red" draggable="true">
    Drag me!
  </Comp>
);

答案 3 :(得分:3)

您必须为属性添加$前缀:

$comingsoon={value}

Styled Components在5.1版本中添加了瞬态道具: https://styled-components.com/docs/api#transient-props

答案 4 :(得分:2)

只需将其设为数字​​,这是https://github.com/styled-components/styled-components/issues/1198的解决方法:

答案 5 :(得分:1)

类似于上述弗兰克·林斯的回答,但是我不得不使用undefined而不是0来消除警告:

comingsoon={value ? 1 : undefined}

答案 6 :(得分:1)

通过用括号 {} 括住我通过 props 传递的布尔变量解决了这个问题。

Event::whereHas('participants', function ($query) {
     $query->where('user_id', '=', 1);
})->get();

答案 7 :(得分:0)

有类似的问题。关键字“值”是保留关键字。尝试使用其他东西。

例如,这将产生错误,因为保留了'alt'关键字:

SessionPackage

但是,这不会产生错误:

<StyledButton alt={variable}>Button Text</StyledButton>

答案 8 :(得分:0)

styled-components的此错误似乎是由于styled()试图将布尔值应用于DOM中的元素,但是DOM元素仅接受字符串作为属性。

这在styled-components存储库中有很好的记录:https://github.com/styled-components/styled-components/issues/1198

有两种解决方案:

  1. 将带有传递的属性的样式化的组件向上抬起,以使该属性不会直接应用于元素。或者,

  2. 在调用样式化组件时,将传递的属性过滤出道具。

下面的代码演示了这两个选项。

CodeSandbox:https://codesandbox.io/s/cool-thunder-9w132?file=/src/App.tsx

import React, { useState } from "react";
import styled from 'styled-components';

// demonstration of two different solutions for solving the styled-components error:
// `Warning: Received `false` for a non-boolean attribute`
// Solution 1: Lift the attribute up into a wrapper.
// Solution 2: Filter-out the `toggle` attribute passed to styled-component.

interface BtnProps {
  toggle: boolean;
}

const Container = styled.div`
  width: 100%;
  height: 500px;
  display: flex;
  flex-direction: row;
  justify-content: space-around;
  align-items: center;
`;

const StyledBtnOne = styled.div<BtnProps>`
  & button {
    background-color: ${({toggle}) => toggle ? ' #2ecc71' : '' };
  };
`;

const StyledBtnTwo = styled(({primary, ...props}) =>
  <button {...(({toggle, ...propz}) => propz)(props)} />)<BtnProps>`
  background-color: ${({toggle}) => toggle ? ' #3498db' : '' };
`;

const App = () => {

  const [ btnOne, setBtnOne ] = useState(false);

  const [ btnTwo, setBtnTwo ] = useState(false);

  const triggerOne = () => setBtnOne(!btnOne);

  const triggerTwo = () => setBtnTwo(!btnTwo);

  return (
    <Container>
      <StyledBtnOne toggle={btnOne}>
        <button 
          onClick={triggerOne}>
            Solution 1
        </button>
      </StyledBtnOne>

      <StyledBtnTwo 
        toggle={btnTwo}
        onClick={triggerTwo}>
        Solution 2
      </StyledBtnTwo>
    </Container>
  );

}

export default App;