首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在React中创建可调整大小的组件

如何在React中创建可调整大小的组件
EN

Stack Overflow用户
提问于 2020-03-21 11:23:44
回答 1查看 2.1K关注 0票数 1

就像标题里说的。我想要创建一个React组件,这样我就可以通过拖动来调整宽度-就像windows操作系统中的窗口一样。处理这个问题的最佳方法实际上是什么?

编辑

我把我目前处理这一问题的方法包括在内:

首先,我在容器的右上角放置了一个"dragger“元素。当我按下该元素上的鼠标时,我希望创建一个mousemove事件侦听器,它将修改光标相对于容器边缘的初始X位置的X坐标的containerWidth。我已经让事件侦听器在按住鼠标按钮后向我发送并记录坐标,但不幸的是,由于某种原因,事件在鼠标未按下(mouseUp事件)后没有被移除,这不是我想要的。任何值得赞赏的建议,也是那些关于一些问题,我可能期待在未来与这个议题有关。谢谢。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Props = MasterProps & LinkStateToProps & LinkDispatchToProps;
const Test3 = (Props: Props) => {

  const [containerWidth, setContainerWidth] = React.useState(640)
  const [isBeingStretched, setIsBeingStretched] = React.useState(false);
  const masterRef = React.useRef(null);


  const logMousePosition = React.useCallback((event:MouseEvent)=>{
    console.log(event.clientX);
  },[])


  const handleMouseDown=()=>{
    document.addEventListener('mousemove', logMousePosition);
    masterRef.current.addEventListener('mouseup', ()=>{
      document.removeEventListener('mouseup', logMousePosition)
    })
  }
  const handleMouseUp = () => { 
    document.removeEventListener('mousemove', logMousePosition);
  }
  return (
    <div className="master-wrapper" ref={masterRef}>
      <div className="stretchable-div" style={{ width: `${containerWidth}px` }}>
        <div className="dragger-wrapper">
          <h2>This is supposed to change width</h2>
          <div className="dragger"
            id="dragger"
            onMouseDown={handleMouseDown}
            onMouseUp={handleMouseUp}/>
        </div>
      </div>

    </div>
  );

}

export default connect(mapStateToProps, mapDispatchToProps)(Test3);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-21 15:25:07

我以前从来没有做过这样的事情,所以我决定试一试,最后用React状态管理来实现它是非常简单的。我明白为什么如果你是新的反应者,你可能不知道从哪里开始,这没关系,尽管在我讨论我的解决方案之前,有两件事要注意:

  1. document.getElementByIddocument.addEventListener这样的语句将不再按预期工作。使用React,您将操作一个虚拟DOM,它将为您更新实际的DOM,您应该尽可能让它这样做。
  2. 使用refs来回避这一事实是错误的做法。他们的行为可能与上面提到的陈述相似,但这不是他们的意图用例。阅读文档ref良好用例的看法。

下面是我演示的JSX部分的样子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return (
    <div className="container" onMouseMove={resizeFrame} onMouseUp={stopResize}>
      <div className="box" style={boxStyle}>
        <button className="dragger" onMouseDown={startResize}>
          Size Me
        </button>
      </div>
    </div>
  );

我们需要三个不同的事件- onMouseDownonMouseMoveonMouseUp -来跟踪调整大小的不同阶段。你自己的代码已经有这么多了。在React中,我们将所有这些声明为元素本身的属性,尽管它们实际上不是行内函数。React将它们添加为后台的事件侦听器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const [drag, setDrag] = useState({
    active: false,
    x: "",
    y: ""
});

const startResize = e => {
    setDrag({
      active: true,
      x: e.clientX,
      y: e.clientY
    });
};

我们将使用一些状态来跟踪正在进行的调整大小。为了避免膨胀并使其更具可读性,我将所有东西浓缩到一个对象中,尽管如果您有依赖于该状态的其他挂钩(如useEffectuseMemo ),则这并不总是理想的。第一个事件只保存用户鼠标的初始x和y位置,并为下一个要引用的事件设置为true。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const [dims, setDims] = useState({
    w: 200,
    h: 200
});

const resizeFrame = e => {
    const { active, x, y } = drag;
    if (active) {
      const xDiff = Math.abs(x - e.clientX);
      const yDiff = Math.abs(y - e.clientY);
      const newW = x > e.clientX ? dims.w - xDiff : dims.w + xDiff;
      const newH = y > e.clientY ? dims.h + yDiff : dims.h - yDiff;

      setDrag({ ...drag, x: e.clientX, y: e.clientY });
      setDims({ w: newW, h: newH });
    }
};

