我不知道如何调用组件中的函数,将它们作为参数传递.例如,接受完整的参观或删除.以便在后端和store 中进行更新.

以下是我的接口:

import { TourType } from "../../types/types";
import { api } from "./api";

export const tourAPI = api.injectEndpoints({
  endpoints: (builder) => ({
    getAllTour: builder.query<{ message: string; data: TourType[] }, void>({
      query: () => ({
        url: "/tour",
        method: "GET",
      }),
    }),
    getTourByTourNumber: builder.query<TourType, string>({
      query: (number) => ({
        url: `/tour/number/${number}`,
        method: "GET",
      }),
    }),
    editTour: builder.mutation<string, TourType>({
      query: (tour) => ({
        url: `/tour`,
        method: "PUT",
        body: tour,
      }),
    }),
    removeTour: builder.mutation<string, number>({
      query: (number) => ({
        url: `/tour`,
        method: "DELETE",
        body: { number: number },
      }),
    }),
    addTour: builder.mutation<TourType, TourType>({
      query: (tour) => ({
        url: "/tour/create",
        method: "POST",
        body: tour,
      }),
    }),
  }),
});

export const {
  useGetAllTourQuery,
  useGetTourByTourNumberQuery,
  useEditTourMutation,
  useRemoveTourMutation,
  useAddTourMutation,
} = tourAPI;

export const {
  endpoints: {
    getAllTour,
    getTourByTourNumber,
    editTour,
    removeTour,
    addTour
  },
} = tourAPI;

我的切入点是:

import { createSlice } from "@reduxjs/toolkit";
import { TourType } from "../../types/types";
import { tourAPI } from "../api/tourAPI";
import { RootState } from "../../store/store";

interface InitialState {
  tour: TourType[];
  loading: boolean;
}

const initialState: InitialState = {
  tour: [],
  loading: true,
};

const slice = createSlice({
  name: "tour",
  initialState,
  reducers: {
    logout: () => initialState,
  },
  extraReducers: (builder) => {
    builder.addMatcher(
      tourAPI.endpoints.getAllTour.matchFulfilled,
      (state, action) => {
        state.tour = action.payload.data;
      }
    );
  },
});

export default slice.reducer;

export const selectTour = (state: RootState): TourType[] => state.tour.tour;

现在我可以通过这种方式获得所有的旅游:

const { data, isLoading } = useGetAllTourQuery();

我是这样添加的:

const [addTour] = useAddTourMutation();
... 

const handleAddTour = async (data: TourType) => {
  try {
    await addTour(data).unwrap();
  } catch (err) {
    const maybeError = isErrorWithMessage(err);
    
    if (maybeError) {
      setError(err.data.message);
    } else {
      setError("Error");
    }
  }
};

旅游已添加,但store 不会更新,新的store 也不会出现在页面上.

推荐答案

看起来你并没有做什么来更新store .

您已经向状态添加了额外的减法器,这将在getAllTour查询的成功结果上更新状态,但是您还没有为addTour添加额外的减法器.

您应该在切片中进行更改:

const slice = createSlice({
  name: "tour",
  initialState,
  reducers: {
    logout: () => initialState,
  },
  extraReducers: (builder) => {
    builder.addMatcher(
      tourAPI.endpoints.getAllTour.matchFulfilled,
      (state, action) => {
         state.tour = action.payload.data;
      }
    );
    builder.addMatcher(
      tourAPI.endpoints.addTour.matchFulfilled,
      (state, action) => {
        state.tour.push(action.payload.data);
      }
    );
  },
});

Typescript相关问答推荐

使用React处理Websocket数据

如何键入函数以只接受映射到其他一些特定类型的参数类型?

打字脚本中泛型和直接类型重新映射的不同行为

隐式键入脚本键映射使用

具有泛型类型和缺省值的键

获取函数中具有动态泛型的函数的参数

如何在另一个参数类型中获取一个参数字段的类型?

如何使默认导出与CommonJS兼容

是否存在类型联合的替代方案,其中包括仅在某些替代方案中存在的可选属性?

使用Redux Saga操作通道对操作进行排序不起作用

笛卡尔产品类型

按函数名的类型安全类型脚本方法包装帮助器

为什么在泛型方法中解析此promise 时会出现类型错误?

如何在Reaction Native中关注屏幕时正确更新状态变量?

获取类属性的类型';TypeScript中的getter/setter

如何在TypeScript中将元组与泛型一起使用?

Karma Angular Unit测试如何创建未解析的promise并在单个测试中解决它,以判断当时的代码是否只在解决后运行

如何在没有空接口的情况下实现求和类型功能?

是否可以从 TypeScript 的类型推断中排除this?

如何为对象创建类型,其中键是只读且动态的,但值是固定类型?