基于React Hooks的增删改查(CRUD)实例

Posted 橘猫吃不胖~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于React Hooks的增删改查(CRUD)实例相关的知识,希望对你有一定的参考价值。

基于React Hooks的增删改查(CRUD)实例

1 效果展示


2 后台部分实现

2.1 创建Express项目

使用WebStorm创建Express项目server1,并且需要安装一些模块:

# sequelize模块在关系型数据库和对象之间做一个映射,操作数据库更加方便
npm install sequelize
# mysql2模块支持sequelize模块
npm install mysql2
# cors模块解决了跨域的问题
npm install cors

修改端口号,由于原本的3000端口号有些普遍,会与前端页面冲突,因此在bin文件夹下的www.js文件中,修改端口号。具体为第15行代码,将3000修改成8089

var port = normalizePort(process.env.PORT || '8089');

2.2 数据库部分

数据库部分与info数据库中的stu表进行连接,stu表的内容如下:

stu表数据结构如下:

1、在当前项目下新建文件夹config,在该文件夹下创建dbconfig.js文件,该文件是数据库的配置文件,用来连接数据库,具体代码如下:

var Sequelize = require("sequelize");
// 参数分别是:数据库名、用户名、密码
const DB = new Sequelize("info", "root", "123456", 
    host: "localhost", // 主机地址
    port: 3306, // 数据库端口号
    dialect: "mysql", // 数据库类型
    pool:  // 数据库连接池
        max: 5, // 最大连接数量
        min: 0, // 最小连接数量
        idle: 10000, // 如果10秒内没有被使用,释放该线程
    
)

module.exports = DB;

2、在当前项目下新建文件夹Model,在该文件夹下新建文件stuModel.js,该文件用来建立数据库模型,将数据库的表映射到某个对象上,相当于与某张表建立联系,具体代码如下:

const DB = require("../config/dbconfig"); // 导入数据库配置文件
const Sequelize = require("sequelize"); // 导入模块
// stu是数据库的表名
const stuModel = DB.define("stu", 
    id: 
        primaryKey: true, // 设置为主键
        type: Sequelize.STRING, // 数据类型
        field: "sid", // 将表中的列名与对象名进行映射,当表名与对象名不同时使用
    ,
    name: 
        type: Sequelize.STRING,
        allowNull: false, // 不允许为空
        field: "sname"
    ,
    age: 
        type: Sequelize.INTEGER,
        allowNull: false
    ,
    gender: 
        type: Sequelize.STRING,
        allowNull: false
    
, 
    freezeTableName: true, // 表示适应用户给定的表名
    timestamps: false // 不显示时间戳
)

module.exports = stuModel;

2.3 接口部分

1、在routes文件夹下新建文件student.js,配置自己的路由接口。在该文件中主要实现了增删改查的功能,具体文件如下:

var express = require("express");
var router = express.Router(); // 使用路由模块化管理
var stuModel = require("../Model/stuModel"); // 导入模型文件

// 获取所有学生信息:http://localhost:8089/student/search
router.get("/search", (req, res) => 
    stuModel.findAll( // findAll,查询所有的数据
        raw: true // 显示时间戳
    ).then(result => 
        // 向前端发送JSON格式的数据,设置成功查询的code为1001
        res.json(
            code: 1001,
            msg: result
        )
    ).catch(err => 
        res.json(
            code: 1002, // 设置1002表示发生错误
            msg: err
        )
    )
)

// 添加学生信息:http://localhost:8089/student/add
router.post("/add", (req, res) => 
    stuModel.create( // create表示创建信息
        id: req.body.id, // post请求使用req.body来获取
        name: req.body.name,
        age: req.body.age,
        gender: req.body.gender
    ).then(result => 
        res.json(
            code: 1001,
            msg: "插入成功"
        )
    ).catch(err => 
        res.json(
            code: 1002,
            msg: "插入失败"
        )
    )
)

// 删除学生信息:http://localhost:8089/student/delete
router.post("/delete", (req, res) => 
    let id = req.body.id; // 删除时首先要获取被删除的人的学号id再删除整个信息
    stuModel.destroy( // destroy表示删除某个信息
        where: 
            id: id
        
    ).then(result => 
        res.json(
            code: 1001,
            msg: "删除成功"
        )
    ).catch(err => 
        res.json(
            code: 1002,
            msg: "删除失败"
        )
    )
)

// 更新某条信息:http://localhost:8089/student/update
router.put("/update", (req, res) => 
    // 更新时先根据id查询到要更新的信息,然后再求改其他的信息,id信息不可修改
    stuModel.findOne( // findOne表示查找某条信息
        where: 
            id: req.body.id
        
    ).then(user =>  // user表示查询到的结果
        user.update( // update表示更新数据
            name: req.body.name,
            age: req.body.age,
            gender: req.body.gender
        ).then(result => 
            res.json(
                code: 1001,
                msg: "更新成功"
            )
        ).catch(err => 
            res.json(
                code: 1002,
                msg: "更新失败"
            )
        )
    ).catch(err => 
        res.json(
            code: 1002,
            msg: "查询失败"
        )
    )
)

module.exports = router;

2、在app.js文件中引入跨域模块,并根据刚刚写好的接口配置路由。

// 解决跨域
var cors = require("cors");
app.use(cors());
// 配置路由
var stuRouter = require('./routes/student');
app.use('/student', stuRouter);

3 前端部分实现

3.1 创建React项目

1、使用WebStorm创建React项目demo1,并且安装一些模块:

