返回顶部
首页 > 资讯 > 前端开发 > 其他 >react怎么改变组件大小
  • 134
分享到

react怎么改变组件大小

组件React 2023-05-14 21:05:54 134人浏览 薄情痞子
摘要

本教程操作环境:windows10系统、React18版、Dell G3电脑。react怎么改变组件大小?手写一个React拖拽调整大小的组件一、实现流程1.使用React.cloneElement加强包裹组件,在包裹的组件设置绝对定位,并

react怎么改变组件大小

教程操作环境:windows10系统、React18版、Dell G3电脑。

react怎么改变组件大小?

手写一个React拖拽调整大小的组件

一、实现流程

1.使用React.cloneElement加强包裹组件,在包裹的组件设置绝对定位,并在组件内加上四个可调整大小的拖动条,在点击拖动条并进行拖动时会改变DragBox的大小,如下:

38d50d03b238f53e439b17146e4b62c.jpg

2.使用:

<DragBox dragAble={true} minWidth={350} minHeight={184} edgeDistance={[10, 10, 10, 10]} draGCallback={this.dragCallback} >
{}
   <div style={{ top: 100 + 'px', left: 100 + 'px', width: 350, height: 184, backgroundColor: "white" }}>
        <div style={{ backgroundColor: "yellow", width: "100%", height: 30 }}></div>
        <div style={{ backgroundColor: "green", width: "100%", height: 30 }}></div>
        <div style={{ backgroundColor: "blue", width: "100%", height: 30 }}></div>
    </div>
</DragBox>

二、代码

DragBox组件

import React, { Component, Fragment } from 'react';
import styles from "./DragBox.less";

class DragBox extends Component {
    constructor(props) {
        super(props);
        // 父组件盒子
        this.containerRef = React.createRef();
        // 是否开启尺寸修改
        this.reSizeAble = false;
        // 鼠标按下时的坐标,并在修改尺寸时保存上一个鼠标的位置
        this.clientX, this.clientY;
        // 鼠标按下时的位置,使用n、s、w、e表示
        this.direction = "";
        // 拖拽盒子里浏览器上下左右边缘的距离,如果小于这个距离就不会再进行调整宽高
        this.edgeTopDistance = props.edgeDistance[0] || 10;
        this.edgeBottomDistance = props.edgeDistance[1] || 10;
        this.edgeLeftDistance = props.edgeDistance[2] || 10;
        this.edgeRightDistance = props.edgeDistance[3] || 10;
    }
    componentDidMount(){
        // body监听移动事件
        document.body.addEventListener('mousemove', this.move);
        // 鼠标松开事件
        document.body.addEventListener('mouseup', this.up);
    }
    
    clearEventListener() {
        document.body.removeEventListener('mousemove', this.move);
        document.body.removeEventListener('mouseup', this.up);
    }
    componentWillUnmount() {
        this.clearEventListener();
    }
    
    up = () => {
        this.reSizeAble = false;
        this.direction = "";
    }
    
    down = (e, direction) => {
        this.direction = direction;
        this.reSizeAble = true;
        this.clientX = e.clientX;
        this.clientY = e.clientY;
    }
    
    changeLeftAndTop = (event, changeLeft, changeTop, delta) => {
        let ww = document.documentElement.clientWidth;
        let wh = window.innerHeight;
        if (event.clientY < 0 || event.clientX < 0 || event.clientY > wh || event.clientX > ww) {
            return false;
        }
        if (changeLeft) { 
            this.containerRef.current.style.left = Math.max(this.containerRef.current.offsetLeft + delta, this.edgeLeftDistance) + 'px'; 
        }
        if (changeTop) { 
            this.containerRef.current.style.top = Math.max(this.containerRef.current.offsetTop + delta, this.edgeTopDistance) + 'px'; 
        }
    }
    
