我正在try 存储所有的切片,这样我的应用程序就可以访问它,我在Stackoverflow上看到了类似的问题,他们建议使用唯一的"ReducerPath"名称.但当我更改时,我收到了另一个错误来电者

警告:ReducerPath"apifb"处的RTK-Query API中间件尚未 已添加到store 中.

还有一个疑问,在Store.js中,如果有3个以上的切片,请建议我一个更好的方法来连接它们作为中间件.

FacebookSlice

import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
import { api } from "../../config/constants";

export const facebookSlice = createApi({
    reducerPath: 'api',
    baseQuery: fetchBaseQuery({
        baseUrl: api.FACEBOOK_GRAPH_URL,
    }),
    endpoints: (builder) => ({
        getPagePhotos: builder.query({
            query: () => ({
                url: api.FB_GET_PAGE_PHOTOS_URL,
                method: 'GET'
            }),
        })
    })
})
export const {
    useGetPagePhotosQuery
} = facebookSlice

ServiceSlice.js

import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
import { api } from "../../config/constants";

export const serviceSlice = createApi({
    reducerPath: 'api',
    baseQuery: fetchBaseQuery({
        baseUrl: api.API_BASE_URL,
    }),
    endpoints: (builder) => ({
        getServices: builder.query({
            query: () => ({
                url: '/',
                method: 'GET'
            }),
        })
    })
})

export const {
    useGetServicesQuery
} = serviceSlice

BookingSlice.js

import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
import { api } from "../../config/constants";

export const bookingSlice = createApi({
    reducerPath: 'api',
    baseQuery: fetchBaseQuery({
        baseUrl: api.API_BASE_URL,
    }),
    endpoints: (builder) => ({
        getBookings: builder.query({
            query: () => ({
                url: '/bookings',
                method: 'GET'
            }),
        }),
        createBooking: builder.mutation({
            query: (booking) => ({
                url: '/bookings/create',
                method: 'POST',
                headers:{},
                body: booking
            }),
        })
    })
})

export const {
    useGetBookingsQuery,
    useCreateBookingMutation
} = bookingSlice

Store.js

import { configureStore } from '@reduxjs/toolkit';
import { facebookSlice } from './features/api/facebookSlice'; 
import { bookingSlice } from './features/api/bookingSlice'; 
import { serviceSlice } from './features/api/serviceSlice';

const store = configureStore({
    reducer: {
        [facebookSlice.reducerPath]: facebookSlice.reducer,
        [bookingSlice.reducerPath]: bookingSlice.reducer,
        [serviceSlice.reducerPath]: serviceSlice.reducer
    },
    middleware: (getDefaultMiddleware) =>                 
    getDefaultMiddleware().concat([bookingSlice.middleware, serviceSlice.middleware])
});

export default store;

Index.js

import React, { Children } from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import 'semantic-ui-css/semantic.min.css'
import App from './App';
import reportWebVitals from './reportWebVitals';
import 'bootstrap/dist/css/bootstrap.min.css';
import { RouterProvider, createBrowserRouter } from 'react-router-dom';
import Layout from './layout';
import Home from './components/home/home'
import Booking from './components/booking/booking'
import { ApiProvider } from '@reduxjs/toolkit/dist/query/react';
import { serviceSlice } from './features/api/serviceSlice';
import { Hallway } from './components/hallway/hallway';
import { Provider } from 'react-redux';
import  store  from './store';

const router = createBrowserRouter([
    {
        path: '/',
        element: <Layout />,
        children: [
            {
                path: "",
                element: <Home />
            },
            {
                path: "booking",
                element: <Booking />
            },
            {
                path: "hallway",
                element: <Hallway />
            }
        ]
    }
])

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <React.StrictMode>
        <Provider store={store}>
            <RouterProvider router={router} />
        </Provider>
    </React.StrictMode>
);
reportWebVitals();

推荐答案

