Я использую React и Html2Canvas для захвата формы нажатием кнопки. Форма имеет четыре узла select. Html2Canvas сохраняет форму как изображение, но выборки внутри показывают первый вариант в отображаемом изображении. Мне интересно, неправильно ли я настроил это либо в конфигурации html2canvas, либо в реакции.
let options = {
async: true,
foreignObjectRendering: true,
logging: false
};
let input = this.iceBreaker.current;
html2canvas(input, options).then(canvas => {
if (canvas) {
this.setState({
imageRef: canvas.toDataURL('image/png')
});
}
});
При нажатии кнопки imageRef загружается в формате PNG. Обратите внимание, что даже добавление div к телу показывает ту же проблему (именно по этой причине я не прикреплял никакого другого кода). Мы будем очень признательны за любое понимание. Спасибо!





Вот так: должно быть довольно ясно...
class App extends React.Component {
constructor(props) {
super(props);
this.state = { canvasArray: [] };
this.captureRef = React.createRef();
}
getScreenshotHandler = () => {
html2canvas(this.captureRef.current).then(canvas =>
this.setState({
canvasArray: [canvas.toDataURL(), ...this.state.canvasArray],
}),
);
};
renderCanvas = () => {
return this.state.canvasArray.map((canvas, i) => {
return <img key = {i} src = {canvas} alt = "screenshot" />;
});
};
render() {
return (
<div className = "wrapper">
<div ref = {this.captureRef} className = "to-capture">
<p>
This enitre <code>div</code> will be captured
</p>
</div>
<button onClick = {this.getScreenshotHandler}>Get Screenshot!</button>
<section>
<h5>Your screenshots will be availbale below:</h5>
{this.renderCanvas()}
</section>
</div>
);
}
}
Живая демонстрация здесь: https://codesandbox.io/s/1r213057vq
Элементы с абсолютной позицией не отображаются по умолчанию. Убедитесь, что все ваши элементы не находятся в абсолютном положении.
Этот комментарий привел меня к правильному ответу.
foreignObjectRendering: trueпозволял выпадающим значкам SVG хорошо выглядеть при рендеринге на холсте, но заставлял отображать только первый вариант выбора в форме, которую мы захватили, независимо от того, что было выбрано. Нам пришлось использовать другую обработку иконок, и все заработало.