【问题标题】:quagga-react barcode scannerquagga-react 条码扫描器
【发布时间】:2018-07-11 06:31:56
【问题描述】:

基本上我让演示工作除了实际扫描。即相机已打开等。不知道我错过了什么......

这是我的代码。

App.js 文件:

import React, { Component } from 'react';
import Scanner from './Scanner';
import Result from './Result';

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      scanning: false,
      results: [],
    };
    this._scan = this._scan.bind(this);
    this._onDetected = this._onDetected.bind(this);
  }

  _scan() {
    this.setState({ scanning: !this.state.scanning });
  }

  _onDetected(result) {
    this.setState({ results: this.state.results.concat([result]) });
  }
  render() {
    return (
      <div>
        <button onClick={this._scan}>{this.state.scanning ? 'Stop' : 'Start'}</button>
        <ul className="results">
          {this.state.results.map(result => {
            <Result key={result.codeResult.code} result={result} />;
          })}
        </ul>
        {this.state.scanning ? <Scanner onDetected={this.state._onDetected} /> : null}
      </div>
    );
  }
}

Scanner.js 文件:

import React, { Component } from 'react';
import Quagga from 'quagga';

export default class Scanner extends Component {
    constructor(props) {
        super(props);
        this._onDetected = this._onDetected.bind(this);
    }

    componentDidMount() {
        Quagga.init(
            {
                inputStream: {
                    type: 'LiveStream',
                    constraints: {
                        width: 640,
                        height: 480,
                        facingMode: 'environment', // or user
                    },
                },
                locator: {
                    patchSize: 'medium',
                    halfSample: true,
                },
                numOfWorkers: 2,
                decoder: {
                    readers: ['upc_reader'],
                },
                locate: true,
            },
            function(err) {
                if (err) {
                    return console.log(err);
                }
                Quagga.start();
            }
        );
        Quagga.onDetected(this._onDetected);
    }

    componentWillUnmount() {
        Quagga.offDetected(this._onDetected);
    }

    _onDetected(result) {
        this.props.onDetected(result);
    }

    render() {
        return <div id="interactive" className="viewport" />;
    }
}

Result.js 文件:

import React, { Component } from 'react';

export default class Result extends Component {
    render() {
        const result = this.props.result;

        if (!result) {
            return null;
        }
        return (
            <li>
                {result.codeResult.code} [{result.codeResult.format}]
            </li>
        );
    }
}

谢谢我的朋友们!

【问题讨论】:

  • 你能让它在反应中工作吗?或者任何其他条码阅读器将不胜感激?
  • 我在 Scanner.js 上收到 TypeError: this.props.onDetected is not a function 错误。你有解决方案吗?

标签: reactjs quaggajs


【解决方案1】:

您可能想要更改阅读器类型,默认为code_128_reader

例如,超市中使用的大多数条形码都遵循 EAN 规范(至少在我居住的地方),因此您可以将其放入 Scanner.js 以更改为 ean_reader

decoder: {
  readers: ["ean_reader"]
},

Quagga 开始的地方。

读者名单可以在这里找到:Quagga documentation

如果这不起作用,我建议尝试其他阅读器/条形码组合。

【讨论】:

    【解决方案2】:

    文档说在 Node 中你应该使用numOfWorkers: 0

    https://serratus.github.io/quaggaJS/#node-example

    【讨论】:

      【解决方案3】:

      添加 /* eslint-disable */ in 以返回。

                {
      /* eslint-disable */
      this.state.results.map(result => {
                  <Result key={result.codeResult.code} result={result} />;
                })}
              </ul>
      

      【讨论】:

        【解决方案4】:

        回答可能为时已晚,将其留在这里以防万一有人感兴趣。

        我能够让它工作。我需要解决的问题很少:

        1. 按照rpld 的建议应用了不同的解码器:
        decoder: {
          readers: ["ean_reader"]
        },
        
        1. 修复TypeError: this.props.onDetected is not a function。在App.js 中调整了以下行:
          发件人:
          {this.state.scanning ? &lt;Scanner onDetected={this.state._onDetected} /&gt; : null}
          至:
          {this.state.scanning ? &lt;Scanner onDetected={(result) =&gt; this._onDetected(result)} /&gt; : null}
        2. 我也使用了Quagga2,但不知道在这种情况下是否有什么不同。

        留下完整版本的工作代码,以防万一。

        App.js:

        import React, { Component } from 'react';
        import Scanner from './Scanner';
        import Result from './Result';
        
        export default class App extends Component {
          constructor(props) {
            super(props);
            this.state = {
              scanning: false,
              results: []
            };
            this._scan = this._scan.bind(this);
            this._onDetected = this._onDetected.bind(this);
          }
        
          _scan() {
            this.setState({ scanning: !this.state.scanning });
          }
        
          _onDetected(result) {
            this.setState({ results: this.state.results.concat([result]) });
          }
          render() {
            return (
              <div>
                <button onClick={this._scan}>{this.state.scanning ? 'Stop' : 'Start'}</button>
                <ul className="results">
                  {this.state.results.map((result, idx) => {
                    return (<Result key={result.codeResult.code} result={result} />)
                  })}
                </ul>
                {this.state.scanning ? <Scanner onDetected={(result) => this._onDetected(result)} /> : null}
              </div>
            );
          }
        }
        

        Scanner.js:

        import React, { Component } from 'react';
        import Quagga from '@ericblade/quagga2';
        
        export default class Scanner extends Component {
            constructor(props) {
                super(props);
                this._onDetected = this._onDetected.bind(this);
            }
        
            componentDidMount() {
                Quagga.init(
                    {
                        inputStream: {
                            type: 'LiveStream',
                            constraints: {
                                width: 640,
                                height: 480,
                                facingMode: 'environment', // or user
                            },
                        },
                        locator: {
                            patchSize: 'medium',
                            halfSample: true,
                        },
                        numOfWorkers: 0,
                        decoder: {
                            readers: ['ean_reader'],
                        },
                        locate: true,
                    },
                    function(err) {
                        if (err) {
                            return console.log(err);
                        }
                        Quagga.start();
                    }
                );
                Quagga.onDetected(this._onDetected);
            }
        
            componentWillUnmount() {
                Quagga.offDetected(this._onDetected);
            }
        
            _onDetected(result) {
                this.props.onDetected(result);
            }
        
            render() {
                return <div id="interactive" className="viewport" />;
            }
        }
        

        Result.js(根本没碰过):

        import React, { Component } from 'react';
        
        export default class Result extends Component {
            render() {
                const result = this.props.result;
        
                if (!result) {
                    return null;
                }
                return (
                    <li >
                        {result.codeResult.code} [{result.codeResult.format}]
                    </li>
                );
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2018-04-28
          • 1970-01-01
          • 2021-08-28
          • 1970-01-01
          • 1970-01-01
          • 2012-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多