第二种状态将初始化元素,并在其值变化时更新元素的维度。这可以使用您想要的任何度量,尽管它必须与某些CSS属性相关。

resizeFrame函数执行以下操作:

  1. 通过销毁赋值,使drag的属性易于获得。这将使代码更易读,更易于键入。
  2. 检查调整大小是否处于活动状态。onMouseMove会为鼠标移动到相关元素上的每个像素触发,因此我们希望确保它是适当的条件。
  3. 使用Math.abs()作为正整数获取当前鼠标位置和保存的鼠标位置之间的差值。这将使我们不必执行第二轮条件语句。
  4. 根据新的鼠标位置是否大于或小于任何一个轴上的新位置,使用循环语句添加或减去维度之间的差异。
  5. 使用新值设置状态,使用spread运算符...drag的不相关部分保留下来。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const stopResize = e => {
    setDrag({ ...drag, active: false });
};

const boxStyle = {
    width: `${dims.x}px`,
    height: `${dims.y}px`
};

然后,我们简单地将用户完成后拖动状态的活动设置为false。JS样式的对象被传递给元素,状态变量在适当的位置,以便自动处理。

这是完成效果的码箱

这样做的缺点之一是,它基本上要求将mouseMove事件侦听器分配给最大的站点容器,因为在调整大小时,鼠标不会停留在框的范围内。如果您想要拥有具有相同功能的多个元素,那么这可能是一个问题,尽管在良好的状态管理下没有什么是无法解决的。您可能可以对此进行微调,以便鼠标始终停留在拖放元素上,尽管这需要更复杂的实现。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60792300

