在 React JS 中使用颜色控制时的警告

IT技术 reactjs webpack
2021-05-09 15:16:02

我正在使用带有 Babel 和 Webpack 的 React JS。我的其他脚本即使是使用颜色module的脚本也一切正常,但是,我的一个脚本给了我以下错误:

指定的值“”不符合要求的格式。格式为“#rrggbb”,其中 rr、gg、bb 是两位十六进制数。

我的代码如下:

import React from 'react';

class EditDetails extends React.Component {


    constructor(props) {
        super(props);
        this.state = {
            bg: "#ffffff"
        };
    }

    handleChange(event) {
        const target = event.target;
        const value = target.type === 'checkbox' ? target.checked : target.value;
        const id = target.id;

            this.setState({
                [id]: value
            });
    }




  render() {
      return (
            <div>
                 <form>
                    <div>Background Colour:<input id="bg" type="color" onChange={this.handleChange.bind(this)} value="#dddddd" /></div>
                  </form>
            </div>
      )
  }
}

export default EditDetails;

如果我value="#dddddd"从我的输入标签中删除它,它实际上会给出两次相同的错误消息。

经过进一步调查,错误参考将我指向 ReactDOMInput.js 中的以下部分:

switch (props.type) {
  case 'submit':
  case 'reset':
    break;
  case 'color':
  case 'date':
  case 'datetime':
  case 'datetime-local':
  case 'month':
  case 'time':
  case 'week':
    // This fixes the no-show issue on iOS Safari and Android Chrome:
    // https://github.com/facebook/react/issues/7233
    node.value = '';
    node.value = node.defaultValue;
    break;
  default:
    node.value = node.value;
    break;
}

具体来说,它指的是第一node.value行(或node.value删除value属性的前两)。

当我的颜色代码为正确的十六进制格式时,为什么会生成此错误?

注意:正确的颜色确实在颜色控件中正确设置。

2个回答

我在技术上遇到了同样的错误,但我认为这与 onChange 无关。仅仅因为我的 onChange 函数与问题中的函数不同,而且我已经有一个不同的工作版本的代码可以与 onChange 一起使用。问题中的一个:

handleChange(event) {
        const target = event.target;
        const value = target.type === 'checkbox' ? target.checked : target.value;
        const id = target.id;

            this.setState({
                [id]: value
            });
    }

与我的对比:

handleChange = event => {
    this.setState({ value: event.target.value });
  };

无论 onChange 函数的结构有何不同,我们都会得到相同的错误。

万一它可能会帮助其他人 - 这是一个有效的版本:

class CheckBoxes extends React.Component {
  constructor(props) {
    super(props);
    this.state = { color: "" };
  }

  handleChange = event => {
    this.setState({ color: event.target.value });
  };
  render() {
    // const [initial, setInitial] = useState("#5e72e4");
    // const [color, setColor] = useState({});

    return (
      <div>
        <input
          type="color"
          value={this.state.color}
          onChange={this.handleChange}
        />
        <div
          style={{
            width: 50,
            height: 50,
            marginBottom: 20,
            backgroundColor: this.state.color
          }}
        ></div>
        <br />
        {/* <InputColor initialHexColor={initial} onChange={setColor} /> */}
      </div>
    );
  }
}
export default CheckBoxes;

基本上:当输入的值发生变化时,div 的 backgroundColor 会发生变化。

尝试以这种方式在类构造函数中绑定您的函数。

import React, { Component } from 'react';

export default class EditDetails extends Component {

  constructor(props) {
    super(props);
    this.state = { bg: '#ffffff' };
    this.handleChange = this.handleChange.bind(this);
  }

  handleChange(event) {
    const { target } = event;
    const { id, value } = target;

    this.setState(
      { [id]: value }
    );
  }
  
  render() {
    return (
      <form>
        <div>
          <input id='bg' type='color' onChange={this.handleChange} value={this.state.bg} />
        </div>
      </form>
    )
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>