React 增删查改 快速上手

【React】单纯使用React实现增删改查 这篇文章适合初学者,简单利用 table 实现了增删改查功能。 这次的代码直接导入即可使用,简单上手,加油~~~~~~今天的内容就到这里啦,之后学到的会继续分享。 阅读详情

前言

我将以学生管理作为例子,使用react框架和antd样式来实现增删查改的功能

gitee项目地址: React 增删查改: 使用react完成一个简单的学生管理增删查改项目icon-default.png?t=N7T8https://gitee.com/a-kodak-duck/react-crud.git

环境准备

关于后端

如果同学不会后端的语言,可以直接使用json-server来做

json-server 增删查改 快速上手

后续我将会补充springboot和flask的增删查改快速上手(也会把vue的增删查改写一遍)

关于数据库

json-server 的数据格式如下 gender=0为男,1为女

{
  "student": [
    {
      "id": "1",
      "name": "阿松大",
      "age": 23,
      "major": "软件",
      "gender": 0
    },
    {
      "id": "2",
      "name": "撒旦",
      "age": 23,
      "major": "计算机",
      "gender": 1
    }
  ]
}

新建react项目

npx create-react-app 项目名称

npx create-react-app student-view

然后进入项目文件夹,启动项目(是的,我们不需要npm install)

PS C:\Users\Desktop> cd student-view
PS C:\Users\Desktop\student-view> npm start

出现这个页面,我们就成功了

然后我们,清理一些不相关的文件和代码,清理完后是下面这个样子

我们只需要

App.js(组件,我们直接在这个文件里写学生管理的页面,App只是个名字,你可以直接改为Student.js,改完后不要忘记也要修改在index.js对应的名字噢) 

index.js(项目入口文件)

简化后,页面长这样

react是热部署的,您不需要重启应用和手动刷新 

添加相关依赖

Antd 样式组件 Ant Design of React - Ant Design

为了让我们页面好看些,我们可以引入antd样式组件,antd相比于element而言,更支持react

npm i antd

Axios 异步请求工具 axios中文网|axios API 中文文档 | axios

axios是一个异步请求工具,比起原生的AJAX和Promise更方便,更简洁,我们将使用axios来向后端发起异步请求

npm i axios

前端样式搭建

为了解决大家时间,我直接把样式代码贴到这里

新建一个app.css文件

* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
}
.App {
  padding: 5px;
  width: 100vw;
  height: 100vh;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}
header {
  width: 100%;
  height: 8vh;
  display: flex;
  align-items: center;
}
main {
  width: 100%;
  height: 90vh;
}
/* .ant-table-body {
  min-height: 72.5vh;
} */

App.js

import { Button, Input, Table, Tag } from 'antd';
import { useState } from 'react';
import './app.css';

function App() {
  // 表格参数的控制
  const columns = [
    {
      title: '学生姓名',
      dataIndex: 'name',
      key: 'name',
    },
    {
      title: '年龄',
      dataIndex: 'age',
      key: 'age',
    },
    {
      title: '专业',
      dataIndex: 'major',
      key: 'major',
    },
    {
      title: '性别',
      key: 'gender',
      dataIndex: 'gender',
      render: (_,{ gender }) => (
        <span>{gender === 0 ? <Tag color='blue'>男</Tag>:<Tag color='orange'>女</Tag>}</span>
      ),
    },
    {
      title: '操作',
      key: 'action',
      render: (record)=>(
        <span>
          <Button style={{'backgroundColor':'orange','color':'white', 'marginRight':'5px'}}>编辑</Button>
          <Button type='primary' danger>删除</Button>
        </span>
      )
    },
  ];
  //假数据
  const data = [
    {
      id: '1',
      name: '张三',
      age: 32,
      major: '计算机',
      gender:0
    },
    {
      id: '2',
      name: '李四',
      age: 42,
      major: '软件工程',
      gender:0
    },
    {
      id: '3',
      name: '王五',
      age: 32,
      major: 'Sydney No. 1 Lake Park',
      gender:1
    },
  ];
  //批量选中行的id
  const [selectedRowKeys, setSelectedRowKeys] = useState([]);
  //批量选中事件
  const rowSelection = {
    onChange: (newSelectedRowKeys) => {
      setSelectedRowKeys(newSelectedRowKeys);
    }
  };
  return (
    <div className="App">
      {/* 头部:操作栏 */}
      <header>
        <Button type="primary" danger disabled={selectedRowKeys.length === 0}>批量删除</Button>
        <Button type='primary' style={{'backgroundColor':'green','margin':'0 5px'}}>新增学生</Button>
        <Input.Search style={{'width':'200px'}} allowClear  placeholder="搜索学生姓名" enterButton />
      </header>
      {/* 主体:学生表格 */}
      <main>
        <Table 
        rowKey={(record)=>record.id} 
        pagination={{
          current: 1,
          pageSize: 10,
          total: 100
        }}
        rowSelection={rowSelection}  
        columns={columns} 
        dataSource={data} 
        scroll={{y:1000}}/>
      </main>
    </div>
  );
}