复制
相关文章
使用DNSStager在DNS中隐藏Payload
DNSStager是一个基于Python开发的开源项目,可以帮助广大研究人员使用DNS来隐藏和传输Payload。
FB客服
2021/09/16
1.1K0
在 Kubernetes 中检查镜像签名
之前连续写了几篇 Shell Operator 的东西,后来又写了一篇 cosign 的介绍,细心的读者可能会猜到,最终我的目的就是会用 Shell Operator 结合 cosign 来检查镜像的签名,以此保障镜像的完整性——是的,这个过程相当容易。
崔秀龙
2021/04/25
1.2K0
在 Kubernetes 中检查镜像签名
之前连续写了几篇 Shell Operator 的东西,后来又写了一篇 cosign 的介绍,细心的读者可能会猜到,最终我的目的就是会用 Shell Operator 结合 cosign 来检查镜像的签名,以此保障镜像的完整性——是的,这个过程相当容易。
CNCF
2021/05/07
9310
在CRI运行中验证容器镜像签名
Kubernetes社区自v1.24版本开始对其基于容器镜像的工件进行签名。随着v1.26版本中相应增强功能从alpha版本升级为beta版本,引入了对二进制工件的签名。其他项目也采用了这种方法,为其发布提供了镜像签名。这意味着它们可以在自己的CI/CD流水线中创建签名,例如使用GitHub Actions,或者依靠Kubernetes镜像推广流程通过向k/k8s.io存储库提交拉取请求来自动签名镜像。使用此流程的要求是项目必须是kubernetes或kubernetes-sigs GitHub组织的一部分,以便利用社区基础设施将镜像推送到暂存存储桶中。
灵雀云
2023/08/09
4490
在CRI运行中验证容器镜像签名
在 Python 中隐藏和加密密码?
在当前的数字时代,安全至关重要。在我们作为开发人员的工作中,我们经常处理密码等机密数据。必须使用正确的密码加密和隐藏方法来保护这些敏感数据。Python 中许多可访问的技术和模块可以帮助我们实现这一目标。通过对可用实现的基本思想和示例的解释,本文研究了在 Python 中隐藏和加密密码的最佳技术和方法。
很酷的站长
2023/08/11
5980
在 Python 中隐藏和加密密码?
iOS地图----MapKit框架
1.MapKit框架使用前提 ①导入框架 ②导入主头文件 #import <MapKit/MapKit.h> ③MapKit框架使用须知 MapKit框架中所有数据类型的前缀都是MK MapKit有一
用户1941540
2018/05/11
1.5K0
在IPA中重签名iOS应用程序
当我们在对iOS应用程序执行黑盒安全测试时,我们一般只能从AppStore来访问和获取iOS应用程序。但是在大多数情况下,客户都会给我们提供一个IPA文件。在黑盒测试过程中,我们无法访问目标应用的源代码,因此通过Xcode将其部署到设备并进行测试,几乎是不可能的。但是有一种可行的解决方案,即使用我们手头上的配置文件来重新启动应用程序,并将其部署到我们的测试设备上。
FB客服
2020/03/10
2.4K0
如何在使用 Flutter时切换应用时隐藏应用预览
如果您要显示敏感数据,例如。钱包金额,或者只是当登录表单显示插入的密码清晰时(想想眼睛图标..),当您不在应用程序中时,您必须隐藏敏感数据。
徐建国
2022/06/24
2.2K0
如何在使用 Flutter时切换应用时隐藏应用预览
如何使用MrKaplan在红队活动中隐藏和清理代码执行痕迹
关于MrKaplan  MrKaplan是一款功能强大的红队安全研究工具,该工具可以帮助广大红队研究人员清理和隐藏活动中的代码执行痕迹。该工具可以通过保存文件运行时间、存储文件快照等信息来辅助红队活动,并将所有的取证信息与相关用户关联起来。  功能介绍  1、关闭系统事件日志记录功能; 2、清理文件和代码组件; 3、清理注册表; 4、支持多用户运行; 5、支持以普通用户或管理员身份运行(建议以管理员权限运行); 6、支持保存文件时间戳; 7、支持排除指定操作,并将组件留给蓝队人员。  工具下载  该工具本质
FB客服
2023/03/30
1.8K0
如何使用MrKaplan在红队活动中隐藏和清理代码执行痕迹
PowerShell:在 Windows 中创建并导出自签名证书
证书是一种包含公钥和一些识别信息的文件。在PKI中,证书是由可信任的第三方(称为证书颁发机构,CA)颁发的,CA证明了证书持有者的身份以及与之关联的公钥。然而,我们也可以创建自签名证书,即由证书持有者自己(而不是CA)签名的证书。
运维开发王义杰
2023/08/10
2.4K0
PowerShell:在 Windows 中创建并导出自签名证书
如何使用 SwiftUI 中新地图框架 MapKit
了解 iOS 17 中的 MapKit 后,我们会发现 Apple 引入了更适合 SwiftUI 的 API。
Swift社区
2023/09/06
7390
如何使用 SwiftUI 中新地图框架 MapKit
干货|使用Go语言在图片中隐藏Shellcode
该项目是用 Go 语言编写的免杀项目,可以将生成的 Shellcode 隐藏进图片中,然后让目标主机进行远程加载调用。
HACK学习
2021/09/29
1.2K0
在使用Vue2.0中使用axios库时,遇到415错误
解决办法:在axios的第三个参数config中,设置请求头信息'Content-Type': 'application/json;charset=UTF-8'
Arebirth
2020/06/19
3.4K0
分享 8 种在 CSS 中隐藏元素的方法
作为 Web 开发人员,我们经常遇到需要隐藏网页上的元素的情况。在本文中,我们将分享8 种在 CSS 中隐藏元素的方法,每种方法都有优点和注意事项。
前端达人
2023/08/31
3310
分享 8 种在 CSS 中隐藏元素的方法
代码签名证书怎么写?签名证书制作时需要注意什么?
软件开发在现代已经成为了一件很多人都可以完成的工作,而为了让自己书写的代码不会受到恶意的篡改,很多用户都习惯在所开发的软件中加入代码签名证书,那么代码签名证书怎么写?签名证书制作时需要注意什么问题呢?
用户8715145
2021/11/12
5350
如何使用 Python 隐藏图像中的数据
秘密数据可以是任何格式的数据,如文本甚至文件。简而言之,隐写术的主要目的是隐藏任何文件(通常是图像、音频或视频)中的预期信息,而不实际改变文件的外观,即文件外观看起来和以前一样。
小白学视觉
2022/02/14
4K0
如何使用 Python 隐藏图像中的数据
实现滚动时Header自动隐藏
这是掘金网页版的头部,当滚动条向下滑动时,主header会隐藏,次级header会吸在页面顶部。
戴兜
2023/03/11
2.4K0
实现滚动时Header自动隐藏
如何使用mimic在LInux中以普通用户身份来隐藏进程
mimic是一款针对进程隐藏的安全工具,在该工具的帮助下,广大研究人员可以通过普通用户身份来在Linux操作系统(x86_64)上隐藏某个进程的执行。
FB客服
2023/08/08
4520
如何使用mimic在LInux中以普通用户身份来隐藏进程
点击加载更多

相似问题

将键数组映射到值数组

13

将键值数组映射到值数组

10

将数组对象值映射到新数组

36

如何将数组值映射到另一个数组值

10

将空值映射到数组

51
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文