【问题标题】:Using useSelector in React Function Component在 React 函数组件中使用 useSelector
【发布时间】:2021-04-14 10:01:10
【问题描述】:

我在 baseReducer.ts 中声明了一个状态:

import {PayloadAction} from '~common/declarations/action';

const initialState = {
  test: 'baseReducer'
};

const BaseReducer = (state = initialState, action: PayloadAction<any>): any => {
  switch(action.type) {
    default:
      return state;
  }
}

export default BaseReducer;

然后在我的 orderReducer 中:

import {PayloadAction} from '~common/declarations/action';

const initialState = {
  test: 'orderReducer'
};

const OrderReducer = (state = initialState, action: PayloadAction<any>): any => {
  switch(action.type) {
    default:
      return state;
  }
}

export default OrderReducer ;

在我的 rootReducer 中:

const RootReducer: Reducer = combineReducers({
  BaseReducer,
  OrderReducer
});

export default RootReducer;

现在在我的功能组件中OrderPage.tsx

export default function OrderPage() {
  const stringText: string = useSelector(state => state.test)  // HERE
  return (
    <React.Fragment>Order Page</React.Fragment>
  );
}

这是我的问题

如何定义从哪个状态获取?理想情况下,我想从OrderReducer 指定状态。

使用 react 类时,我可以执行以下操作:

const mapStateToProps = ({orderReducer}) => {
  return {
    test: orderReducer.test
  }
}

编辑:

我尝试了以下(当然是单独的!),但没有奏效:

const reducer: string = useSelector(state => state.baseReducer);
const reducer: string = useSelector(state => state.orderReducer);

如何在功能组件中实现同样的功能?

【问题讨论】:

  • 功能组件 - 不是功能组件。有状态的函数没有任何功能:)
  • 我认为 baseReducer 不存在 try const reducer: string = useSelector(state => state.OrderReducer);这是根据你如何组合减速器 const RootReducer: Reducer = combineReducers({ BaseReducer, OrderReducer });

标签: javascript reactjs redux react-hooks


【解决方案1】:

您需要在useSelector中使用正确的选择器功能:

const stringText = useSelector(state => state.OrderReducer.test)

或者,如果你这样写(不使用property name shorthand):

const RootReducer: Reducer = combineReducers({
  base: BaseReducer,
  order: OrderReducer
});

然后

const stringText = useSelector(state => state.order.test)

你可以通过定义RootState类型来进一步避免这个错误:

export type RootState = ReturnType<typeof store.getState>
// ...
const stringText = useSelector((state: RootState) => state.OrderReducer.test)

编辑:

如果遇到错误:

OrderReducer 在 DefaultRootState 上不存在。

那么你应该定义RootState 类型,因为DefaultRootState 只是 export interface DefaultRootState {}.

【讨论】:

  • 我尝试了第一个解决方案,但 intellij 声称在 DefaultRootState 上不存在 OrderReducer。这与 RootState 有什么不同?
  • 我应该在哪里导出 RootState 类型?
  • 你是说状态对象吗? Store 对象是在我的 App.tsx 文件中使用 redux 的默认方法创建的
猜你喜欢
  • 1970-01-01
  • 2022-12-09
  • 2019-11-29
  • 2022-01-12
  • 2021-05-05
  • 2020-11-20
  • 2020-10-23
  • 2021-11-18
  • 1970-01-01
相关资源
最近更新 更多