    move = (e) => {
        // 当开启尺寸修改时,鼠标移动会修改div尺寸
        if (this.reSizeAble) {
            let finalValue;
            // 鼠标按下的位置在上部,修改高度
            if (this.direction === "top") {
                // 1.距离上边缘10 不修改
                // 2.因为按着顶部修改高度会修改top、height,所以需要判断e.clientY是否在offsetTop和this.clientY之间(此时说明处于往上移动且鼠标位置在盒子上边缘之下),不应该移动和调整盒子宽高
                if (e.clientY <= this.edgeTopDistance || (this.containerRef.current.offsetTop < e.clientY && e.clientY  < this.clientY)){ 
                    this.clientY = e.clientY;
                    return; 
                }
                finalValue = Math.max(this.props.minHeight, this.containerRef.current.offsetHeight + (this.clientY - e.clientY));
                // 移动的距离,如果移动的距离不为0需要调整高度和top
                let delta = this.containerRef.current.offsetHeight - finalValue;
                if(delta !== 0){
                    this.changeLeftAndTop(e, false, true, delta); 
                    this.containerRef.current.style.height = finalValue + "px";
                }
                this.clientY = e.clientY;
            } else if (this.direction === "bottom") {// 鼠标按下的位置在底部,修改高度
                // 1.距离下边缘10 不修改
                // 2.判断e.clientY是否处于往下移动且鼠标位置在盒子下边缘之上,不应该调整盒子宽高
                if (window.innerHeight - e.clientY <= this.edgeBottomDistance || (this.containerRef.current.offsetTop + this.containerRef.current.offsetHeight > e.clientY && e.clientY  > this.clientY)) { 
                    this.clientY = e.clientY;
                    return; 
                }
                finalValue = Math.max(this.props.minHeight, this.containerRef.current.offsetHeight + (e.clientY - this.clientY));
                this.containerRef.current.style.height = finalValue + "px";
                this.clientY = e.clientY;
            } else if (this.direction === "right") { // 鼠标按下的位置在右边,修改宽度 
                // 1.距离右边缘10 不修改
                // 2.判断e.clientY是否处于往右移动且鼠标位置在盒子右边缘之左,不应该调整盒子宽高
                if (document.documentElement.clientWidth - e.clientX <= this.edgeRightDistance || (this.containerRef.current.offsetLeft + this.containerRef.current.offsetWidth > e.clientX && e.clientX  > this.clientX)) { 
                    this.clientX = e.clientX;
                    return;
                }
                // 最小为UI设计this.props.minWidth,最大为 改边距离屏幕边缘-10,其他同此
                let value = this.containerRef.current.offsetWidth + (e.clientX - this.clientX);
                finalValue = step(value, this.props.minWidth, document.body.clientWidth - this.edgeRightDistance - this.containerRef.current.offsetLeft);
                this.containerRef.current.style.width = finalValue + "px";
                this.clientX = e.clientX;
            } else if (this.direction === "left") {// 鼠标按下的位置在左边,修改宽度
                // 1.距离左边缘10 不修改
                // 2.因为按着顶部修改高度会修改left、height,所以需要判断e.clientY是否在offsetLeft和this.clientY之间(此时说明处于往左移动且鼠标位置在盒子左边缘之左),不应该移动和调整盒子宽高
                if (e.clientX <= this.edgeLeftDistance || (this.containerRef.current.offsetLeft < e.clientX && e.clientX  < this.clientX)) { 
                    this.clientX = e.clientX;
                    return; 
                }
                let value = this.containerRef.current.offsetWidth + (this.clientX - e.clientX);
                finalValue = step(value, this.props.minWidth, this.containerRef.current.offsetWidth - this.edgeLeftDistance + this.containerRef.current.offsetLeft);
                // 移动的距离,如果移动的距离不为0需要调整宽度和left
                let delta = this.containerRef.current.offsetWidth - finalValue;
                if(delta !== 0){
                    // 需要修改位置,直接修改宽度只会向右增加
                    this.changeLeftAndTop(e, true, false, delta); 
                    this.containerRef.current.style.width = finalValue + "px";
                }
                this.clientX = e.clientX;
            }
            this.props.dragCallback && this.props.dragCallback(this.direction, finalValue);
        }
    }
    render() {
        // 四个红色盒子 用于鼠标移动到上面按下进行拖动
        const children = (
            <Fragment key={"alphaBar"}>
                <div key={1} className={styles.alphaTopBar} onMouseDown={(e) => this.down(e, "top")}></div>
                <div key={2} className={styles.alphaBottomBar} onMouseDown={(e) => this.down(e, "bottom")}></div>
                <div key={3} className={styles.alphaLeftBar} onMouseDown={(e) => this.down(e, "left")}></div>
                <div key={4} className={styles.alphaRightBar} onMouseDown={(e) => this.down(e, "right")}></div>
            </Fragment>
        );
        // 给传进来的children进行加强:添加position:"absolute",添加四个用于拖动的透明盒子
        const childrenProps = this.props.children.props;
        const cloneReactElement = React.cloneElement(
            this.props.children,
            {
                style: {
                    // 复用原来的样式
                    ...childrenProps.style,
                    // 添加position:"absolute"
                    position: "absolute"
                },
                ref: this.containerRef
            },
            // 复用children,添加四个用于拖动的红色盒子
            [childrenProps.children, children]
        );
        return (
            <Fragment>
                {
                    cloneReactElement
                }
            </Fragment>
        );
    }
}