# axios模块用来发起请求
npm install axios

3.2 编写组件

2、在src文件夹下新建文件夹components,用来存放自定义的组件。在该文件夹下新建文件UserTable.js,该文件主要用来在网页上显示数据表格,具体代码如下:

import React from "react";

const UserTable = (props) => 
    return (
        // 边框为1
        <table border=1>
            <thead>
            <tr>
                <th width=100>学号</th>
                <th width=100>姓名</th>
                <th width=100>年龄</th>
                <th width=100>性别</th>
                <th width=200 colSpan=2>操作</th>
            </tr>
            </thead>
            <tbody>
            /*显示数据库中多行信息,使用括起来*/
            
                // props.users表示从数据库中获取的所有信息,存放在数组中
                // 如果有信息显示所有信息
                props.users.length > 0 ? (
                    props.users.map(user => 
                        return (
                            <tr key=user.id>
                                <td>user.id</td>
                                <td>user.name</td>
                                <td>user.age</td>
                                <td>user.gender</td>
                                <td>
                                    /*点击编辑后将用户信息传到props下的editRow函数中*/
                                    <button onClick=() => 
                                        props.editRow(user)
                                    >编辑
                                    </button>
                                    /*点击删除后将用户id传给props下的deleteRow函数*/
                                    <button onClick=() => 
                                        props.deleteRow(user.id)
                                    >删除
                                    </button>
                                </td>
                            </tr>
                        )
                    )
                ) : (
                    // 如果没有信息则显示没有用户信息
                    <tr>
                        <td colSpan=5>没有用户信息</td>
                    </tr>
                )
            
            </tbody>
        </table>
    )


export default UserTable;

3、在components文件夹下新建文件AddUserForm.js,用来编写添加用户信息的表单,具体代码如下:

import React, useState from "react";

const AddUserForm = (props) => 
    const initFormState = id: " ", name: " ", age: " ", gender: " ";
    // 将初始的stu设置为空
    const [stu, setStu] = useState(initFormState);

    // 定义获取input值的方法
    const handleInputChange = (event) => 
        const name, value = event.target; // event.target获取到了当前input输入的值
        setStu(...stu, [name]: value); // 将修改后的值存放到stu中
    

    return (
        <form onSubmit=(event => 
            event.preventDefault(); // 屏蔽默认提交
            if (!stu.id || !stu.name || !stu.age || !stu.gender) 
                return; // 如果四项有一项为空,则返回
            
            props.addRow(stu); // 将当前的stu传入到props下的addRow方法中
            setStu(initFormState); // 传入结束再让添加显示为空
        )>
            <label>
                学号:<input type="text" name="id" value=stu.id onChange=handleInputChange/>
            </label>
            <br/><br/>
            <label>
                姓名:<input type="text" name="name" value=stu.name onChange=handleInputChange/>
            </label>
            <br/><br/>
            <label>
                年龄:<input type="text" name="age" value=stu.age onChange=handleInputChange/>
            </label>
            <br/><br/>
            <label>
                性别:<input type="text" name="gender" value=stu.gender onChange=handleInputChange/>
            </label>
            <br/><br/>
            <button>添加信息</button>
        </form>
    )


export default AddUserForm;


4、在src文件夹下新建文件EditUserForm.js,该文件主要编写了更新信息的页面,具体代码如下:

import React, useEffect, useState from "react";

const EditUserForm = (props) => 
    // props.currentStu是传给EditUserForm的参数,是自定义的
    const [stu, setStu] = useState(props.currentStu);
    // 当props发生改变则设置当前状态
    useEffect(() => 
        setStu(props.currentStu);
    , [props]);
    // 当输入框中的内容发生改变时,则修改当前的状态
    const handleInputChange = (event) => 
        const name, value = event.target; // 获取正在修改的输入框的值
        setStu(...stu, [name]: value);
    

    return (
        <form onSubmit=(event) => 
            event.preventDefault(); // 阻止默认提交
            props.updateRow(stu); // 为props中的updateRow方法传入参数stu
        >
            <label>
                学号:<input type="text" name="id" value=stu.id disabled onChange=handleInputChange/>
            </label>
            <br/><br/>
            <label>
                姓名:<input type="text" name="name" value=stu.name onChange=handleInputChange/>
            </label>
            <br/><br/>
            <label>
                年龄:<input type="text" name="age" value=stu.age onChange=handleInputChange/>
            </label>
            <br/><br/>
            <label>
                性别:<input type="text" name="gender" value=stu.gender onChange=handleInputChange/>
            </label>
            <br/><br/>
            <button>更新学生</button>
            &nbsp;&nbsp;&nbsp;
            /*点击按钮将props下的setEditing状态改成false*/
            <button onClick=() => props.setEditing(false)>取消更新</button>
        </form>
    )


export default EditUserForm;


5、编写App.js文件,在该文件中编写CRUD操作,以及将组件集合起来,具体代码如下:

import logo from './logo.svg';
import './App.css';
import UserTable from "./components/UserTable";
import AddUserForm from "./components/AddUserForm";
import EditUserForm from "./components/EditUserForm";
im

以上是关于基于React Hooks的增删改查(CRUD)实例的主要内容,如果未能解决你的问题,请参考以下文章

mySQL CRUD操作(数据库的增删改查)

MySQL学习4:数据的增删改查CRUD

MySQLMySQL表的增删改查(CRUD)

MySQLMySQL表的增删改查(CRUD)

oracle表的crud(增删改查)单表

Mybatis从入门到精通系列 13——基于注解配置的增删改查