我的编程空间,编程开发者的网络收藏夹
学习永远不晚

react怎么改变组件大小

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

react怎么改变组件大小

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怎么改变组件大小的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

react怎么改变组件大小

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

react怎么改变组件大小

react改变组件大小的方法:1、使用“React.cloneElement”加强包裹组件;2、在包裹的组件设置绝对定位,并在组件内加上四个可调整大小的拖动条;3、点击拖动条并进行拖动即会改变DragBox的大小。
2023-05-14

react如何改变组件大小

这篇文章主要讲解了“react如何改变组件大小”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react如何改变组件大小”吧!react改变组件大小的方法:1、使用“React.cloneEl
2023-07-04

gridlayout怎么改变组件大小

要改变组件的大小,您可以使用`setPreferredSize(Dimension)`方法来设置组件的首选大小。以下是一个示例代码:```import java.awt.Dimension;import java.awt.GridLayou
2023-10-09

react怎么改变组件状态

在react中,可以利用setState()来修改组件的状态。setState()是用于更新组件状态state的方法,该方法可以对组件state的更改排入队列,也可获取最新的状态,语法为“this.setState( { 要修改的部分数据 } )”。
2023-05-14

react如何改变组件状态

这篇文章主要介绍“react如何改变组件状态”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react如何改变组件状态”文章能帮助大家解决问题。在react中,可以利用setState()来修改组件的
2023-07-04

c#怎么改变label的大小

在 c# 中更改标签大小:设置其大小属性,步骤包括:定位标签控件,指定新大小,然后更新标签显示(例如,使用 invalidate() 方法)。此外,还可以使用 anchor、dock 和 autosize 属性控制标签大小,分别用于自动调整
c#怎么改变label的大小
2024-05-11

jquery元素大小改变事件

随着互联网技术的发展,页面效果越来越被用户所关注。在一个Web页面中,元素的大小改变是出现频率较高的一种场景。例如,当我们需要动态改变某个元素的大小时,页面应该做出响应。在这种情况下,JQuery元素大小改变事件就成为了我们所需要掌握的一种技术。在这篇文章中,我们将学习如何使用JQuery元素大小改变事件。一、什么是JQuery元素大小改变事件JQuery元素大小改变事件,也称
2023-05-24

qt子控件随父控件大小改变怎么实现

要实现子控件随父控件大小改变,可以使用Qt的布局管理器(Layout)来实现。布局管理器可以自动调整子控件的大小和位置,使其适应父控件的大小变化。以下是一种常见的实现方法:1. 在父控件的构造函数中,使用布局管理器创建一个布局对象,例如QH
2023-10-18

react怎么改变数组中的某个元素

react改变数组中的某个元素的方法:1、查看父组件App和子组件ToDoList;2、在子组件中循环展示来自父组件的数组ToDoList,并且让两个按钮取到对应的数组元素id;3、通过子组件传过来的id修改对应数组元素的completed值即可。
2023-05-14

怎么在html中改变字体大小

这篇文章给大家介绍怎么在html中改变字体大小,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。html是什么html的全称为超文本标记语言,它是一种标记语言,包含了一系列标签.通过这些标签可以将网络上的文档格式统一,使分
2023-06-14

react怎么改变css样式

react改变css样式的方法:1、动态添加class,代码如“handleshow() {this.setState({display:true})}...”;2、动态添加一个style,代码如“class Demo extends Component{...}”。
2023-05-14

react 怎么改变css样式

react改变css样式的方法:1、动态添加一个class来改变样式,代码如“<p className={this.state.display?"active":"active1"}></p>”;2、动态添加一个style来改变样式,代码如“<p style={display2}></p>”。
2023-05-14

pdf文件怎么修改大小

这篇文章主要介绍“pdf文件怎么修改大小”,在日常操作中,相信很多人在pdf文件怎么修改大小问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”pdf文件怎么修改大小”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-06-04

css怎么改变按钮的字体大小

这篇文章主要介绍“css怎么改变按钮的字体大小”,在日常操作中,相信很多人在css怎么改变按钮的字体大小问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css怎么改变按钮的字体大小”的疑惑有所帮助!接下来,请跟
2023-07-04

visio图形大小改变不了怎么解决

如果你无法改变 Visio 图形的大小,可能有几个可能的原因和解决方法:1. 图形已被锁定: 检查图形是否被设置为"锁定"。在 Visio 中,你可以选择解锁图形,然后再尝试改变其大小。2. 图形处于组合状态: 如果图形是多个图形组合而成的
2023-09-14

编程热搜

目录