【发布时间】:2020-04-18 16:12:15
【问题描述】:
我目前正在尝试在购物网站内的图片上显示可编辑区域。
我们的目标是使用 React 制作带有可以移动和调整大小的框的图片。
我一直在关注 youtube 上的 javascript 教程,但这并没有像我预期的那样运行。
下面是我正在使用的代码:
import React, { useState } from "react";
import axios from "axios";
import Delete from "../Buttons/Delete";
import Picture from "../Picture/Picture";
function EditableImageUploader(props){
const [ loading, setLoading ] = useState(false);
const editableArea = document.querySelector(".editableArea");
const pictureEdit = document.querySelector(".pictureEdit");
const uploadImage = async e => {
const files = e.target.files
const data = new FormData()
data.append('file', files[0])
data.append('upload_preset', 'charlotte-co')
setLoading(true)
axios.post('https://api.cloudinary.com/v1_1/charlotte-co/image/upload', data)
.then(res => {
setLoading(false);
props.setImages([...props.images, res.data]);
})
.catch(err =>console.log(err));
}
function moveDiv(e){
window.addEventListener("mousemove", mouseMove);
window.addEventListener("mouseup", mouseRelease);
let prevX = e.clientX;
let prevY = e.clientY;
function mouseMove(e){
let newX = prevX - e.clientX;
let newY = prevY - e.clientY;
console.log(prevY)
console.log(`Y = ${e.clientY}`)
console.log(prevX)
console.log(`X = ${e.clientX}`)
const rect = editableArea.getBoundingClientRect()
editableArea.style.left = (rect.left - newX) + "px";
editableArea.style.top = (rect.top - newY) + "px";
}
function mouseRelease(){
window.removeEventListener("mousemove", mouseMove);
window.removeEventListener("mouseup", mouseRelease);
prevX = e.clientX;
prevY = e.clientY;
}
}
return(<>
<div className="image-uploader">
{(props.images)?"":(<input
type="file"
name="file"
placeholder="Upload a File"
className="uploader"
onChange={uploadImage}
/>)}
<div>
{loading ? (
<h4>loading...</h4>
):""}
{(props.images)?(
props.images.map(image => {
return (<>
<Delete
delete={image.public_id}
deleteFrom={props.images}
setDeleteFrom={props.setImages}
/>
{
} <Picture
className="pictureEdit"
publicId={image.public_id}
version={image.version}
width="300"
quality="100"
/>
<div
className="editableArea"
onMouseDown={(e)=> moveDiv(e)}
>
<div className="resizer north"></div>
<div className="resizer west"></div>
<div className="resizer south"></div>
<div className="resizer east"></div>
The transfer will spread across this box.
</div>
</>)
})
):(<p>No blank image available currently. Upload one to make this option available.</p>)}
</div>
</div>
</>)
}
export default EditableImageUploader;
这里是相关的 CSS:
.editableArea{
position: absolute;
background-color: green;
height: 150px;
width: 150px;
border-style: solid;
border-color: black;
border-width: 5px;
z-index: 5;
cursor: move;
}
它将允许您移动 div 并更改其位置,但它会将其移动到远离原来位置的位置。
我似乎认为这也是由于页面滚动的位置,但我非常不确定为什么它会以这种方式做出反应。
当控制台读取时:
653
Y = 653
325
X = 367
可编辑区域的实际位置在:
left: 1005.55px;
top: -12346.8px;
任何帮助和/或解释这是如何以及为什么以它的方式运行以及如何解决这个问题将不胜感激。
【问题讨论】:
标签: javascript reactjs draggable