作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经使用 JS 与 React 进行了一些工作,但现在我正在创建一个新项目来学习使用 Typescript 的 React。当我使用JS并需要使用dispatch
时,我刚刚从 react-redux 导入 useDispatch:
import { useDispatch, useSelector } from 'react-redux';
const AuthAppBar = () => {
const dispatch = useDispatch();
const isUserLogged = useSelector(authSelector.isUserLogged);
const { event } = useGoogleAnalytics();
const userLogout = () => {
const userManager = authManager.getUserManager();
dispatch(authActions.setLoggingOut(true));
userManager.signoutRedirect({ state: { callbackUrl: routes.home.path } });
event('Account', 'Logout');
};
return <></>;
};
但是现在在这个 Typescript 项目中,文档说我需要这样做:
// hooks.ts
import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';
import type { RootState, AppDispatch } from './store';
// Use throughout your app instead of plain `useDispatch` and `useSelector`
export const useAppDispatch = () => useDispatch<AppDispatch>();
// useGetDeviceById.ts
import { useEffect } from 'react';
import { useHistory, useParams } from 'react-router-dom';
import { useAppDispatch, useAppSelector } from 'src/hooks';
const useGetDeviceById = () => {
const dispatch = useAppDispatch();
// ...
}
为什么我需要这样做?
最佳答案
您不需要这样做,但这是一个很好的便利因素,可以防止以后出现一些错误。
通常,您必须在每个组件文件中执行此操作:
// import the RootState type
import { RootState, AppDispatch } from "app/store";
import { useSelector, useDispatch } from "react-redux";
function MyComponent() {
// Specifically mark the `state` arg as being of type RootState
const todos = useSelector( (state: RootState) => state.todos);
// Specifically mark `dispatch` as being a type that understands thunks
const dispatch : AppDispatch = useDispatch();
}
不是一个巨大的成本,但重复这一点可能很烦人。此外,我们看到的最常见问题之一是人们没有使用
Dispatch
的商店特定版本。类型,并让 TS 告诉他们他们不能发送 thunk,因为那些不是普通的 action 对象。
import { useAppSelector, useAppDispatch } from "app/hooks";
function MyComponent() {
// Already knows the state is `RootState`
const todos = useAppSelector(state => state.todos);
// Already knows that `dispatch` can accept a thunk
const dispatch = useAppDispatch();
}
关于reactjs - 为什么在 React 中使用 Typescript 时需要 export const useAppDispatch = () => useDispatch<AppDispatch>(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67453258/
我已经使用 JS 与 React 进行了一些工作,但现在我正在创建一个新项目来学习使用 Typescript 的 React。当我使用JS并需要使用dispatch时,我刚刚从 react-redux
我是一名优秀的程序员,十分优秀!