0

0

如何使用Go语言和React构建可拖拽的列表

WBOY

WBOY

发布时间:2023-06-17 13:12:10

|

1328人浏览过

|

来源于php中文网

原创

在现代web应用程序中,拖拽功能已经成为标配之一,这是因为它能给用户更好的交互体验。在这篇文章中,我们将介绍如何使用go语言react构建可拖拽的列表,让你的web应用程序更加易于使用和有趣。

第一步:搭建后端服务

首先,我们需要搭建一个后端服务,用来管理列表的数据。我们将使用Go语言创建一个简单的REST API。为了简化我们的代码,我们将同时使用Gin框架和GORM库。

首先,我们需要创建一个名为“items”的表,以存储我们的列表项。

CREATE TABLE items (
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    position INT NOT NULL,
    PRIMARY KEY (id)
);

接下来,我们创建一个Golang文件,并在其中添加以下代码:

立即学习go语言免费学习笔记(深入)”;

package main

import (
    "github.com/gin-gonic/gin"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

type Item struct {
    ID       int    `gorm:"primary_key" json:"id"`
    Name     string `gorm:"not null" json:"name"`
    Position int    `gorm:"not null" json:"position"`
}

func main() {
    // 初始化Gin框架
    r := gin.Default()

    // 连接MySQL数据库
    db, err := gorm.Open("mysql", "{username}:{password}@/{database_name}?charset=utf8&parseTime=True&loc=Local")
    if err != nil {
        panic("无法连接到数据库")
    }
    defer db.Close()

    // 自动迁移schema
    db.AutoMigrate(&Item{})

    // 添加CORS中间件
    r.Use(corsMiddleware())

    // 定义API路由
    api := r.Group("/api")
    {
        api.GET("/items", listItems)
        api.PUT("/items/:id", updateItem)
    }

    // 启动服务
    r.Run(":8080")
}

// 列出所有项
func listItems(c *gin.Context) {
    db := c.MustGet("db").(*gorm.DB)

    var items []Item
    db.Find(&items)

    c.JSON(200, items)
}

// 更新单个项目
func updateItem(c *gin.Context) {
    db := c.MustGet("db").(*gorm.DB)

    // 从URL参数获得项目的ID
    id := c.Param("id")

    // 从请求体得到项目的其他项(名称和位置)
    var input Item
    if err := c.BindJSON(&input); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }

    // 更新数据库
    var item Item
    if db.First(&item, id).RecordNotFound() {
        c.JSON(404, gin.H{"error": "项目未找到"})
        return
    }

    item.Name = input.Name
    item.Position = input.Position

    if err := db.Save(&item).Error; err != nil {
        c.JSON(400, gin.H{"error": "更新项目失败"})
        return
    }

    c.JSON(200, item)
}

// 添加CORS中间件
func corsMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
        c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS")
        c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type")
        c.Writer.Header().Set("Access-Control-Max-Age", "86400")
        if c.Request.Method == "OPTIONS" {
            c.AbortWithStatus(200)
            return
        }
        c.Next()
    }
}

在这段代码中,我们首先创建了一个名为“items”的表,用来存储列表项。然后,我们创建了一个名为“Item”的结构体,并在其中定义了其字段。接着,我们创建了一个名为“listItems”的函数,用来从数据库中获取所有项目,并将它们以JSON形式返回。我们还创建了一个名为“updateItem”的函数,用来更新单个项目。

我们在这个Golang文件中创建了一个名为“api”的路由组,定义了两个路由:GET /items 和 PUT /items/:id。GET路由用于获取所有项目,PUT路由用于更新单个项目。

我们还添加了一个名为“corsMiddleware”的中间件,用于处理CORS问题。CORS允许一个域中的代码向另一个域中的API发起请求,这在开发Web应用程序时非常常见。

第二步:构建React前端

接下来,我们需要创建React前端。我们将使用React和React-DnD库来实现拖拽功能。我们还将使用Axios库,用来从后端服务器获取数据。

情感家园企业站5.0 多语言多风格版
情感家园企业站5.0 多语言多风格版

一套面向小企业用户的企业网站程序!功能简单,操作简单。实现了小企业网站的很多实用的功能,如文章新闻模块、图片展示、产品列表以及小型的下载功能,还同时增加了邮件订阅等相应模块。公告,友情链接等这些通用功能本程序也同样都集成了!同时本程序引入了模块功能,只要在系统默认模板上创建模块,可以在任何一个语言环境(或任意风格)的适当位置进行使用!

下载

首先,我们需要创建一个名为“ItemList”的文件夹,并将以下代码保存到名为“ItemList.jsx”的文件中:

import React, { useState, useEffect } from 'react';
import axios from 'axios';
import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';

export default function ItemList() {
    const [items, setItems] = useState([]);

    useEffect(() => {
        axios.get('http://localhost:8080/api/items').then((response) => {
            setItems(response.data);
        });
    }, []);

    function onDragEnd(result) {
        const { destination, source, draggableId } = result;
        if (!destination) {
            return;
        }
        if (
            destination.droppableId === source.droppableId &&
            destination.index === source.index
        ) {
            return;
        }

        const item = items.find((i) => i.id === parseInt(draggableId));
        const newItems = [...items];
        newItems.splice(source.index, 1);
        newItems.splice(destination.index, 0, item);

        axios
            .put(`http://localhost:8080/api/items/${draggableId}`, {
                name: item.name,
                position: destination.index,
            })
            .then(() => {
                setItems(newItems);
            });
    }

    return (
        
            
                {(provided) => (
                    
    {items.map((item, index) => { return ( {(provided) => (
  • {item.name}
  • )}
    ); })} {provided.placeholder}
)}
); }

在这个React组件中,我们首先使用useState和useEffect来获取列表项的数据。然后,我们创建了一个名为“onDragEnd”的函数,用来处理拖拽事件并更新数据。我们还使用React-DnD库创建了一个可拖拽的列表。在这个“ItemList”组件中,我们渲染了一个包含所有列表项的

    元素,并使用组件将它们设置为可拖拽。我们还使用组件来包装整个列表,使其可接受拖拽操作。

    现在,我们需要在我们的应用程序中使用这个组件。在我们的React应用程序中,我们创建了一个名为“App”的组件,并将添加到它的JSX中。接下来,我们添加以下代码到一个名为“index.js”的文件中,用来渲染我们的React应用程序:

    import React from 'react';
    import ReactDOM from 'react-dom';
    import App from './App';
    
    ReactDOM.render(, document.getElementById('root'));

    第三步:运行应用程序

    现在,我们已经完成了应用程序的开发。我们需要启动后端服务和前端React应用程序以查看它们运行。首先,我们需要双开终端窗口,在其中一个窗口中切换到我们的Go应用程序目录,运行以下命令:

    go run main.go

    然后,在另一个终端窗口中切换到我们的React应用程序目录,运行以下命令:

    npm start

    现在,我们可以在浏览器中访问http://localhost:3000/,就可以看到我们的可拖拽列表了。现在你可以玩耍一下,看看你是否可以自如地拖动列表项,而且它们在后端服务中也会相应地更新。

    结论

    在这篇文章中,我们使用Go语言和React构建了一个可拖动列表,通过Gin和React-DnD库,我们实现了拖拽列表项的功能,并通过Axios库从后端服务器获取数据。这个示例项目可以作为你日常工作开发中的一个参考。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

393

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

197

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

191

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

253

2025.06.17

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号