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

重庆平台网站建设哪里有市场营销和网络营销

重庆平台网站建设哪里有,市场营销和网络营销,柳州 网站推广,陕西免费网站建设安装拖拽库: npm i dnd-kit/core dnd-kit/sortable dnd-kit/utilities里面有一些组件: DndContext : 拖拽功能最外面的容器 onDragEnd : 拖拽完成之后的回调函数collisionDetection : 碰撞函数sensors : 定义传感器&am…

安装拖拽库:

 npm i @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities

里面有一些组件:

  • DndContext : 拖拽功能最外面的容器

    • onDragEnd : 拖拽完成之后的回调函数
    • collisionDetection : 碰撞函数
    • sensors : 定义传感器,默认的传感器只有PointerSensor,,如果想要监听键盘,或者手机端的touch事件,就需要配置别的传感器
  • SortableContext: 告诉dnd-kit,哪一个容器是可以被拖拽和放置的区域

    • items :表示dnd-kit要跟踪哪些项
    • strategy : 排序策略
  • const {attributes,listeners,setNodeRef,transform,transition} = useSortable({id});
    setNodeRef: 绑定每个拖拽的盒子

import React, {PropsWithChildren, useState} from 'react';
import logo from './logo.svg';
import './App.css';
import {closestCorners,DndContext,DragEndEvent, KeyboardSensor, PointerSensor, TouchSensor,useDraggable,useDroppable,useSensor,useSensors
} from "@dnd-kit/core";
import {arrayMove,SortableContext,sortableKeyboardCoordinates,useSortable,verticalListSortingStrategy
} from "@dnd-kit/sortable";
import {CSS} from "@dnd-kit/utilities"interface taskType {id:number,title:string
}function Task({id,title}:taskType){// 告诉 dnd-kit 这个是拖拽元素const {attributes,listeners,setNodeRef,transform,transition} = useSortable({id});const style = {transition,transform:CSS.Transform.toString(transform)}//  dnd-kit控制元素外观的方式,,是创建一个style对象return (//  给盒子添加引用,,dnd-kit可以跟踪他<div className="task" ref={setNodeRef} {...attributes} {...listeners} style={style}><input type="checkbox" className="checkbox" />{title}</div>)
}type propType = {tasks:Array<taskType>
}
function Column({tasks}:propType){return (<div>{/*    告诉 dnd-kit 哪一个容器是可以被拖动和放置的区域 用SortableContext包裹===> items表示要跟踪哪些项  ===> strategy:排序策略*/}<SortableContext items={tasks} strategy={verticalListSortingStrategy}>{tasks.map(item=>(<Task id={item.id} title={item.title} key={item.id} />))}</SortableContext></div>)
}
type InputProp={onSubmit:(val:string)=>void
}
function Input({onSubmit}:InputProp){const [inputValue, setInputValue] = useState("")function handleSubmit(){if (!inputValue){return}onSubmit(inputValue)setInputValue("")}return (<div className="py-2 flex items-center justify-between"><input type="text" value={inputValue}placeholder="请输入task"onChange={(e)=>setInputValue(e.target.value)}/><button onClick={handleSubmit} className="px-2 rounded bg-yellow-200">添加</button></div>)
}function App() {const [tasks, setTasks] = useState([{id:1,title:"hehe"},{id:2,title:"222"},{id:3,title:"333"},])// 其他传感器,比如手机的touch,,键盘按键const sensors = useSensors(// 指针传感器useSensor(PointerSensor),// 默认的senseruseSensor(TouchSensor),useSensor(KeyboardSensor,{// enter+ 上下键coordinateGetter: sortableKeyboardCoordinates}))const [inputValue, setInputValue] = useState("")const addTask = (title:string)=>{setTasks(prevTasks=>{return [...prevTasks,{id:prevTasks.length+2,title: title}]})}return (<div><Input onSubmit={addTask} /><DndContext collisionDetection={closestCorners} onDragEnd={handleDragEnd} sensors={sensors}><Column tasks={tasks}/></DndContext></div>);function handleDragEnd(event: DragEndEvent) {const {active, over} = eventif (active.id === over?.id) returnsetTasks(prevTasks => {var activePos = prevTasks.findIndex(task=>task.id===active.id);var newPos = prevTasks.findIndex(task=>task.id===over?.id);return arrayMove(prevTasks,activePos,newPos)})}
}export default App;
封装拖拽组件,将拖拽的元素动态传入
import {JSX} from "react";
import {closestCenter,DndContext,DragEndEvent,KeyboardSensor,MouseSensor,PointerSensor,useSensor,useSensors
} from "@dnd-kit/core";
import {SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy} from "@dnd-kit/sortable";type PropsType = {children: JSX.Element | JSX.Element[], // 传入子组件,,拖拽的组件items: Array<{id:string,[key:string]:any}>,  // 扩展key是任何string的属性onDragEnd:(oldIndex:number,newIndex:number)=>void  // drag的回调,,传入组件不同,拖拽回调也不同
}function SortableContainer(props:PropsType){const {children,items,onDragEnd} = propsconst sensors = useSensors(// useSensor(PointerSensor),// useSensor(KeyboardSensor,{//     coordinateGetter:sortableKeyboardCoordinates// }),useSensor(MouseSensor,{activationConstraint:{distance:8 // 8px,,移动超过8px才算拖拽}}))function handleDragEnd(event:DragEndEvent){// const {} = eventconst {active,over} = eventif (over == null){return}if (active.id === over.id){return;}var oldIndex = items.findIndex(c=>c.id===active.id);var newIndex = items.findIndex(c=>c.id===over.id);onDragEnd(oldIndex,newIndex)}return (<div><DndContext onDragEnd={handleDragEnd} sensors={sensors} collisionDetection={closestCenter}><SortableContext items={items} strategy={verticalListSortingStrategy}>{/* 怎么循环不管,,,直接引入子组件*/}{children}</SortableContext></DndContext></div>)
}export default SortableContainer
import {useSortable} from "@dnd-kit/sortable";
import {JSX} from "react";
import {CSS} from "@dnd-kit/utilities"
type PropsType={id:string,children:JSX.Element
}
function SortableItem({id,children}:PropsType){const {attributes,listeners,setNodeRef,transition,transform} = useSortable({id});const style = {transition,transform:CSS.Transform.toString(transform)}return (<div ref={setNodeRef} {...attributes} {...listeners} style={style}>{children}</div>)
}export default SortableItem

使用:

   var componentListWithId = componentList.map(item => ({...item, id: item.fe_id}));function handleDragEnd(oldIndex: number, newIndex: number) {console.log(oldIndex, newIndex)dispatch(moveComponent({oldIndex,newIndex}))}return (<SortableContainer onDragEnd={handleDragEnd} items={componentListWithId}>{componentList.map(c => {const {fe_id, title, isHidden, isLocked,} = cconst titleDefaultClassName = styles.titleconst selectedClassName = styles.selectedconst titleClassName = classNames({[titleDefaultClassName]: true,[selectedClassName]: fe_id === selectedId})return (<SortableItem  key={fe_id} id={fe_id}><div className={styles.wrapper}><div className={titleClassName} onClick={() => handleTitleClick(fe_id)}>{fe_id !== changingTitleId && title}{fe_id === changingTitleId && <Input value={title}onChange={(e) => changeTitle(e)}onPressEnter={() => setChangingTitleId("")}onBlur={() => setChangingTitleId("")}/>}</div><div className={styles.handler}><Space><ButtononClick={() => changeHidden(fe_id, !isHidden)}size="small"className={!isHidden ? styles.btn : ""} icon={<EyeInvisibleOutlined/>}type={isHidden ? "primary" : "default"} shape="circle"></Button><ButtononClick={() => changeLocked(fe_id)}size="small"className={!isLocked ? styles.btn : ""} icon={<LockOutlined/>}type={isLocked ? "primary" : "default"} shape="circle"></Button></Space></div></div></SortableItem>)})}</SortableContainer>)
http://www.dtcms.com/a/441612.html

相关文章:

  • 烟台网站建设便宜臻动传媒微信备份wordpress
  • 网站备案完成建设部网站从哪登陆
  • 模板建站与仿站哪个更好安徽seo优化规则
  • 珠海华兴建设工程有限公司网站企业融资需求怎么写
  • 做一个简单的公司网站要多少钱it外包前景
  • 厦门网站建设网络推广建湖网站建设找哪家好
  • 哈尔滨网站建设价格低wordpress icp涵数
  • 网站建制作公司手机网站制作视频教程
  • 申请完域名如何建网站收录网站查询
  • 长春网站建设模板织梦怎么在本地编辑多个网站
  • 肥西县建设局官方网站wordpress 留言本插件
  • 网站建设项目实训报告国内优秀的设计网站
  • 绥化做网站布谷海南网站建设
  • 备案不关闭网站win10运行wordpress
  • 2019做网站seo行不行2023年没有封闭的网站有哪些
  • 什么叫网站建设方案书织梦网站模板安装教程
  • seo 网站标题字数国外网站排名 top100
  • 网站素材 下载东莞门户网站建设方案
  • 想做网站 优帮云网站地图模板下载
  • 建站公司 万维科技域名到期不续费会怎么样
  • 专业的网站建设报价北京律师网站建设推荐
  • 网站可以做系统吗游戏推广话术
  • iis做网站跳转常熟seo关键词优化公司
  • 上海外贸网站制作公司广州市制网公司
  • 南山网站建设-信科网络全美网站建设公司
  • 用vs做网站后台泉州北京网站建设
  • 网页设计与网站建设-学用一册通安徽省建筑平台信息网
  • 龙岩市住房与城乡建设部网站桂林景区网站策划
  • 做网站怎么推广收益大本地网站有什么可以做
  • 怎样免费建立网站免费推广产品的网站