Сканер штрих-кода quagga-реагирует
По сути, я получаю демоверсию для работы, за исключением фактического сканирования. т.е. камера включена и т.д. Не уверен, что мне не хватает...
Вот мой код
Файл 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>
);
}
}
Спасибо, друзья!
4 ответа
Вы можете изменить тип читателя, который code_128_reader
по умолчанию.
Например, большинство штрих-кодов, используемых в супермаркетах, соответствуют спецификации EAN (по крайней мере, там, где я живу), так что вы можете поместить это в Scanner.js
изменить на ean_reader
:
decoder: {
readers: ["ean_reader"]
},
где Quagga начинается.
Список читателей можно найти здесь: Документация Quagga.
Если это не работает, я бы посоветовал попробовать другие комбинации считывателя / штрих-кода.
В документации сказано, что в Node вы должны использовать numOfWorkers: 0
Может быть, поздно отвечать, оставлю здесь на случай, если кому-то будет интересно.
Я смог заставить это работать. Мне нужно было решить несколько проблем:
- Применял другой декодер, как предлагал NorRetsim :
decoder: {
readers: ["ean_reader"]
},
- Исправить
TypeError: this.props.onDetected is not a function
. ВApp.js
скорректировал следующую строку:
From:
{this.state.scanning ? <Scanner onDetected={this.state._onDetected} /> : null}
К:
{this.state.scanning ? <Scanner onDetected={(result) => this._onDetected(result)} /> : null}
- Я также использовал 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>
);
}
}
Добавьте /* eslint-disable */ для возврата.
{
/* eslint-disable */
this.state.results.map(result => {
<Result key={result.codeResult.code} result={result} />;
})}
</ul>