umi框架编写简单的拖拽功能

首先我们需要在项目中创建一个home文件夹用于存储文件,然后在再在文件中创建home.jsx和index.less的格式。
然后接下来就是直接上代码

import React, { useState, useEffect } from "react";
import { NavBar, Space, Input, AutoCenter, Button, Toast } from "antd-mobile";
import { useHistory, useLocation } from 'umi';

import "./index.less";
import Draggable from "react-draggable";
import { nanoid } from "nanoid";
import img1 from '@/images/img1.jpg'
import img2 from '@/images/img2.jpg'
import img3 from '@/images/img3.jpg'
import img4 from '@/images/img4.jpg'
import img5 from '@/images/img5.jpg'

export default function App() {
    const location = useLocation();
    const state = location.query;
    const [wish, setWish] = useState("");
    const [wishlist, setList] = useState([]);
    const [wishstyle, setStyle] = useState("");
    const [vals, setval] = useState();

    const [disabled, setDisabled] = useState(true);
    // 拖拽记录
    const eventLogger = (e, data) => {
        console.log(`data`, data);
        wishlist.forEach(function (value, key) {
            if (value.id == vals) {
                // console.log(`value`, value);
                // console.log(`value`, vals);
                let list = {
                    id: value.id,
                    value: value.value,
                    color: value.color,
                    x: data.lastX,
                    y: data.lastY,
                };
                wishlist.splice(key, 1, list);
                localStorage.setItem("xinyuan", JSON.stringify(wishlist));
                setList([...wishlist]);
            }
        });
    };

    const TextDecoder = (val, index) => {
        console.log(`val`, val);
        setval(val);
    };

    const left = (
        <div style={{ fontSize: 16 }}>
            <Space style={{ "--gap": "16px" }}>
                <p>昵称:{state.name}</p>
            </Space>
        </div>
    );

    // 提交事件
    function useVerifyPhoneNum() {
        let list = {
            id: nanoid(),
            value: wish,
            color: wishstyle,
            x: 0,
            y: 0,
        };
        wishlist.push(list);
        localStorage.setItem("xinyuan", JSON.stringify(wishlist));
        console.log(`wishlist`, wishlist);
        setList([...wishlist]);
        setWish("");
        setStyle("");
    }

    // 删除事件
    function usedelete(val) {
        console.log(`123`, 123);
        // wishlist.splice(val, 1);
        wishlist.forEach(function (value, key) {
            if (value.id == val) {
                console.log("id", value.id);
                console.log("val", val);
                wishlist.splice(key, 1);
                console.log(`key`, key);
                localStorage.setItem("xinyuan", JSON.stringify(wishlist));
                setList([...wishlist]);
            }
        });
        console.log(`wishlist`, wishlist);
    }
    // 修改事件
    function upValue(val) {
        console.log(`val`, val);
    }
    useEffect(() => {
        console.log(`数据`, 1);
        if (localStorage.getItem("xinyuan") != null) {
            let data = JSON.parse(localStorage.getItem("xinyuan"));
            setList(data);
        }
    }, []);


    useEffect(() => {
        // wishlist=data;
        console.log(wish);
        console.log(wishstyle);
        if ((wish.length > 0) & (wishstyle.length > 0)) {
            setDisabled(false);
        } else {
            setDisabled(true);
        }
    }, [wish, wishstyle]);
    return (
        <div>
            <NavBar left={left} backArrow={false}>
                许愿墙
            </NavBar>
            <AutoCenter>
                <Input
                    placeholder="请输入想实现的愿望"
                    value={wish}
                    onChange={(val) => {
                        setWish(val);
                    }}
                    clearable
                />
                <div className="but">
                    <img className={wishstyle == img1 ? 'oncli' : ''} src={img1} onClick={() => {
                        setStyle(img1)
                    }} />
                    <img className={wishstyle == img2 ? 'oncli' : ''} src={img2} onClick={() => {
                        setStyle(img2)
                    }} />
                    <img className={wishstyle == img3 ? 'oncli' : ''} src={img3} onClick={() => {
                        setStyle(img3)
                    }} />
                    <img className={wishstyle == img4 ? 'oncli' : ''} src={img4} onClick={() => {
                        setStyle(img4)
                    }} />
                    <img className={wishstyle == img5 ? 'oncli' : ''} src={img5} onClick={() => {
                        setStyle(img5)
                    }} />
                </div>
                <Button
                    onClick={useVerifyPhoneNum}
                    disabled={disabled}
                    block
                    type="submit"
                    color="primary"
                    size="large"
                >
                    提交
                </Button>
            </AutoCenter>
            {/* 拖拽 */}
            <div className="list">
                {wishlist?.map((item, index) => {
                    // console.log(`item`, item);
                    return (
                        <Draggable
                            key={item.id}
                            handle=".box"
                            defaultPosition={{ x: item.x, y: item.y }}
                            onStop={eventLogger}
                            onStart={(val) => {
                                TextDecoder(item.id);
                            }}
                        >
                            <div>
                                <button
                                    className="butto"
                                    onClick={(val) => {
                                        usedelete(item.id);
                                    }}
                                >
                                    x
                                </button>
                                <div className="inpt">
                                    <p>{item.value}</p>
                                </div>
                                <div className="box" style={{ backgroundColor: item.color }}>
                                    <img src={item.color} />
                                </div>
                            </div>
                        </Draggable>
                    );
                })}
            </div>
        </div>
    );
}

然后就是样式代码阶段

.adm-auto-center {
  margin: 10%;
}

.but {
  margin: 20px 0;
  border-radius: 25px;
}

.adm-auto-center {
  margin: 5%;
}

.but img {
  display: inline-block !important;
  width: 60px;
  height: 60px;
  margin: 3px;
}

.oncli {
  border-style: solid;
  border-width: 2px;
  border-color: red;
}

.box {
  width: 100px;
  height: 100px;
  display: flex;
  flex-direction: column;
  z-index: 0;
}

.box img {
  width: 100px;
  height: 100px;
}

.butto {
  position: relative;
  top: 59px;
  left: 77px;
}

.react-draggable {
  width: 110px !important;
  height: 100px;
  position: absolute;
  top: 400px;
  left: 0;

}

.list {
  flex-wrap: wrap;
  width: 100%;
}

.inpt {
  text-align: center;
  margin: auto;
  position: relative;
  top: 65px;

  input {
    text-align: center;
    width: 30px;
    z-index: 100;
    font-size: 22px;
  }

  p {

    text-align: center;
    color: white;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程雪员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值