export default App;

 最终长这个样子(样式大家凑合着看哈,按需改)

统一封装请求接口

我们可以先把所有的api接口封装到一个文件里面,再在页面中调用方法,这样能方便管理

新建一个api.js

import axios from "axios";

const Server_Url = 'http://localhost:8080/student'

/**
 * 获取-学生列表信息
 * @param {*} params 带条件的分页查询参数
 * @returns 学生列表
 */
export const getStudentList = (params)=>axios.get(Server_Url,{
  params
})

/**
 * 获取-满足查询条件的所有学生列表信息(主要是为了分页查询的count数据)
 * @returns 学生列表
 */
export const getTotalStudent = (name)=>axios.get(Server_Url,name)

/**
 * 获取-学生个人信息
 * @param {*} id 学生id 
 * @returns 学生个人信息
 */
export const getStudent = (id) => axios.get(Server_Url+'/'+id)

/**
 * 删除-学生
 * @param {*} id 学生id
 * @returns 
 */
export const deleteStudent = (id) => axios.delete(Server_Url+'/'+id)

/**
 * 更新-学生信息
 * @param {*} id 学生id
 * @param {*} data 更新的学生信息
 * @returns 更新后的学生信息
 */
export const updateStudent = (id,data) => axios.put(Server_Url+'/'+id,data)

/**
 * 新建-学生信息
 * @param {*} data 学生信息
 * @returns 
 */
export const createStudent = (data) => axios.post(Server_Url,data)

好了,启动后端接口,我们正式开始

增删查改

带条件分页查询

首先,我们先在页面上获取数据

  //获取学生列表
  useEffect(()=>{
    async function handleGetStudentList(){
      const res = await getStudentList()
      console.log(res.data)
    }
    handleGetStudentList()
  },[])

获取成功

我们再来完善这块的代码,将请求参数携带进去,并把相应的数据绑定到页面上,还有分页器的分页动作绑定

//带条件的分页搜索参数
  const [params, setParams] = useState({
    _page:1,//第一页
    _per_page:2,//每页展示2页数据(json-server超过0.17就需要使用_per_page替换_limit)
    name:''//学生姓名
  })
  //获取学生列表
  const [studentList, setStudentList] = useState([])
  const [total, setTotal] = useState(0)
  useEffect(()=>{
    async function handleGetStudentList(){
      const res = await getStudentList(params)
      setTotal(res.data.items)
      setStudentList(res.data.data)
    }
    handleGetStudentList()
  },[params])//监听搜索参数的变化,如果变化了,就重新获取数据
  //分页器发生变化
  function handlePaginationChange(newPageNum,newPageSize){
    setParams({
      ...params,
      _page:newPageNum,
      _per_page:newPageSize
    })
  }
  return (
    <div className="App">
      {/* 头部:操作栏 */}
      <header>
        <Button type="primary" danger disabled={selectedRowKeys.length === 0}>批量删除</Button>
        <Button type='primary' style={{'backgroundColor':'green','margin':'0 5px'}}>新增学生</Button>
        <Input.Search 
          value={params.name}
          onChange={(e)=>setParams({...params, name:e.target.value})}
          style={{'width':'200px'}} 
          allowClear  
          placeholder="搜索学生姓名" 
          enterButton />
      </header>
      {/* 主体:学生表格 */}
      <main>
        <Table 
        rowKey={(record)=>record.id} 
        pagination={{
          current: params._page,
          pageSize: params._per_page,
          total:total,
          onChange:handlePaginationChange
        }}
        rowSelection={rowSelection}  
        columns={columns} 
        dataSource={studentList} 
        scroll={{y:1000}}/>
      </main>
    </div>
  );

