简体   繁体   English

如何在请求中设置主体以使用 RTK 查询更新记录?

[英]How to set body in request to update record using RTK query?

In EditEmployee component after editing when I click on "Save Changes" button the updateEmployee method for some reason does not send body in PUT request.在编辑后的EditEmployee组件中,当我单击“保存更改”按钮时, updateEmployee方法出于某种原因不会在PUT请求中发送正文。

What am I doing wrong here?我在这里做错了什么?

EditEmployee.js编辑员工.js

import React, { useState } from 'react';

import { useUpdateEmployeeMutation } from "./employeesApiSlice";

function EditEmployee(props) {
    const [updateEmployee] = useUpdateEmployeeMutation();
    
    const [updatedFirstName, setUpdatedFirstName] = useState(props.employee.firstName);
    const [updatedLastName, setUpdatedLastName] = useState(props.employee.lastName);
    const [updatedPosition, setUpdatedPosition] = useState(props.employee.position);

    const jobPositions = ['Labor', 'Worker', 'Supervisor', 'Manager', 'HR', 'Director', 'CEO']
        .map((jobPosition, i) => (
            <Col key={i}>
                <Form.Group className="mb-3" controlId={jobPosition.toLowerCase()}>
                    <Form.Check
                        type="radio"
                        name="position"
                        label={jobPosition}
                        value={jobPosition.toLowerCase()}
                        defaultChecked={props.employee.position.toLowerCase() === jobPosition.toLowerCase()}
                        onChange={e => setUpdatedPosition(e.target.value)}
                    />
                </Form.Group>
            </Col>
    ));

    function handleSaveChanges() {
        const employee = {
            firstName: updatedFirstName,
            lastName: updatedLastName,
            position: updatedPosition
        }
        updateEmployee(props.employee.id, employee)
    }

    return (
        <>
           <Form>
              <Form.Group className="mb-3" controlId="formFirstName">
                 <Form.Label>First Name</Form.Label>
                 <Form.Control type="text" defaultValue={updatedFirstName} onChange={e => setUpdatedFirstName(e.target.value)} />
              </Form.Group>
              <Form.Group className="mb-3" controlId="formLastName">
                 <Form.Label>Last Name</Form.Label>
                 <Form.Control type="text" defaultValue={updatedLastName} onChange={e => setUpdatedLastName(e.target.value)} />
              </Form.Group>
              <Container>
                 <Row>
                    {jobPositions}
                 </Row>
              </Container>
           </Form>
                
           <Button variant="success" onClick={() => handleSaveChanges()}>
               Save Changes
           </Button>
       </>
    );
}

export default EditEmployee;

employeeApiSlice.js employeeApiSlice.js

import { apiSlice } from "../../app/api/apiSlice";

export const employeesApiSlice = apiSlice.injectEndpoints({
    tagTypes: ['Employees'],
    endpoints: (builder) => ({
        getEmployees: builder.query({
            query: () => ({
                url:'/employee'
            }),
            providesTags:['Employees'],
            keepUnusedDataFor: 2
        }),
        updateEmployee: builder.mutation({
            query: (id, employee) => ({
                url: `/employee/${id}`,
                method: 'PUT',
                body: employee
            }),
            invalidatesTags: ['Employees']
        }),
        addEmployee: builder.mutation({
            query: (employee) => ({
                url: `/employee`,
                method: 'POST',
                body: employee
            }),
            invalidatesTags: ['Employees']
        })
    }),
});

export const {
    useGetEmployeesQuery,
    useUpdateEmployeeMutation,
    useAddEmployeeMutation
} = employeesApiSlice;

The query callback of an endpoint takes a single argument.端点的query回调采用单个参数。

See: Mutation Endpoint Definition请参阅: 突变端点定义

export type MutationDefinition< QueryArg, BaseQuery extends BaseQueryFn, TagTypes extends string, ResultType, ReducerPath extends string = string, Context = Record<string, any> > = { query(arg: QueryArg): BaseQueryArg<BaseQuery> <---- Single Argument /* either `query` or `queryFn` can be present, but not both simultaneously */ queryFn( arg: QueryArg, api: BaseQueryApi, extraOptions: BaseQueryExtraOptions<BaseQuery>, baseQuery: (arg: Parameters<BaseQuery>[0]) => ReturnType<BaseQuery> ): MaybePromise<QueryReturnValue<ResultType, BaseQueryError<BaseQuery>>> /* transformResponse only available with `query`, not `queryFn` */ transformResponse?( baseQueryReturnValue: BaseQueryResult<BaseQuery>, meta: BaseQueryMeta<BaseQuery>, arg: QueryArg ): ResultType | Promise<ResultType> /* transformErrorResponse only available with `query`, not `queryFn` */ transformErrorResponse?( baseQueryReturnValue: BaseQueryError<BaseQuery>, meta: BaseQueryMeta<BaseQuery>, arg: QueryArg ): unknown extraOptions?: BaseQueryExtraOptions<BaseQuery> invalidatesTags?: ResultDescription<TagTypes, ResultType, QueryArg> onQueryStarted?( arg: QueryArg, { dispatch, getState, extra, requestId, queryFulfilled, getCacheEntry, }: MutationLifecycleApi ): Promise<void> onCacheEntryAdded?( arg: QueryArg, { dispatch, getState, extra, requestId, cacheEntryRemoved, cacheDataLoaded, getCacheEntry, }: MutationCacheLifecycleApi ): Promise<void> }

If you need to pass multiple values they should be packed in an object.如果您需要传递多个值,则应将它们打包在一个 object 中。

Example:例子:

updateEmployee: builder.mutation({
  query: ({ id, employee }) => ({
    url: `/employee/${id}`,
    method: 'PUT',
    body: employee
  }),
  invalidatesTags: ['Employees']
}),
function handleSaveChanges() {
  const employee = {
    firstName: updatedFirstName,
    lastName: updatedLastName,
    position: updatedPosition
  };

  updateEmployee({ id: props.employee.id, employee });
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM