- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个小项目,允许用户上传图像,然后图像将显示在 Canvas 上。
我正在使用react-konva为此。
我有一个名为 DesignPage 的容器组件,它管理状态并将事件处理程序传递给其子组件。
在这个 DesignPage 组件中,我还有另外 2 个组件:工具 - Canvas
当我使用Tools组件上传图像时,图像应该显示在Canvas组件上。
我正在使用react-dropzone在工具组件内处理文件上传
在这个Canvas组件中,有一个名为DesignImage的子组件,它只是用于显示图像。
但问题是,当我上传时,它并没有改变 Canvas 上的图像。
我该如何解决这个问题?
这是我的代码:
DesignPage组件:
import React, {Component} from 'react';
import {
Row,
Col
} from 'reactstrap';
import Tools from "../components/DesignPage/Tools";
import Canvas from "../components/DesignPage/Canvas";
import Styles from "../components/DesignPage/Styles";
class DesignPage extends Component {
state = {
text: '',
image: '',
files: []
};
static propTypes = {};
handleTextChange = e => {
this.setState({text: e.target.value});
};
handleFileDrop = files => {
this.setState({
files,
image: files[0].preview
});
};
render() {
return <Row>
<Col xs={12} md={4}>
<Tools
files={this.state.files}
onTextChange={this.handleTextChange}
onFileDrop={this.handleFileDrop}/>
</Col>
<Col xs={12} md={5}>
<Canvas
text={this.state.text}
image={this.state.image}/>
</Col>
<Col xs={12} md={3}>
<Styles/>
</Col>
</Row>;
}
}
export default DesignPage;
工具组件:
import React, {Component} from 'react';
import PropTypes from 'prop-types';
import {
TabContent,
TabPane,
Nav,
NavItem,
NavLink,
Row,
Col,
FormGroup,
Label
} from 'reactstrap';
import classnames from 'classnames';
import Dropzone from 'react-dropzone';
class Tools extends Component {
state = {
activeTab: '1'
};
toggle = (tab) => {
if (this.state.activeTab !== tab) {
this.setState({
activeTab: tab
});
}
};
render() {
return <Row>
<Col xs={12}>
<div>
<Nav tabs justified>
<NavItem>
<NavLink
className={classnames({active: this.state.activeTab === '1'})}
onClick={() => {
this.toggle('1');
}}
>
Text
</NavLink>
</NavItem>
<NavItem>
<NavLink
className={classnames({active: this.state.activeTab === '2'})}
onClick={() => {
this.toggle('2');
}}
>
Art
</NavLink>
</NavItem>
</Nav>
<TabContent activeTab={this.state.activeTab}>
<TabPane tabId="1">
<Row>
<Col sm="12">
<FormGroup>
<Label for={"custom-text"}>Enter text below</Label>
<textarea
className={"form-control"}
id={"custom-text"}
onChange={this.props.onTextChange}/>
</FormGroup>
<FormGroup>
<Label for={"font-select"}>Choose a font</Label>
</FormGroup>
</Col>
</Row>
</TabPane>
<TabPane tabId="2">
<Row>
<Col sm="12">
<FormGroup>
<div className="dropzone-container">
<Dropzone onDrop={this.props.onFileDrop}>
<p>Drop a design here, or click to select design to upload.</p>
</Dropzone>
</div>
</FormGroup>
</Col>
</Row>
</TabPane>
</TabContent>
</div>
</Col>
</Row>;
}
}
Tools.propTypes = {
files: PropTypes.array.isRequired,
onTextChange: PropTypes.func.isRequired,
onFileDrop: PropTypes.func.isRequired
};
export default Tools;
Canvas 组件:
import React from 'react';
import PropTypes from 'prop-types';
import {
Row,
Col
} from 'reactstrap';
import {Stage, Layer} from 'react-konva';
import UserText from "./Canvas/UserText";
import DesignImage from "./Canvas/DesignImage";
const Canvas = props => {
return <Row>
<Col xs={12} className={"canvas-container"}>
<div className={"object-container"}>
<img className={"object-img"} src={"images/iPhone5A.png"} alt={"iPhone5A"}/>
<div className="drawing-area">
<Stage width={window.innerWidth} height={window.innerHeight}>
<Layer>
<UserText text={props.text}/>
<DesignImage image={props.image}/>
</Layer>
</Stage>
</div>
</div>
</Col>
</Row>;
};
Canvas.propTypes = {
text: PropTypes.string.isRequired,
image: PropTypes.string.isRequired
};
export default Canvas;
DesignImage组件:
import React, {Component} from 'react';
import PropTypes from 'prop-types';
import {Image} from 'react-konva';
class DesignImage extends Component {
state = {
image: null
};
static propTypes = {
image: PropTypes.string.isRequired
};
componentDidMount() {
const image = new window.Image();
image.src = 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRYTULZCGUVEQJEXt9iB8PU4Kb2FMS9Z6ufR1FnQTdrEl5uBOl52Q';
image.onload = () => {
// setState will redraw layer
// because "image" property is changed
this.setState({
image: image
});
};
}
render() {
return <Image image={this.props.image} draggable={true}/>;
}
}
export default DesignImage;
最佳答案
当组件从 props 获得新图像时,您需要编写代码来更新图像。
class DesignImage extends Component {
state = {
image: null
};
static propTypes = {
image: PropTypes.string.isRequired
};
componentDidMount() {
this.updateImage();
}
componentDidUpdate() {
this.updateImage();
}
updateImage() {
const image = new window.Image();
image.src = this.props.image;
image.onload = () => {
this.setState({
image: image
});
};
}
render() {
return <Image image={this.state.image} draggable={true}/>;
}
}
更新:
您可以使用 use-image
Hook 来简化图像加载:
import useImage from 'use-image';
const DesignImage = ({ image }) => {
const imgElement = useImage(image);
return <Image image={imgElement} draggable={true}/>;
}
关于reactjs - React-konva 上传后如何更改图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49736475/
我正在尝试通过一个名为react-konva的包来学习如何在react中使用 Canvas 。 npm 安装非常简单,我添加了一些可以运行的演示代码... // in MainComponent.js
我在我的项目中使用 Konva.js,我特别需要在使用 Konva.Rect() 类定义的可拖动矩形内定义文本。有没有一种方法可以在不使用单独的 Konva.Text 的情况下实现这一点() 或 Ko
以下是来自 Konvajs 的示例加载图像的库: var imageObj = new Image(); imageObj.onload = function() { var yoda = new
我正在努力处理一个小项目,我想在其中添加不同的插槽并保存在数据库中。 一切都按预期正常工作,我将 json 保存在数据库中并在编辑页面上再次调用。 Problem is the rectangles
安装和导入 Konva 和 react-konva 后,我的 jest@enzyme 测试无法运行并出现以下错误: ● 测试套件无法运行 Jest encountered an unexpected
如何序列化和反序列化自定义 Konva Shape? Konva 允许您使用sceneFunc 创建自定义形状,但是当您将其存储为JSON 并加载回来时,您怎么知道它是什么自定义形状? 最佳答案 要定
我正在尝试使用 React-Konva 库实现一个操纵杆,该操纵杆可用于控制 React.JS 中的机器人之类的东西。到目前为止,我已经设法通过在较大的圆圈内绘制一个较小的圆圈并让较小的圆圈在鼠标按下
这个问题是针对命运之轮的例子的。作为 javascript 的新手,我已经设法更改了楔形的数量、它们的颜色和标签,但我无法弄清楚将函数绑定(bind)到旋转动画的结束事件。这将是一个关于冒险行为的小型
我正在使用 Konva 在网页上创建一个区域。我为我的矩形创建一个 DragBoundFunc 函数,检查 pos.x 和 pos.y 以及 Canvas 和矩形的宽度,这工作正常 - 矩形仅在拖动时
我正在使用 Vue.js 的 Konva 包装器开发类似于甘特图的东西。我基本上有一个包含矩形的组(以及在这种情况下不相关的一些其他元素)。该组是可拖动的,如果该组在拖动时与另一个组重叠,我想更改矩形
我有一个网络,我想用 Konva (以及 React-konva 绑定(bind))绘制。当位置更新时,我希望将网络中的节点设置为新位置的动画,同时设置连接它们的链接的开始和结束位置的动画。 我从以下
我试图清除每个圆圈和线条的图层(将其完全删除),但将图像保留在背景中。 如果我使用layer.clear(),它也会删除图像。 问题:如何清除图层但避免删除图像? https://codesandbo
我在 Konva 中有两个可拖动的矩形,取自 tutorial . 我的目标是让红色(不可拖动)矩形始终位于蓝色可拖动矩形的平均位置。 我尝试从教程代码中更改它: box1.on('mouseover
我正在尝试为我的道路绘制一 strip 有 2 条线的分隔符。我已经尝试过只用 2 条平行线来制作它,但是当我制作我的道路曲线时,它看起来不太好。像这样: 小曲线: 大曲线: 因为它现在我只是在黑色背
我在形状层之上有一个透明的拖动层。非常适合使交互与众不同,因此我可以切换拖动的功能(在 ScrollView 或编辑形状位置之间)。但是,除非我关闭拖动模式(通过隐藏介入的透明 Rect),否则其他鼠
我有一个简单的 Konva 设置,包括图层、矩形和文本。 Canvas 随着窗口大小的调整而缩放。我的目标是在拖动时将文本包含在 Canvas 中。目前,它适用于左边界和上边界,但不适用于下边界和右边
我正在尝试使用 React 和 konva 构建一个图像裁剪工具。我想更改裁剪矩形外的不透明度以模糊图像的其余部分。 到目前为止,我已经尝试为矩形和图像设置不同的不透明度,但失败了。我查了一下,没有直
我正在尝试开始使用 konva、react-konva 构建 React 应用程序。 我构建了一个基本的 React 组件: import React, { Component } from "rea
我想拖动 Konva 图层,即使它是空的。我发现我只能拖动对象所在的图层(代码显示您可以拖动矩形所在的位置,但不能拖动其他位置)。 如何拖动图层拖动空部分? 此外,我发现如果您不在图层的对象之外,则
我正在尝试制作一个应用程序,您可以在其中绘制自定义矩形形状对象,并能够同时拖动舞台。 Konva.js 可以吗? var stage = new Konva.Stage({ container
我是一名优秀的程序员,十分优秀!