将现有数据库记录加载到 React.js 表单

发布日期:2026-07-02 12:09:04   来源 : 杭州电子商务研究院    浏览量 :14
杭州电子商务研究院 发布日期:2026-07-02 12:09:04  
14

介绍

任何信息系统中的常见操作都是针对数据库中的记录执行创建读取更新删除(CRUD) 操作。在本指南中,我们将研究如何在 React.js 应用程序上下文中执行创建更新部分。该组件应该能够提供一个表单,用于将信息保存为新记录或更新现有记录。在传统方法中,为了区分来自表单的创建更新,必须存在id值以指示表单详细信息将执行更新而不是创建。然而,这是一个安全风险,因为id有时会作为 HTML 中的隐藏值或要连接的 URL 的一部分公开。在本指南中,我们将看到,我们可以使用 React.js 的状态管理方法仅在 React.js 逻辑中而不是在界面本身中维护id值。

在开始之前,让我们做三个假设:

  1. 我们将保存一个具有idfirst_namelast_name的模拟人的对象。
  2. React.js 与在https://localhost:3000/api/v1/people/save中运行的后端 API 交互
  3. 要获取现有人员的数据,我们可以通过端点https://localhost:3000/api/v1/people/fetch中的 GET 请求访问 API

本指南将在最后的Rails 服务器代码部分中提供一组有关如何使用 Ruby on Rails 实现后端的简单说明。无论如何,您仍然可以使用自己喜欢的框架来实现满足上述假设的后端。

创建表单组件

创建一个初始组件,维护反映人员数据模型的idfirst_namelast_name状态。

      import React from 'react';
import $ from 'jquery';

export default class PersonForm extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      id: props.id,
      firstName: "",
      lastName: ""
    }
  }

  updateFirstName(event) {
    this.setState({
      firstName: event.target.value 
    });
  }

  updateLastName(event) {
    this.setState({
      lastName: event.target.value 
    });
  }

  render() {
    return (
      <div>
        First Name:
        <input type="text" value={this.state.firstName} onChange={this.updateFirstName.bind(this)} />
        Last Name:
        <input type="text" value={this.state.lastName} onChange={this.updateLastName.bind(this)} />
        <hr/>

        <button>
          Save
        </button>
      </div>
    );
  }
}
    

这是一个标准的 React.js 组件,其中的逻辑最少,即利用updateFirstNameupdateLastName方法在用户更改某些内容时更新firstNamelastName的状态。还要注意,在构造函数中,你可以将id作为props的一部分传递。这表明可以挂载此组件并从调用它的父级传递id,这将提供执行更新的信息。或者,你也可以不传递 id,表明你正在使用该组件创建新记录。

与 API 交互

创建一个方法,对 API 端点/api/v1/people/save执行 POST 。该方法如下所示:

      save() {
  var context = this;

  $.ajax({
    url: "http://localhost:3000/api/v1/people/save",
    method: "POST",
    data: {
      id: context.state.id,
      first_name: context.state.firstName,
      last_name: context.state.lastName
    },
    success: function(response) {
      alert("Successfully saved record!");
    },
    error: function(response) {
      alert("Error in saving record!");
    }
  });
}
    

请注意,您首先必须为此创建一个代理,以便您仍然可以在ajax调用中引用此组件的实例,例如访问当前状态值context.state.idcontext.state.firstNamecontext.state.lastName。这将针对 API 执行 POST 方法。如果没有提供id,则它会创建一条记录。但如果最初通过props向组件提供了id,那么后端应该执行更新。

最后,将保存方法连接到组件按钮的onClick属性:

      <button onClick={this.save.bind(this)}>
  Save
</button>
    

Rails 服务器代码

确保您有一个符合前面提到的规格的应用服务器。本节将允许您使用 sqlite 数据库实现用 Ruby on Rails 编写的后端服务器,这样您除了 Rails 之外就不会有任何依赖项。

  1. 创建一个新项目。
      $ rails new sampleapi
$ cd sampleapi
    
  1. 为人创建一个模型并将其加载到数据库中。
      $ rails g model Person first_name:string last_name:string
$ rake db:migrate
    
  1. 在文件config/routes.rb中,创建 API 路由定义。
      namepsace :api do
  namespace :v1 do
    get "/people/fetch", to: "people#fetch"
    post "/people/save", to: "people#save"
  end
end
    
  1. 在app/controllers/api/v1/people_controller.rb中为 API 创建一个控制器
      module Api
  module V1
    class PeopleController < ApplicationController
      protect_from_forgery with: :null_session

      def fetch
        person = Person.find(params[:id])

        render json: person
      end

      def save
        person = Person.find_by_id(params[:id])

        if person.present?
          person.first_name = params[:first_name]
          person.last_name  = params[:last_name]
        else
          person = Person.new(first_name: params[:first_name], last_name: params[:last_name])
        end

        person.save!

        render json: { message: "success", id: person.id }
      end
    end
  end
end
    
  1. 运行服务器并将其绑定到本地主机。
      $ rails server -b 127.0.0.1
    

总体代码

最终代码应如下所示:

      import React from 'react';
import $ from 'jquery';

export default class PersonForm extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      id: props.id,
      firstName: "",
      lastName: ""
    }
  }

  updateFirstName(event) {
    this.setState({
      firstName: event.target.value 
    });
  }

  updateLastName(event) {
    this.setState({
      lastName: event.target.value 
    });
  }

  save() {
    var context = this;

    $.ajax({
      url: "http://localhost:3000/api/v1/people/save",
      method: "POST",
      data: {
        id: context.state.id,
        first_name: context.state.firstName,
        last_name: context.state.lastName
      },
      success: function(response) {
        alert("Successfully saved record!");
      },
      error: function(response) {
        alert("Error in saving record!");
      }
    });
  }

  render() {
    return (
      <div>
        First Name:
        <input type="text" value={this.state.firstName} onChange={this.updateFirstName.bind(this)} />
        Last Name:
        <input type="text" value={this.state.lastName} onChange={this.updateLastName.bind(this)} />
        <hr/>

        <button onClick={this.save.bind(this)}>
          Save
        </button>
      </div>
    );
  }
}
    

结论

只需几行代码,您现在就拥有一个可回收的组件,它可以处理从数据库创建和更新记录。当然,管理的信息在很大程度上取决于指定的属性以及要连接的 API 端点。但是,这种方法的重点是您可以利用 React.js 的状态管理机制来创建一个表单,该表单的界面反映了后端的现有架构。与其他方法相比,这种方法被认为更安全,因为 id 值永远不会在用户界面中公开。

作为一项挑战,我故意省略了从数据库获取记录的逻辑。试着看看你是否可以编写一个名为fetch(id)的方法,其逻辑是调用/api/v1/people/fetch并通过在fetch(id)<font style="vertical-align: inherit;"

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据