注意:

name:'' //此处需要输入完整的学生姓名,很遗憾,即使我使用了name_like也无法实现模糊查询,因此只能特定查询完整的学生姓名了,如果有知道了,请告诉我一下,谢谢

添加学生

我们来新建一个弹窗,里面存一个学生数据表单

//控制窗口打开的函数
  const [isModalOpen, setIsModalOpen] = useState(false)
  const [form] = Form.useForm();
  //打开新增窗口
  const handleOpenAddModal = ()=>{
    form.resetFields();//每次打开新增窗口时都要清空数据
    setIsModalOpen(true)
  }
  // 关闭弹窗
  const handleCancel = ()=>{
    setIsModalOpen(false)
  }
  // 提交表单
  const onFinish = async (val)=>{
    await createStudent(val)
    setParams({
      ...params
    })//重新获取数据
    message.success('新增学生成功')
    setIsModalOpen(false)
  }



{/* 新建/更新学生 */}
      <Modal 
        title="新增学生" 
        open={isModalOpen} 
        onCancel={handleCancel} 
        footer={[]}// 设置footer为空,去掉 取消 确定默认按钮
        >
        <Form
          form={form}//使用 Form 组件的 form 属性将 form 对象与 Form 组件进行关联
          name="basic"
          labelCol={{ span: 8 }}
          wrapperCol={{ span: 16 }}
          style={{ maxWidth: 400 }}
          initialValues={{ remember: true }}
          onFinish={onFinish}
          autoComplete="off"
        >
          <Form.Item
            label="学生姓名"
            name="name"
            rules={[{ required: true, message: '请输入学生姓名' }]}
          >
            <Input />
          </Form.Item>
          <Form.Item
            label="年龄"
            name="age"
            rules={[{ required: true, message: '请输入年龄' }]}
          >
            <InputNumber  />
          </Form.Item>
          <Form.Item
            label="专业"
            name="major"
            rules={[{ required: true, message: '请输入专业' }]}
          >
            <Input />
          </Form.Item>
          <Form.Item label="性别" name='gender' rules={[{required:true,message:'请选择性别'}]}>
            <Radio.Group>
              <Radio value={0}> 男 </Radio>
              <Radio value={1}> 女 </Radio>
            </Radio.Group>
          </Form.Item>
          <Form.Item wrapperCol={{ offset: 8, span: 16 }}>
            <Button type="primary" htmlType="submit">
              确认提交
            </Button>
          </Form.Item>
        </Form>
      </Modal>

效果图

更新学生

我们与新增学生同一个表单

首先设置操作列 record 是当前行的数据对象

    {
      title: '操作',
      key: 'action',
      render: (record)=>(
        <span>
          <Button 
            style={{'backgroundColor':'orange','color':'white', 'marginRight':'5px'}} 
            onClick={()=>handleOpenUpdateModal(record)}>
              编辑
          </Button>
          <Button type='primary' danger>删除</Button>
        </span>
      )
    },

然后在打开弹窗后,编辑更新表单数据

 //用一个变量来记录,当前是否是更新状态
  const [isUpdate,setIsUpdate] = useState(false)
  //打开编辑弹窗
  const handleOpenUpdateModal = (value) => {
    form.setFieldsValue(value)//将当前行的数据赋值给表单
    setIsUpdate(true)
    setIsModalOpen(true)
  }
  //编辑学生
  const handleUpdateStudent = async (value) => {
    await updateStudent(value.id,value)
    message.success('编辑成功')
    setIsModalOpen(false)
    setParams({
      ...params
    })
  }

 优化弹窗和表单,注意我添加了一个隐藏Form.Item来存储学生id

