当前位置: 首页 > news >正文

react使用拖拽,缩放组件,采用react-rnd解决

项目中需求,要求给商品图片添加促销标签,并且可拉伸大小,和拖拽位置
最后选择用react-rnd来实现
话不多说,直接上代码!!!

1.在项目根目录下执行以下代码,引入react-rnd

yarn add react-rnd

2.在项目中直接引用,以下是最简单的示例

import React, { Component } from 'react';
import { Rnd } from 'react-rnd';

interface State {
    /**
     * 正在操作中
     */
    isDragging: boolean;
    /**
     * 拉伸大小
     */
    size: {
        width: number;
        height: number;
    };
    /**
     * 位置
     */
    position: {
        x: number;
        y: number;
    };
}
export class ProductMainImageWatermarkRulePreview extends Component<unknown, State> {
    constructor(props: any) {
        super(props);
        this.state = {
            isDragging: false,
            size: {
                width: 100,
                height: 100,
            },
            position: {
                x: 0,
                y: 0,
            },
        };
    }
    handleDragStart = () => {
        this.setState({
            isDragging: true,
        });
    };
    handleDragStop = (e: any, d: any) => {
        this.setState({
            isDragging: false,
            position: {
                x: d.x,
                y: d.y,
            },
        });
    };
    handleResizeStart = () => {
        this.setState({
            isDragging: true,
        });
    };
    handleResizeStop = (e: any, direction: any, ref: any, delta: any, position: any) => {
        this.setState({
            isDragging: false,
            size: {
                width: ref.style.width,
                height: ref.style.height,
            },
            position: position,
        });
    };
    render() {
        const { position, isDragging, size } = this.state;
        return (
            <div style={{ width: 375, height: 375, backgroundColor: 'gray' }}>
                <Rnd
                    // default={{ x: position.x, y: position.y, width: size.width, height: size.height }}
                    // minHeight={1}
                    // maxHeight={375}
                    // minWidth={1}
                    // maxWidth={375}
                    size={size}
                    position={position}
                    bounds="parent"
                    onDragStart={this.handleDragStart}
                    onDragStop={this.handleDragStop}
                    onResizeStart={this.handleResizeStart}
                    onResizeStop={this.handleResizeStop}
                    resizeParentMore={true} // 如果需要阻止父容器跟随大小变化,可以设置为false
                    enableResizing={{
                        top: true,
                        right: true,
                        bottom: true,
                        left: true,
                        topRight: true,
                        bottomRight: true,
                        bottomLeft: true,
                        topLeft: true,
                    }}
                    resizeHandles={['se', 'sw', 'ne', 'nw']}
                    style={{ opacity: isDragging ? 0.8 : 1 }}
                    onClick={(e: any) => e.stopPropagation()}
                >
                    <div>
                        <img
                            src="https://b-puzhehei-cdn.co-mall.net/global/magic-backend/invitation-activity/button-picture.png"
                            alt=""
                            style={{ width: '100%', height: '100%' }}
                        />
                    </div>
                </Rnd>
            </div>
        );
    }
}

实现效果如下
在这里插入图片描述

还有一些属性,罗列出来,希望对大家有帮助~

default: { x: number; y: number; width?: number | string; height?: number | string;};                设定默认的一些属性,如初始坐标和宽高
size?: { width: (number | string), height: (number | string) };  组件的大小,即宽度与高度
position?: { x: number, y: number };  组件的坐标,即横坐标与纵坐标
resizeGrid?: [number, number];   重置大小时的增量,默认为[1, 1]
dragGrid?: [number, number];    拖拽时的增量,默认为[1, 1]
lockAspectRatio?: boolean | number;    锁定纵横比,可设置为布尔值或数字值,当设置为true时,组件会锁定纵横比,并且该值为组件初始宽高的比值;而设置为数字时,组件调整大小时会以该值作为纵横比来调整
enableResizing?: ?Enable   用以设置是否可调整大小,可从组件各个方向上或整体来设置:
disableDragging?: boolean;     是否禁用拖拽
dragAxis?: 'x' | 'y' | 'both' | 'none'    设置组件的拖拽方向
bounds?: string;    组件的边界:可设置为父组件的名称或者window、body或者一个选择器的名称(需要带上符号. or #)

方法

onResizeStart?: RndResizeStartCallback; // 开始调整大小时调用

onResize?: RndResizeCallback; // 组件调整大小时调用

onResizeStop?: RndResizeCallback; // 组件停止调整大小时调用

onDragStart: DraggableEventHandler; // 组件开始拖拽时调用

onDrag: DraggableEventHandler; // 组件拖拽时调用

onDragStop: DraggableEventHandler; // 组件停止拖拽时调用
http://www.dtcms.com/a/35357.html

相关文章:

  • instanceof和typeof的区别【JavaScript常见面试题】
  • 跨境宠物摄像头是一种专为宠物主人设计的智能设备
  • OpenCV计算摄影学(1)图像修复(Inpainting)的函数inpaint()
  • 【若依框架】代码生成详细教程,15分钟搭建Springboot+Vue3前后端分离项目,基于Mysql8数据库和Redis5,管理后台前端基于Vue3和Element Plus,开发小程序数据后台
  • P5304 [GXOI/GZOI2019] 旅行者
  • 嵌入式项目:STM32刷卡指纹智能门禁系统
  • ShardingSphere--02--数据分片
  • 基于嵌入式linux的数据库:SQLite
  • 分片机制如何理解?
  • Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果
  • 统计学中的得分函数(Score Function)是什么?它和Fisher信息矩阵有什么关系?
  • Golang笔记——Interface类型
  • JavaScript获取DOM元素语法总结(getElementsByName()、querySelector()、querySelectorAll())
  • 网络安全漏洞管理要求 网络安全产品漏洞
  • OC高级编程之GCD
  • C语言数据结构—二叉树的链式结构实现
  • 【ECMAScript6】
  • 【知识】PyTorch中不同优化器的特点和使用
  • Visual Whole-Body for Loco-Manipulation论文复现
  • hab 通信
  • 爬虫基础入门之爬取豆瓣电影Top250-Re正则的使用
  • 另外一个用于测试内存屏障差异的 C 语言示例程序(自己测试)
  • springboot集成jackson-dataformat-xml实现发送XML请求和XML响应参数处理
  • docker离线安装记录
  • 人工智能基础知识笔记一:核函数
  • 使用 BFS 解决 最短路问题
  • springboot005学生心理咨询评估系统(源码+数据库+文档)
  • Xinference和ollama有什么区别
  • 【CSS】HTML元素布局基础总结
  • 沁恒CH32V307RCT6烧写hex文件时报错“设置芯片型号失败”