0

我第一次使用rematch/core库,成功请求内部url,但是从日期开始的数据并没有写入状态,我不明白为什么,请帮忙!

有趣的是,在导航模型中使用类似的代码,我得到了写入状态的数据

导航.ts

import { ModelConfig } from '@rematch/core';
import { NavigationItem } from '@vostok/template';
import axios from 'axios';

export const navigation: ModelConfig<NavigationItem[]> = {
  state: [],
  reducers: {
    get_fulfilled(__, payload: NavigationItem[]) {
      console.log('nav-reducer', payload);
      return payload;
    },
  },
  effects: {
    async get_request() {
      const res = await axios.get('https://platform.vostok-electra.ru/api/appconfig/navs');
      console.log("nav", res.data);
      console.log(navigation);
      return res.data;
    },
  },
  selectors: (state) => ({
    list: () => state,
  }),
};

诉讼程序.ts

import { ModelConfig } from '@rematch/core';
import axios from 'axios';
import moment, { Moment } from 'moment';

export const proceedings: ModelConfig<Models.Proceedings[]> = {
  
  state: [],
  reducers: {
    get_fulfilled(__, payload: Models.Proceedings[]) {
      console.log("prosto", payload);
      return payload;
    },
    
  },
  effects: () => ({
    async get_users() {
      const res = await axios.get('dict/User/List');
      console.log(res.data);
      return res.data;
    },
  }),
  selectors: (state) => ({
    list: () => state,
  })
};

应用程序.tsx

export default function App() {
  return (
    <StoreProvider store={store}>
      <Router>
        <Main />
      </Router>
    </StoreProvider>
  );
}

function Main() {
  const user = useUser();
  const navigation = useSelector(select.navigation.list);
  const [isLoading, loadingErrors] = useLoading('navigation/get');

  useEffect(() => {
    dispatch.navigation.get_request();
  }, []);

  return (
    <Layout
    appName="Табель судебных заседаний"
    isLoading={isLoading}
    loadingErrors={loadingErrors}
    navigation={navigation}
    user={user}
    onLogout={() => userManager.signoutRedirect()}
  >
    <RouteSwitcher
      navigation={navigation}
      defaultRedirect="/proceedings"
      routes={[
        { exact: true, path: '/proceedings', component: PageProceedings },
        { exact: true, path: '/dataset', component: PageDataSet },
      ]}
    />
    </Layout>
  );
}

store.ts

import { init } from '@rematch/core';
import { reducer as oidcReducer, UserState } from 'redux-oidc';
import { useSelector } from 'react-redux';
import loadingPlugin from '@vostok/rematch-loading';
import selectPlugin from '@rematch/select';
import * as models from './models';

const store = init({
  redux: {
    reducers: { oidc: oidcReducer },
  },
  models,
  plugins: [
    loadingPlugin({
      checkError: ({ status }) => status === 'error',
      getError: ({ errors }) => {
        if (!errors) return null;
        return errors.map(err => {
          if (typeof err === 'string') return err;
          return `[${err.code}] ${err.error}`;
        });
      },
      getResult: ({ response, items }) => response ?? items ?? null,
    }),
    selectPlugin(),
  ],
});

export default store;

export const { dispatch, select } = store;

export { useSelector } from 'react-redux';

export { useLoading } from '@vostok/rematch-loading';

export const useUser = () => (
  useSelector(({ oidc }: { oidc: UserState }) => oidc?.user?.profile ?? {})
);
4

1 回答 1

1

返回数据的效果不包括有关状态的信息,您必须使用调度方法或 this.(reducerName) 传递填充有效果数据的有效负载参数。

为了理解我以你的例子:


  reducers: {
    get_fulfilled(__, payload: NavigationItem[]) {
      console.log('nav-reducer', payload);
      return payload;
    },
  },
  effects: {
    async get_request() {
      const res = await axios.get('https://platform.vostok-electra.ru/api/appconfig/navs');
      console.log("nav", res.data);
      console.log(navigation);
      // or effects:(dispatch) => dispatch.model-name.reducername() 
      this.get_fulfilled(res.data);
    },
  },

如果您不执行 Reducers,则不会执行它们 =)

于 2021-04-05T09:52:37.620 回答