{/* 新建/更新学生 */}
      <Modal 
        title={isUpdate?'编辑学生':'新增学生'}
        open={isModalOpen} 
        onCancel={handleCancel} 
        footer={[]}// 设置footer为空,去掉 取消 确定默认按钮
        >
        <Form
          form={form}//使用 Form 组件的 form 属性将 form 对象与 Form 组件进行关联
          name="basic"
          labelCol={{ span: 8 }}
          wrapperCol={{ span: 16 }}
          style={{ maxWidth: 400 }}
          initialValues={{ remember: true }}
          onFinish={isUpdate? handleUpdateStudent : handleCreateStudent}
          autoComplete="off"
        >
          <Form.Item name='id' hidden>
            <Input/>
          </Form.Item>
          <Form.Item
            label="学生姓名"
            name="name"
            rules={[{ required: true, message: '请输入学生姓名' }]}
          >
            <Input />
          </Form.Item>
          <Form.Item
            label="年龄"
            name="age"
            rules={[{ required: true, message: '请输入年龄' }]}
          >
            <InputNumber  />
          </Form.Item>
          <Form.Item
            label="专业"
            name="major"
            rules={[{ required: true, message: '请输入专业' }]}
          >
            <Input />
          </Form.Item>
          <Form.Item label="性别" name='gender' rules={[{required:true,message:'请选择性别'}]}>
            <Radio.Group>
              <Radio value={0}> 男 </Radio>
              <Radio value={1}> 女 </Radio>
            </Radio.Group>
          </Form.Item>
          <Form.Item wrapperCol={{ offset: 8, span: 16 }}>
            <Button type="primary" htmlType="submit">
              确认提交
            </Button>
          </Form.Item>
        </Form>
      </Modal>

效果图

删除学生

单个删除

首先,为了避免用户手滑误删,我们用个popover包裹一下删除按钮,进行二次确认

{
      title: '操作',
      key: 'action',
      render: (record)=>(
        <span>
          <Button 
            style={{'backgroundColor':'orange','color':'white', 'marginRight':'5px'}} 
            onClick={()=>handleOpenUpdateModal(record)}>
              编辑
          </Button>
          <Popover 
            title='警告!您确定要删除吗?' 
            content={
                <Button
                  onClick={() => handleDeleteStudent(record.id)}
                  type='primary' danger
                  >
                  确定
                </Button>
              }>
            <Button type='primary' danger>删除</Button>
          </Popover>
        </span>
      )
    },

然后就可以编写删除的逻辑了

  //删除学生
  const handleDeleteStudent = async (id) => {
    await deleteStudent(id)
    message.success('删除成功')
    setParams({
      ...params
    })
  }

效果如图

批量删除 

还记得最开始写的批量选中事件吗,我们可以直接这些得到的id数组使用fori遍历循环,每个都调用一次删除方法就可以了

首先我们还是需要对批量删除按钮进行二次确认警告的设置

<Popover 
   trigger="click" //注意要改为点击模式,默认为hover,但是如果是hover的话,批量按钮即使是disable也会弹出来确认框
   title='警告!您确定要删除这些学生吗?' 
   content={
     <Button
     onClick={handleBatchDelete}
     type='primary' danger
      >
      确定
      </Button>
   }>
     <Button type="primary" danger disabled={selectedRowKeys.length === 0} >批量删除</Button>
</Popover>

 然后就是逻辑处理

  //批量删除
  const handleBatchDelete = ()=>{
    for(let i = 0; i < selectedRowKeys.length; i++){
      deleteStudent(selectedRowKeys[i])
    }
    setParams({
      ...params
    })
  }

效果图

完结

以上所有的增删查改就做完了

gitee代码也做了同步更新

