ホームページ  >  記事  >  バックエンド開発  >  Go と React を使用してドラッグ可能なリストを作成する方法

Go と React を使用してドラッグ可能なリストを作成する方法

WBOY
WBOYオリジナル
2023-06-17 13:12:101131ブラウズ

最新の Web アプリケーションでは、ドラッグ アンド ドロップ機能はユーザーに優れたインタラクティブなエクスペリエンスを提供できるため、標準機能の 1 つになっています。この記事では、Go 言語と React を使用してドラッグ可能なリストを作成し、Web アプリケーションをより使いやすく、より興味深いものにする方法を紹介します。

ステップ 1: バックエンド サービスを構築する

まず、リスト データを管理するバックエンド サービスを構築する必要があります。 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 ファイルを作成し、次のコードを追加します。

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」という構造体を作成し、その中にそのフィールドを定義しました。次に、データベースからすべての項目を取得し、JSON として返す「listItems」という関数を作成しました。また、単一の項目を更新する「updateItem」という関数も作成しました。

この Golang ファイルに「api」という名前のルーティング グループを作成し、GET /items と PUT /items/:id という 2 つのルートを定義しました。 GET ルートはすべての項目を取得するために使用され、PUT ルートは 1 つの項目を更新するために使用されます。

CORS の問題を処理するために、「corsMiddleware」というミドルウェアも追加しました。 CORS を使用すると、あるドメインのコードが別のドメインの API にリクエストを行うことができます。これは、Web アプリケーションを開発する場合に非常に一般的です。

ステップ 2: React フロント エンドを構築する

次に、React フロント エンドを作成する必要があります。 React と React-DnD ライブラリを使用してドラッグ アンド ドロップ機能を実装します。また、Axios ライブラリを使用してバックエンド サーバーからデータを取得します。

まず、「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 (
        <DragDropContext onDragEnd={onDragEnd}>
            <Droppable droppableId="itemList">
                {(provided) => (
                    <ul
                        {...provided.droppableProps}
                        ref={provided.innerRef}
                        className="item-list"
                    >
                        {items.map((item, index) => {
                            return (
                                <Draggable
                                    key={item.id}
                                    draggableId={item.id.toString()}
                                    index={index}
                                >
                                    {(provided) => (
                                        <li
                                            {...provided.draggableProps}
                                            {...provided.dragHandleProps}
                                            ref={provided.innerRef}
                                            className="item"
                                        >
                                            {item.name}
                                        </li>
                                    )}
                                </Draggable>
                            );
                        })}
                        {provided.placeholder}
                    </ul>
                )}
            </Droppable>
        </DragDropContext>
    );
}

この React コンポーネントでは、最初に useState とリスト項目のデータを取得するには、Effect を使用します。次に、ドラッグ イベントを処理してデータを更新する「onDragEnd」という関数を作成しました。また、React-DnD ライブラリを使用してドラッグ可能なリストも作成しました。この「ItemList」コンポーネントでは、すべてのリスト項目を含む ff6d136ddc5fdfeffaf53ff6ee95f185 要素をレンダリングし、a245a8242cd745c2107f18b8f8f45369 コンポーネントを使用してそれらの項目をドラッグ可能にします。また、8c5c063a1d171dc2ddd51709ef854a36 コンポーネントを使用してリスト全体をラップし、ドラッグ アンド ドロップできるようにします。

ここで、アプリケーションでこのコンポーネントを使用する必要があります。 React アプリケーションでは、「App」というコンポーネントを作成し、その JSX に c88d11956a1bb01d80e1fa915d8b768b を追加しました。次に、次のコードを「index.js」というファイルに追加して、React アプリケーションをレンダリングします。

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(<App />, document.getElementById('root'));

ステップ 3: アプリケーションを実行します

これで、応用。バックエンド サービスとフロントエンド React アプリケーションが実行されていることを確認するには、それらを開始する必要があります。まず、ターミナル ウィンドウを 2 回開き、一方のウィンドウで Go アプリケーション ディレクトリに切り替えて、次のコマンドを実行する必要があります。

go run main.go

次に、もう一方のターミナル ウィンドウで React アプリケーション ディレクトリに切り替え、次のコマンドを実行します。次のコマンド:

npm start

これで、ブラウザで http://localhost:3000/ にアクセスし、ドラッグ可能なリストを確認できます。ここで、リスト項目を快適にドラッグし、バックエンド サービスでそれに応じて更新できるかどうかを試してみましょう。

結論

この記事では、Go 言語と React を使用してドラッグ可能なリストを作成し、Gin と React-DnD ライブラリを通じて、リスト項目をドラッグする機能を実装し、そこからデータを取得しましたAxios ライブラリを介してバックエンド サーバーに接続します。このサンプル プロジェクトは、日々の作業開発の参考として使用できます。

以上がGo と React を使用してドラッグ可能なリストを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。