国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

封裝React組件DragLine,鼠標(biāo)拖拽的邊框改變元素寬度

這篇具有很好參考價(jià)值的文章主要介紹了封裝React組件DragLine,鼠標(biāo)拖拽的邊框改變元素寬度。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

原文合集地址如下,有需要的朋友可以關(guān)注

本文地址

合集地址

在項(xiàng)目中,設(shè)計(jì)說想做個(gè)面板,其寬度隨鼠標(biāo)拖拽而變化,有最大最小值。基于這個(gè)小功能封裝一個(gè)可拖拽組件,在需要的地方引入即可。

思路

這里只是實(shí)現(xiàn)x方向的拖拽,y軸拖拽思路差不多。
既然是鼠標(biāo)操作,那肯定得監(jiān)聽鼠標(biāo)事件,當(dāng)鼠標(biāo)按下(mouseDown)時(shí),監(jiān)聽mouseMove事件和mouseUp事件,就是鼠標(biāo)移動(dòng)和抬起操作。然后計(jì)算出鼠標(biāo)移動(dòng)的寬度 = 元素現(xiàn)在的x坐標(biāo)(clientX) - 起始坐標(biāo);然后把移動(dòng)的寬度通過onChange函數(shù)返回給父組件,父組件改變自身的寬度。

代碼示例

組件代碼如下:

import React, { useRef, useState, useEffect } from 'react';
interface DragLineProps {
  style?: any; // 自定義樣式
  className?: string; // 樣式類名
  onChange: (width: number, height:number) => void; // 寬高變化函數(shù)
}

const DragLine: React.FC<DragLineProps> = (props) => {
  const {style, className, onChange } = props;
  const containerRef = useRef<HTMLDivElement>(null);
  const [isDragging, setIsDragging] = useState(false);
  const initialMouseX = useRef(0); // 初始x值
  const initialMouseY = useRef(0); // 初始Y值

  useEffect(() => {
    const handleMouseMove = (event: MouseEvent) => {
      if (isDragging && containerRef.current) {
        const deltaX = event.clientX - initialMouseX?.current;
        const deltaY = event.clientY - initialMouseY?.current;
		// 調(diào)用父組件函數(shù),傳回移動(dòng)的寬度或高度
        onChange(deltaX, deltaY)
      }
    };

    const handleMouseUp = () => {
      setIsDragging(false);
    };
	// 添加鼠標(biāo)移動(dòng)和抬起事件
    document.addEventListener('mousemove', handleMouseMove);
    document.addEventListener('mouseup', handleMouseUp);

    return () => {
    // 記得清除監(jiān)聽事件
      document.removeEventListener('mousemove', handleMouseMove);
      document.removeEventListener('mouseup', handleMouseUp);
    };
  }, [isDragging, initialMouseX, initialMouseY, onChange]);

/** 監(jiān)聽鼠標(biāo)按下事件 改變初始值 **/
  const handleMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {
    event.preventDefault();
    setIsDragging(true);
     initialMouseX.current = event.clientX;
     initialMouseY.current =  event.clientY;
  };


  return (
    <div
      ref={containerRef}
      className={className} 
      style={style}
      onMouseDown={handleMouseDown}
    />
  );
 
};

export default DragLine;


使用:
我這里是左側(cè)面板可拖拽寬度,當(dāng)然也可以是右側(cè)面板,如需上下拖動(dòng),可以先定義高度,然后通過子組件調(diào)用handleChange傳回的offsetY操作即可。

import React, { useState } from 'react';
import DragLine from '../../components/DragBox';
import './style.less';
const maxWidth = 300;
const minWidth = 100;
const App: React.FC = () => {
  const [width, setWidth] = useState(200);

  const handleChange = (offsetX: number, offsetY:number) => {
    const current = offsetX+ width;
    const newWidth = current > maxWidth ? maxWidth : current < minWidth ? minWidth : current;
    setWidth(newWidth);
  };

  return (
    <div className='DragWrapperRoot'>
      <div style={{width}} className='dragBox'> 
      	拖拽右側(cè)邊框改變盒子大小
      </div>
      <DragLine onChange={handleChange} className="width-drag" style={{left: width}}/>
    </div>
  );
};

export default App;

less文件:

.DragWrapperRoot{
  position: relative;
  display: flex;
  height: 80%;

  .dragBox{
    position: relative;
    border-right: 1px solid #999;
    height: 100%;
  }
  .width-drag{
    position: absolute; 
    cursor: ew-resize;  // 鼠標(biāo)懸停雙箭頭樣式
    top: 0;
    bottom: 0;
    width: 10px;
    background: transparent;
  }
}

總結(jié)

  1. 創(chuàng)建一個(gè)DragLine組件,接受一個(gè)onChange函數(shù)作為參數(shù),該函數(shù)用于接收拖拽寬度的更新。
  2. 使用useRef鉤子來獲取<div>容器的引用,以便后續(xù)操作。
  3. 使用useState鉤子來追蹤拖拽狀態(tài),通過isDragging變量表示是否正在拖拽。
  4. 使用useEffect鉤子來添加事件監(jiān)聽器,以便在鼠標(biāo)移動(dòng)和釋放的過程中執(zhí)行相應(yīng)的操作。
  5. handleMouseMove回調(diào)函數(shù)中,根據(jù)鼠標(biāo)位置和容器的左邊界計(jì)算新的寬度和高度,并通過onChange函數(shù)將新的寬度傳遞給父組件。
  6. handleMouseUp回調(diào)函數(shù)中,將拖拽狀態(tài)設(shè)置為false,表示拖拽結(jié)束。
  7. handleMouseDown回調(diào)函數(shù)中,將拖拽狀態(tài)設(shè)置為true,表示開始拖拽。
  8. handleMouseDown函數(shù)綁定到容器的onMouseDown事件上,以便在鼠標(biāo)按下時(shí)觸發(fā)拖拽行為。
  9. 在組件的返回部分,使用ref將容器的引用與<div>元素關(guān)聯(lián)起來。
  10. 通過添加適當(dāng)?shù)腃SS樣式,使得容器顯示為豎線,并具有適當(dāng)?shù)耐献Ч鈽?biāo)效果。