React 增删查改: 使用react完成一个简单的学生管理增删查改项目icon-default.png?t=N7T8https://gitee.com/a-kodak-duck/react-crud.git

【React+antd】React结合antd实现表格的增删改查 采用 React + Antd + JavaScript + axios ,完成了简单Table的增删改查功能 阅读详情

相关推荐

Material-UI 5.13实现用户信息的增删改查(基于React/TypeScript)

以下代码中,User 类型表示用户信息,UserForm 组件用于编辑用户信息,UserTable 组件用于显示用户列表,App 组件是整个应用的入口,包含添加用户、编辑用户、删除用户等功能。 在 App 组件中,使用 useState 钩子来管理用户列表,通过传递回调函数来实现添加、编辑、删除用户等功能。 在 UserForm 组件中,使用 useState 钩子来管理表单数据,通过传递回调函数来实现保存和取消编辑等功能。

大道至简 706

react实现列表增删改查的小demo(class组件版)

react的语法上就是比vue麻烦不少,既然要开手动挡,那就开吧,一个基础的demo。

m0_54741495的博客 844

React Native如何快速集成华为AGC云数据库服务

AppGallery Connect(简称AGC)云数据库服务提供了端云数据的协同管理、统一的数据模型和丰富的数据管理API接口等能力。在保证数据的可用性、可靠性、一致性,以及安全等特性基础上,能够实现数据在客户端和云端之间的无缝同步,并为应用提供离线支持,以帮助开发者快速构建端云、多端协同的应用。在本文中,您将建立一个基于AppGallery Connect云数据库的React Native应用程序,您的应用程序将具备数据的新增、查询和删除功能,具备数据的端云同步功能。 在AppGallery Conn

华为开发者联盟 466

React antd 表格新增 表格修改 删除 表格数据回显