function step(value, min, max) {
    if (value < min) {
        return min;
    } else if (value > max) {
        return max;
    } else {
        return value;
    }
}
export default DragBox;

DragBox组件拖动条的样式

  .alphaTopBar{
    position: absolute;
    width: 100%;
    height: 8px;
    top: -5px;
    left: 0;
    background-color: red;
    cursor: row-resize;
  }
  .alphaBottomBar{
    position: absolute;
    width: 100%;
    height: 8px;
    bottom: -5px;
    left: 0;
    background-color: red;
    cursor: row-resize;
  }
  .alphaLeftBar{
    position: absolute;
    width: 8px;
    height: 100%;
    top: 0;
    left: -5px;
    background-color: red;
    cursor: col-resize;
  }
  .alphaRightBar{
    position: absolute;
    width: 8px;
    height: 100%;
    top: 0;
    right: -5px;
    background-color: red;
    cursor: col-resize;
  }

以上就是react怎么改变组件大小的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: react怎么改变组件大小

本文链接: https://lsjlt.com/news/206059.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • react怎么改变组件大小
    本教程操作环境:Windows10系统、react18版、Dell G3电脑。react怎么改变组件大小?手写一个React拖拽调整大小的组件一、实现流程1.使用React.cloneElement加强包裹组件,在包裹的组件设置绝对定位,并...
    99+
    2023-05-14
    组件 React
  • react如何改变组件大小
    这篇文章主要讲解了“react如何改变组件大小”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react如何改变组件大小”吧!react改变组件大小的方法:1、使用“React.cloneEl...
    99+
    2023-07-04
  • gridlayout怎么改变组件大小
    要改变组件的大小,您可以使用`setPreferredSize(Dimension)`方法来设置组件的首选大小。以下是一个示例代码:...
    99+
    2023-10-09
    gridlayout
  • react怎么改变组件状态
    本教程操作环境:Windows7系统、react18版、Dell G3电脑。一、有状态组件和无状态组件1.先理解一下什么是状态:定义:是用来描述事物在某一时刻的形态的数据 , 一般称为state。(可以简单理解为状态就是数据)例如:9月2...
    99+
    2023-05-14
    组件状态 前端 React.js
  • react如何改变组件状态
    这篇文章主要介绍“react如何改变组件状态”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react如何改变组件状态”文章能帮助大家解决问题。在react中,可以利用setState()来修改组件的...
    99+
    2023-07-04
  • div大小怎么改变设置
    本文小编为大家详细介绍“div大小怎么改变设置”,内容详细,步骤清晰,细节处理妥当,希望这篇“div大小怎么改变设置”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先我们要知道D...
    99+
    2024-04-02
  • c#怎么改变label的大小
    在 c# 中更改标签大小:设置其大小属性,步骤包括:定位标签控件,指定新大小,然后更新标签显示(例如,使用 invalidate() 方法)。此外,还可以使用 anchor、dock 和...
    99+
    2024-05-11
    c#
  • React拖拽调整大小的组件
    本文实例为大家分享了React拖拽调整大小的组件,供大家参考,具体内容如下 一、实现流程 1.使用React.cloneElement加强包裹组件,在包裹的组件设置绝对定位,并在组件...
    99+
    2024-04-02
  • jquery元素大小改变事件
    随着互联网技术的发展,页面效果越来越被用户所关注。在一个Web页面中,元素的大小改变是出现频率较高的一种场景。例如,当我们需要动态改变某个元素的大小时,页面应该做出响应。在这种情况下,JQuery元素大小改变事件就成为了我们所需要掌握的一种...
    99+
    2023-05-24
  • qt子控件随父控件大小改变怎么实现
    要实现子控件随父控件大小改变,可以使用Qt的布局管理器(Layout)来实现。布局管理器可以自动调整子控件的大小和位置,使其适应父控...
    99+
    2023-10-18
    qt
  • react怎么改变数组中的某个元素
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react怎么改变数组中的某个元素?怎么通过id更改对应的数组元素React 通过 id 更改对应的数组元素:1.此处有两个组件,父组件App,子组件To...
    99+
    2023-05-14
    React
  • python怎么改变文件夹中所有图片大小
    python改变文件夹中所有图片大小的方法:1、在python脚本中导入os模块;2、定义图片相关参数;3、使用os.listdir()函数读取文件夹;4、设置从图片中心截取大小;5、遍历文件夹所有图片即可。具体操作方法:首先需要在pyth...
    99+
    2024-04-02
  • css怎么改变背景图片大小
    这篇文章主要介绍css怎么改变背景图片大小,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 在css中,可以使用background-size属性来改变背景...
    99+
    2024-04-02
  • 怎么在html中改变字体大小
    这篇文章给大家介绍怎么在html中改变字体大小,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。html是什么html的全称为超文本标记语言,它是一种标记语言,包含了一系列标签.通过这些标签可以将网络上的文档格式统一,使分...
    99+
    2023-06-14
  • react怎么改变css样式
    本教程操作环境:Windows10系统、react18版、Dell G3电脑。react怎么改变css样式??react的两种动态改变css样式的方法第一种:动态添加class,以点击按钮让文字显示隐藏为demoimport React, ...
    99+
    2023-05-14
    css React
  • react 怎么改变css样式
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react 怎么改变css样式?react的两种动态改变css样式的方法第一种:动态添加class,以点击按钮让文字显示隐藏为demoimport Rea...
    99+
    2023-05-14
    css React
  • nodejs改变图片大小
    Node.js是一种流行的的JavaScript编程语言,它具有极高的灵活性和实用性,而且可以用于在后端开发不同种类的应用程序。其中一个通用的应用程序是在线图片库和图片编辑器。在这种情况下,动态地改变图片大小或缩放图像是一种非常常见的任务。...
    99+
    2023-05-16
  • pdf文件怎么修改大小
    这篇文章主要介绍“pdf文件怎么修改大小”,在日常操作中,相信很多人在pdf文件怎么修改大小问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”pdf文件怎么修改大小”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-04
  • css怎么改变按钮的字体大小
    这篇文章主要介绍“css怎么改变按钮的字体大小”,在日常操作中,相信很多人在css怎么改变按钮的字体大小问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css怎么改变按钮的字体大小”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-04
  • React组件怎么转Vue组件
    本篇内容主要讲解“React组件怎么转Vue组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React组件怎么转Vue组件”吧!简介对于react-to-vu...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作