DragLine`組件的思路是利用事件監(jiān)聽器來捕獲鼠標(biāo)的拖拽行為,計(jì)算拖拽寬度,并通過回調(diào)函數(shù)將更新后的寬度和高度傳遞給父組件。這樣可以實(shí)現(xiàn)通過鼠標(biāo)拖拽來改變?nèi)萜鲗挾然蛘吒叨鹊墓δ堋?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-567366.html

到了這里,關(guān)于封裝React組件DragLine,鼠標(biāo)拖拽的邊框改變元素寬度的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 微信小程序?qū)崿F(xiàn)拖拽的小球

    ???????? 目錄 前言? js? 獲取微信小程序中獲取系統(tǒng)信息 觸摸移動(dòng)事件的處理函數(shù) 觸摸結(jié)束事件的處理函數(shù) ?用于監(jiān)聽頁面滾動(dòng)事件 全局參數(shù)? html CSS 小程序開發(fā)提供了豐富的API和事件處理函數(shù),使得開發(fā)者可以方便地實(shí)現(xiàn)各種交互功能。其中,拖拽功能是一個(gè)在許多

    2024年02月12日
    瀏覽(26)
  • Qt編寫可拖拽的自定義控件

    Qt編寫可拖拽的自定義控件

    一直想做一個(gè)像卡牌游戲一樣的,可以拖動(dòng)卡片,實(shí)現(xiàn)改變位置,順序交換的效果,今天我們一起來嘗試一下。 類名為Card h文件 cpp文件 我們完成了一個(gè)很簡單的200*400的圓角卡片 在主界面中展示看看 widget.h widget.cpp 運(yùn)行后的效果: 首先要實(shí)現(xiàn)控件拖動(dòng),需要有2個(gè)要素,1:

    2024年02月11日
    瀏覽(26)
  • 小程序封裝拖拽菜單組件(uniapp拖拽排序,自定義菜單)

    小程序封裝拖拽菜單組件(uniapp拖拽排序,自定義菜單)

    使用movable-area作為可移動(dòng)區(qū)域,并在內(nèi)部循環(huán)渲染列表項(xiàng)view,綁定touch事件。 在mounted生命周期函數(shù)內(nèi)獲取區(qū)域movable-area的dom信息,記錄列表項(xiàng)的坐標(biāo)信息。 在methods中定義了列表項(xiàng)的touchstart、touchmove和touchend事件的方法,用于實(shí)現(xiàn)列表項(xiàng)的拖拽移動(dòng)和位置變更。 watch監(jiān)聽列表項(xiàng)數(shù)

    2023年04月20日
    瀏覽(16)
  • zm-org-tree可拖拽的組織樹,簡易好上手

    zm-org-tree可拖拽的組織樹,簡易好上手

    目錄 1.簡介 2.安裝及使用 下載包 main.js全局引用 頁面使用? ? 數(shù)據(jù)要求 配合使用 3.基礎(chǔ)使用 4.較深入使用 5.修改后的代碼如下 一個(gè)不算太簡易的簡易版組織架構(gòu)圖,組件依賴于vue-org-tree, 在此基礎(chǔ)上將部分源代碼進(jìn)行優(yōu)化修改。增加鼠標(biāo)拖拽和鼠標(biāo)滾輪縮放,并支持節(jié)點(diǎn)拖

    2024年02月12日
    瀏覽(47)
  • Unity之XR Interaction Toolkit如何在VR中實(shí)現(xiàn)一個(gè)可以拖拽的UI

    普通的VR項(xiàng)目中,我們常見的UI都是一個(gè)3D的UI,放置在場景中的某個(gè)位置,方便我們使用射線點(diǎn)擊。但是為了更好的體驗(yàn),我們可能會(huì)有跟隨頭顯的UI,或者可拖拽的UI,這樣更方便用戶去操作。 所以我們今天的需求就是:如何基于XR Interaction Toolkit 插件 在VR中使用手柄射線來

    2024年02月19日
    瀏覽(20)
  • 組件化開發(fā)之如何封裝組件-react

    組件是構(gòu)建用戶界面的基本單元,它是一個(gè)獨(dú)立的、可重用的、可組合的代碼單元,用于表示UI的一部分。 人話:當(dāng)談?wù)摻M件時(shí),就像在搭積木一樣,每個(gè)組件都是一個(gè) 獨(dú)立的、可以重復(fù)使用 的代碼塊,用來構(gòu)建網(wǎng)頁或應(yīng)用的各個(gè)部分。比如界面的布局,像按鈕、文本輸入

    2024年02月11日
    瀏覽(21)
  • React Native 橋接組件封裝原生組件屬性

    React Native 橋接組件封裝原生組件屬性

    自定義屬性可以讓組件具備更多的靈活性,所以有必要在JS 層通過自定義屬性動(dòng)態(tài)傳值。 因?yàn)?ViewManager 管理了整個(gè)組件的行為,所以要新增組件屬性也需要在這里面(如 InfoViewManager)進(jìn)行定義。 1、在InfoViewManager 中定義一個(gè) setAvatar 方法。 @ReactProp 是 React Native 中的注解,用

    2024年01月21日
    瀏覽(20)
  • React組件封裝:文字、表情評論框

    React組件封裝:文字、表情評論框

    1.需求描述 根據(jù)項(xiàng)目需求,采用Antd組件庫需要封裝一個(gè)評論框,具有以下功能: 支持文字輸入 支持常用表情包選擇 支持發(fā)布評論 支持自定義表情包 2.封裝代碼 ?./InputComment.tsx ./util.ts ?./index.less ? ?3.問題解決 同一頁面有多個(gè)評論框時(shí),光標(biāo)位置不準(zhǔn)確?答:從組件外部傳

    2024年04月08日
    瀏覽(14)
  • react使用hook封裝一個(gè)tab組件
  • react umi/max 封裝頁簽組件

    react umi/max 封裝頁簽組件

    思路:封裝一個(gè)頁簽組件,包裹頁面組件,頁面渲染之后把數(shù)據(jù)緩存到全局狀態(tài)實(shí)現(xiàn)頁面緩存。 瀏覽本博客之前先看一下我的博客實(shí)現(xiàn)的功能是否滿足需求,實(shí)現(xiàn)功能: - 頁面緩存 - 關(guān)閉當(dāng)前頁 - 鼠標(biāo)右鍵關(guān)閉當(dāng)前 - 鼠標(biāo)右鍵關(guān)閉其他 - 鼠標(biāo)右鍵關(guān)閉左側(cè) - 鼠標(biāo)右鍵關(guān)閉右側(cè)

    2024年01月18日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包