弹窗中就设置form的initValues就是穿过来的formValue的值,如果是新增的时候就是一个空对象,然后新增的每一项的值填写一个才有一个,如果需要默认值的话就需要设置对象合并{默认值,…这种方式就是通过判断在点击修改的数据对formValue的值判断只有这个值的key长度不为零才渲染修改的组件,这里采用了两个同一个组件的方式,通过不同的弹窗状态去判断显示是新增还是修。这种方式通过form.resetFields();form.setFieldsValue方式设置form的值。

qq_42704945的博客 6195

用 Yjs + React 写一个支持协同的 TODO 应用

大家好,我是前端西瓜哥。为了测试 Yjs 的协同能力,我实现了支持协同简单的 TODO 应用。

fe_watermelon的博客 1971

react实例-增删改查 人员管理系统

react实例-增删改查 人员管理系统 有编译后的可直接运行的html文件,也有react组件后的js文件

React + Ant Design 实战教程:手把手实现增删查改列表》 《React 中使用 Ant Design:从安装到实现 CRUD 功能》 《Ant Design 入门指南:在 React

React + Ant Design 实战教程:手把手实现增删查改列表》 《React 中使用 Ant Design:从安装到实现 CRUD 功能》 《Ant Design 入门指南:在 React 中构建增删查改列表》 《React 开发必备:Ant Design 组件库使用详解》 《React + Ant Design 快速上手:实现一个完整的 CRUD 列表》React + Ant Design 实战教程:手把手实现增删查改列表》 《React 中使用 Ant Design:从安装到实现 CRUD 功

南北极之间 1328

文献计量VOSviewer分析知网文献基本操作及实用技巧

本教程旨在为读者提供一个关于VOS viewer的初级使用指南。VOS viewer是一个强大的科学研究可视化工具,主要用于构建和可视化科学地图。它能够处理大规模的科研数据,包括文献引用、共引、共词、共作者等信息。无论你是科研人员,还是数据分析师,甚至是研究生,都能在这个教程中找到使用VOS viewer的有效方法。我们将一步步教你如何使用这个软件,以及如何利用它进行科研数据的可视化。

Jia_n的博客 8769

Laravel Inertia ReactJS Starter:开箱即用的后端开发利器

???? Laravel Inertia ReactJS Starter:开箱即用的后端开发利器 在当今快速发展的网络世界中,寻找一个能够迅速启动你的Web应用程序的框架至关重要。今天,我将向大家介绍一款集成了Laravel 9、React.js和Inertia.js的强大开源项目——Laravel Inertia ReactJS Starter。 ???? 项目介绍 Laravel Inertia Reac...

gitblog_00050的博客 624

WINDOWS下SIP拨号的实现

在WIN10上拨打SIP电话  由于我的交换原理实验有一个是关于SIP的抓包的。而之前从未接触过SIP,所以在如何完成一次SIP拨号上遇到了不少问题,查了好多资料都没有完整的或者写的很清楚的,这里就对那些资料做一个总结,给出一个比较完善的解决方案,一来是记录此次实验的收获,而来也可能为其他有同样困惑的人解惑。  废话不多说直接开始。首先是下载一个可以拨打SIP电话的客户终端,这里我选择的是MicroSIP, 下载红圈内的文件,下载好之后直接一路安装即可,没有什么特别注意的地方。  安装好客户端之后,就需要注

weixin_43918519的博客 3808

minist手写数字的识别代码复现(pytorch 版本)

电脑系统:Windows 10语言环境:Python 3.8.18编译器:jupyter notebook深度学习环境:torch == 1.13.1+cu116显卡及显存: Tesla V100-PCIE-32GB卷积神经网络(Convolutional Neural Network,CNN或ConvNet)是一种 具有局部连接、权重共享等特性的深层前馈神经网络. 目前的卷积神经网络一般是由卷积层、汇聚层和全连接层交叉堆叠而成的 前馈神经网络。

2202_75521293的博客 2620

React 快速入门GraphQL

我是傲夫靠斯,欢迎关注我的公众号【前端工程师的自我修养】,搜索f2ef2e,每天更新。 我们使用AWS AppSync服务可以让我们快速创建出可用的GraphQL服务,不用我们自己去搭建GraphQL服务。 前置要求 我们需要一个美国区的AWS账号(中国区的我没试过) 什么是GraphQL 官网:https://graphql.org/ GraphQL是一种API查询语言和运行时,我们可以自己定义想要查询的数据。 为什么要用GraphQL? 解决前端和后端的沟通成本问题 前端可以自己去定义想要的数据字.

小帅的编程笔记 565

奇迹mu服务端DATA文件解析:从基础配置到高级玩法

本文深入解析奇迹MU服务端DATA文件的核心配置与高级玩法,涵盖基础设置、怪物AI系统、技能战斗机制、副本事件管理及物品商城定制。通过详细示例和实用技巧,帮助开发者掌握从经验倍率调整到动态事件触发的全方位配置方法,实现个性化的私服搭建与运营。

weixin_29254673的博客 532

React博客项目教程

React博客项目教程 1、项目介绍 react-blog 是一个基于 React 框架的个人博客项目。该项目采用前后端分离的架构,前端使用 React 技术栈,包括 React、React-Redux、React-Thunk、React-Router、Axios 等,后端则使用 Spring Boot 提供 RESTful API 接口。项目的主要功能包括博客的增删查改、用户登录注册、评论系统、...

gitblog_00070的博客 817

小白投资理财 - 解读威廉分形指标 Williams Fractals

威廉分形指标用于识别价格趋势中的关键点,帮助判断支撑位和阻力位。

wumingxiaoyao的博客 4339

【虚幻引擎UE】UE5 阴影异常与优化

【虚幻引擎UE】UE5 阴影异常与优化解决方案合集

灵境引路人 3万+

React+Express的后台权限管理系统

后台权限管理系统React+Express

weixin_45776070的博客 1654

1、CUDA 编程基础

GPU计算的发展历程与重要性。首先回顾了计算机技术的发展,特别是摩尔定律的影响,强调了计算能力的快速提升。然而,随着晶体管尺寸的缩小和频率的停滞,单线程性能增长放缓。为了继续提升性能,多核处理器开始普及,促使软件开发者开始考虑并行计算。介绍了延迟导向设计和吞吐量导向设计的概念,CPU和GPU分别代表了这两种设计方法。GPU是吞吐量导向的,拥有众多弱小的ALU,通过流水线处理提高算术吞吐量。GPU的成功在于其高并行性和高吞吐量,以及能够分摊高昂的固定成本的大量销售额。

Justinyh的博客 580

React Native Calendar Events完全指南:如何在iOS和Android应用中集成日历功能

想要为你的React Native应用添加完整的日历功能吗?📱 React Native Calendar Events是一个强大的跨平台日历事件管理库,让你能够在iOS和Android应用中轻松集成日历功能。这个开源项目提供了完整的日历API支持,包括创建事件、读取日历、管理提醒等功能。无论是开发日程管理应用、会议提醒工具,还是需要与系统日历集成的任何应用,这个库都能帮你快速实现需求。 ##

gitblog_00311的博客 677

国资e学快速学习实战教程

本文主要介绍了国资e学快速学习实战教程,希望能对同学们有所帮助。 文章目录 1. 前言 2. 实战教程

weixin_43178406的博客 11万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

React Native Calendar Events与Expo集成:无需eject的日历功能实现方案

在React Native应用开发中,日历功能是许多应用的核心需求。React Native Calendar Events是一个强大的跨平台日历事件管理库,支持iOS和Android系统。本文将详细介绍如何将这个功能强大的日历模块与Expo框架无缝集成,实现无需eject的完整日历功能解决方案。 ## 📱 为什么选择React Native Calendar Events? React N

gitblog_00866的博客 985

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

React工程化笔记

React脚手架,TodoList 案例,脚手架配置代理,axios 发送请求,消息订阅发布,React 路由,React 路由传参,React 路由跳转

山雀的博客 1256

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

推荐项目:React IndexedDB Hook - 拥抱前端本地存储的高效之道

推荐项目:React IndexedDB Hook - 拥抱前端本地存储的高效之道 在现代Web开发中,提升用户体验已成为核心目标之一。而高效、灵活地管理本地数据,无疑是实现这一目标的关键环节。今天,我们为你介绍一个强大的开源库——React IndexedDB Hook,它为React开发者提供了一个优雅的接口,简化了IndexedDB的使用,让本地数据存储变得更加简单和直观。 项目介绍 Rea...

gitblog_01191的博客 567

AgentScope 2.0 快速上手:让 AI 智能体的每一步操作都可见可控

给终端里的编码智能体一句"清理项目中的废弃代码",它在动手前先弹出工具确认卡片,改动文件时逐条展示结果,随时可以 Ctrl+C 打断。这种透明的协作体验不用自己拼装,AgentScope 2.0 开箱就能提供。 ## 项目定位:它是什么,适合谁 AgentScope 是阿里通义实验室 SysML 团队开源的智能体框架,采用 Apache 2.0 协议,要求 Python 3.11 及以上。它把

gitblog_00175的博客 366

react-native简单入门和实例分析

React-Native学习指南,react-native是目前可以说是最火的跨平台解决方案,从一开始的web到js调用原生nativescript到现在的react-native,时代在程序员的手中不断更替,从硬件到软件的不断升级我们看到了一个跨平台的优秀解决方案。 首先是reactjs原理的简易和优秀可以很容易被大家接受并深入其中,react-native继承了这有的容易理解的特性,同时保留了

sinat_27306957的专栏 776

探索 React Admin Plus: 企业级管理后台的高效解决方案

探索 React Admin Plus: 企业级管理后台的高效解决方案 是一个基于 React 和 Material UI 的强大且可定制的企业级后台管理系统框架。它旨在简化开发流程,让开发者可以快速构建功能丰富的后台应用。 技术分析 React:React Admin Plus 基于 Facebook 开发的 React 框架,利用其组件化思想和虚拟DOM,提供了高效的页面渲染性能。 M...

gitblog_00095的博客 341
上一篇: json-server 增删查改 快速上手
下一篇: json-server 分页不起作用
前端开发洋洋
博客等级 码龄3年 77粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值