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

huangapple go评论113阅读模式
英文:

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

问题

EditEmployee组件中,在编辑后,当我点击"保存更改"按钮时,updateEmployee方法出现了某种原因不能发送PUT请求的请求体。

我在这里做错了什么?

EditEmployee.js

  1. import React, { useState } from 'react';
  2. import { useUpdateEmployeeMutation } from "./employeesApiSlice";
  3. function EditEmployee(props) {
  4. const [updateEmployee] = useUpdateEmployeeMutation();
  5. const [updatedFirstName, setUpdatedFirstName] = useState(props.employee.firstName);
  6. const [updatedLastName, setUpdatedLastName] = useState(props.employee.lastName);
  7. const [updatedPosition, setUpdatedPosition] = useState(props.employee.position);
  8. const jobPositions = ['Labor', 'Worker', 'Supervisor', 'Manager', 'HR', 'Director', 'CEO']
  9. .map((jobPosition, i) => (
  10. <Col key={i}>
  11. <Form.Group className="mb-3" controlId={jobPosition.toLowerCase()}>
  12. <Form.Check
  13. type="radio"
  14. name="position"
  15. label={jobPosition}
  16. value={jobPosition.toLowerCase()}
  17. defaultChecked={props.employee.position.toLowerCase() === jobPosition.toLowerCase()}
  18. onChange={e => setUpdatedPosition(e.target.value)}
  19. />
  20. </Form.Group>
  21. </Col>
  22. ));
  23. function handleSaveChanges() {
  24. const employee = {
  25. firstName: updatedFirstName,
  26. lastName: updatedLastName,
  27. position: updatedPosition
  28. }
  29. updateEmployee(props.employee.id, employee)
  30. }
  31. return (
  32. <>
  33. <Form>
  34. <Form.Group className="mb-3" controlId="formFirstName">
  35. <Form.Label>First Name</Form.Label>
  36. <Form.Control type="text" defaultValue={updatedFirstName} onChange={e => setUpdatedFirstName(e.target.value)} />
  37. </Form.Group>
  38. <Form.Group className="mb-3" controlId="formLastName">
  39. <Form.Label>Last Name</Form.Label>
  40. <Form.Control type="text" defaultValue={updatedLastName} onChange={e => setUpdatedLastName(e.target.value)} />
  41. </Form.Group>
  42. <Container>
  43. <Row>
  44. {jobPositions}
  45. </Row>
  46. </Container>
  47. </Form>
  48. <Button variant="success" onClick={() => handleSaveChanges()}>
  49. Save Changes
  50. </Button>
  51. </>
  52. );
  53. }
  54. export default EditEmployee;

employeeApiSlice.js

  1. import { apiSlice } from "../../app/api/apiSlice";
  2. export const employeesApiSlice = apiSlice.injectEndpoints({
  3. tagTypes: ['Employees'],
  4. endpoints: (builder) => ({
  5. getEmployees: builder.query({
  6. query: () => ({
  7. url:'/employee'
  8. }),
  9. providesTags:['Employees'],
  10. keepUnusedDataFor: 2
  11. }),
  12. updateEmployee: builder.mutation({
  13. query: (id, employee) => ({
  14. url: `/employee/${id}`,
  15. method: 'PUT',
  16. body: employee
  17. }),
  18. invalidatesTags: ['Employees']
  19. }),
  20. addEmployee: builder.mutation({
  21. query: (employee) => ({
  22. url: `/employee`,
  23. method: 'POST',
  24. body: employee
  25. }),
  26. invalidatesTags: ['Employees']
  27. })
  28. }),
  29. });
  30. export const {
  31. useGetEmployeesQuery,
  32. useUpdateEmployeeMutation,
  33. useAddEmployeeMutation
  34. } = employeesApiSlice;

希望这对你有所帮助。

英文:

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.

What am I doing wrong here?

EditEmployee.js

  1. import React, { useState } from &#39;react&#39;;
  2. import { useUpdateEmployeeMutation } from &quot;./employeesApiSlice&quot;;
  3. function EditEmployee(props) {
  4. const [updateEmployee] = useUpdateEmployeeMutation();
  5. const [updatedFirstName, setUpdatedFirstName] = useState(props.employee.firstName);
  6. const [updatedLastName, setUpdatedLastName] = useState(props.employee.lastName);
  7. const [updatedPosition, setUpdatedPosition] = useState(props.employee.position);
  8. const jobPositions = [&#39;Labor&#39;, &#39;Worker&#39;, &#39;Supervisor&#39;, &#39;Manager&#39;, &#39;HR&#39;, &#39;Director&#39;, &#39;CEO&#39;]
  9. .map((jobPosition, i) =&gt; (
  10. &lt;Col key={i}&gt;
  11. &lt;Form.Group className=&quot;mb-3&quot; controlId={jobPosition.toLowerCase()}&gt;
  12. &lt;Form.Check
  13. type=&quot;radio&quot;
  14. name=&quot;position&quot;
  15. label={jobPosition}
  16. value={jobPosition.toLowerCase()}
  17. defaultChecked={props.employee.position.toLowerCase() === jobPosition.toLowerCase()}
  18. onChange={e =&gt; setUpdatedPosition(e.target.value)}
  19. /&gt;
  20. &lt;/Form.Group&gt;
  21. &lt;/Col&gt;
  22. ));
  23. function handleSaveChanges() {
  24. const employee = {
  25. firstName: updatedFirstName,
  26. lastName: updatedLastName,
  27. position: updatedPosition
  28. }
  29. updateEmployee(props.employee.id, employee)
  30. }
  31. return (
  32. &lt;&gt;
  33. &lt;Form&gt;
  34. &lt;Form.Group className=&quot;mb-3&quot; controlId=&quot;formFirstName&quot;&gt;
  35. &lt;Form.Label&gt;First Name&lt;/Form.Label&gt;
  36. &lt;Form.Control type=&quot;text&quot; defaultValue={updatedFirstName} onChange={e =&gt; setUpdatedFirstName(e.target.value)} /&gt;
  37. &lt;/Form.Group&gt;
  38. &lt;Form.Group className=&quot;mb-3&quot; controlId=&quot;formLastName&quot;&gt;
  39. &lt;Form.Label&gt;Last Name&lt;/Form.Label&gt;
  40. &lt;Form.Control type=&quot;text&quot; defaultValue={updatedLastName} onChange={e =&gt; setUpdatedLastName(e.target.value)} /&gt;
  41. &lt;/Form.Group&gt;
  42. &lt;Container&gt;
  43. &lt;Row&gt;
  44. {jobPositions}
  45. &lt;/Row&gt;
  46. &lt;/Container&gt;
  47. &lt;/Form&gt;
  48. &lt;Button variant=&quot;success&quot; onClick={() =&gt; handleSaveChanges()}&gt;
  49. Save Changes
  50. &lt;/Button&gt;
  51. &lt;/&gt;
  52. );
  53. }
  54. export default EditEmployee;

employeeApiSlice.js

  1. import { apiSlice } from &quot;../../app/api/apiSlice&quot;;
  2. export const employeesApiSlice = apiSlice.injectEndpoints({
  3. tagTypes: [&#39;Employees&#39;],
  4. endpoints: (builder) =&gt; ({
  5. getEmployees: builder.query({
  6. query: () =&gt; ({
  7. url:&#39;/employee&#39;
  8. }),
  9. providesTags:[&#39;Employees&#39;],
  10. keepUnusedDataFor: 2
  11. }),
  12. updateEmployee: builder.mutation({
  13. query: (id, employee) =&gt; ({
  14. url: `/employee/${id}`,
  15. method: &#39;PUT&#39;,
  16. body: employee
  17. }),
  18. invalidatesTags: [&#39;Employees&#39;]
  19. }),
  20. addEmployee: builder.mutation({
  21. query: (employee) =&gt; ({
  22. url: `/employee`,
  23. method: &#39;POST&#39;,
  24. body: employee
  25. }),
  26. invalidatesTags: [&#39;Employees&#39;]
  27. })
  28. }),
  29. });
  30. export const {
  31. useGetEmployeesQuery,
  32. useUpdateEmployeeMutation,
  33. useAddEmployeeMutation
  34. } = employeesApiSlice;

答案1

得分: 1

"query"端点的query回调接受一个单一参数。

参见:Mutation端点定义

如果需要传递多个值,它们应该被打包在一个对象中。

示例:

  1. updateEmployee: builder.mutation({
  2. query: ({ id, employee }) => ({
  3. url: `/employee/${id}`,
  4. method: 'PUT',
  5. body: employee
  6. }),
  7. invalidatesTags: ['Employees']
  8. }),
  1. function handleSaveChanges() {
  2. const employee = {
  3. firstName: updatedFirstName,
  4. lastName: updatedLastName,
  5. position: updatedPosition
  6. };
  7. updateEmployee({ id: props.employee.id, employee });
  8. }
英文:

The query callback of an endpoint takes a single argument.

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.

Example:

  1. updateEmployee: builder.mutation({
  2. query: ({ id, employee }) =&gt; ({
  3. url: `/employee/${id}`,
  4. method: &#39;PUT&#39;,
  5. body: employee
  6. }),
  7. invalidatesTags: [&#39;Employees&#39;]
  8. }),
  1. function handleSaveChanges() {
  2. const employee = {
  3. firstName: updatedFirstName,
  4. lastName: updatedLastName,
  5. position: updatedPosition
  6. };
  7. updateEmployee({ id: props.employee.id, employee });
  8. }

huangapple
  • 本文由 发表于 2023年1月9日 08:35:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/75052282.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定