Issues

  • 您有多个API分片,都使用默认的reducerPath值,例如"api",这会产生冲突.

    请参见reducerPath.

    reducerPath是将挂载您的服务的unique密钥 在你的店里.如果您在您的电话中多次拨打createApi 应用程序,则每次都需要提供唯一的值. 默认为'api'.

  • 您将把一个数组传递给getDefaultMiddleware函数,而不是直接传递中间件.

const store = configureStore({
  reducer: {
    [facebookSlice.reducerPath]: facebookSlice.reducer, // api: facebookSlice.reducer
    [bookingSlice.reducerPath]: bookingSlice.reducer,   // api: bookingSlice.reducer
    [serviceSlice.reducerPath]: serviceSlice.reducer    // api: serviceSlice.reducer
  },
  middleware: (getDefaultMiddleware) =>                 
    getDefaultMiddleware()
      .concat([ // <-- passing array, not middleware
        bookingSlice.middleware,
        serviceSlice.middleware
      ])
});

Solution

for each API切片提供唯一的减速器路径值.

export const facebookSlice = createApi({
  reducerPath: 'facebookApi', // <-- unique among API slices
  baseQuery: fetchBaseQuery({
    baseUrl: api.FACEBOOK_GRAPH_URL,
  }),
  endpoints: (builder) => ({
    getPagePhotos: builder.query({
      query: () => ({
        url: api.FB_GET_PAGE_PHOTOS_URL,
        method: 'GET'
      }),
    })
  })
});
export const serviceSlice = createApi({
  reducerPath: 'serviceApi', // <-- unique among API slices
  baseQuery: fetchBaseQuery({
    baseUrl: api.API_BASE_URL,
  }),
  endpoints: (builder) => ({
    getServices: builder.query({
      query: () => ({
        url: '/',
        method: 'GET'
      }),
    })
  })
});
export const bookingSlice = createApi({
  reducerPath: 'bookingApi', // <-- unique among API slices
  baseQuery: fetchBaseQuery({
    baseUrl: api.API_BASE_URL,
  }),
  endpoints: (builder) => ({
    getBookings: builder.query({
      query: () => ({
        url: '/bookings',
        method: 'GET'
      }),
    }),
    createBooking: builder.mutation({
      query: (booking) => ({
        url: '/bookings/create',
        method: 'POST',
        headers: {},
        body: booking
      }),
    })
  })
});

直接通过中间件,.concat个处理程序"合并"它们.

const store = configureStore({
  reducer: {
    [facebookSlice.reducerPath]: facebookSlice.reducer,
    [bookingSlice.reducerPath]: bookingSlice.reducer,
    [serviceSlice.reducerPath]: serviceSlice.reducer
  },
  middleware: (getDefaultMiddleware) =>                 
    getDefaultMiddleware()
      .concat(
        facebookSlice.middleware,
        bookingSlice.middleware,
        serviceSlice.middleware
      )
});

Javascript相关问答推荐

仅在React和JS中生成深色

D3多线图显示1线而不是3线

Klaro与Angular的集成

硬币兑换运行超时

使用javascript将Plotly Expandable Sparkline转换为HighCharter Plot在bslib卡中

如何从调整大小/zoom 的SVG路径定义新的d属性?""

PDF工具包阿拉伯字体的反转数字

使用VUE和SCSS的数字滚动动画(&;内容生成)

Rxjs流中生成IMMER不能在对象上操作

将数组扩展到对象中

SPAN不会在点击时关闭模式,尽管它们可以发送日志(log)等

如何在和IF语句中使用||和&;&;?

如何使本地html页面在重新加载时保持当前可隐藏部分的打开状态?

在渲染turbo流之后滚动到元素

使用CEPRESS截取时,cy.Wait()在等待5000ms的第一个路由请求时超时

如何在移动设备中使用JAVASSCRIPT移除点击时的焦点/悬停状态

我们是否可以在reactjs中创建多个同名的路由

在使用JavaScript以HTML格式显示Google Drive中的图像时遇到问题

当一条路由在Reaction路由中命中时,如何有条件地渲染两个组件或更改两个插座?

如何将缓冲区数组转换回音频