reactjs - Redux 使用没有 React 的功能组件
问题描述
我有一个没有 React 的功能组件,但它使用 Redux,如下所示:
export const isAuthenticated = () => ({user}) => {
console.log("user : ", user);
return true;
};
const mapStateToProps = (state) => {
return {
user: state.auth.userInfo
}
}
export default connect(mapStateToProps)(isAuthenticated as any)
并使用上述功能,我使用如下:
{isAuthenticated() && (
<li className="nav-item">
<NavLink
className="nav-link"
activeStyle={{
color: "#1ebba3"
}}
to="/dashboard"
onClick={(e) => { if (this.menu.classList.contains("show")) { this.inputElement.click() } }}
>
Dashboard
</NavLink>
</li>
)}
它不起作用。它甚至没有进入那个 isAuthenticated 函数,因为我没有看到console.log("user : ", user);
. 它应该输出类似的东西user: undefined
,但它甚至不输出。
如果我改变
export const isAuthenticated = () => ({user}) => {
至
export const isAuthenticated = ({user}) => {
那么问题是我不能用它来调用它,isAuthenticated()
并且可能是从函数调用传递的参数和从 Redux 检索的状态之间的重复。
如果我想继续使用“ isAuthenticated()
”来调用该方法,而不传递任何参数,但让 Redux 将用户状态传递给该函数,我该如何解决?
解决方案
这可以通过 React 的Hooks API解决。您的目标是一个自定义钩子,它将在内部使用useSelector
from react-redux
。如果您不想使用功能组件,您可以随时选择高阶组件(HOC)
代码示例
自定义挂钩
import { useSelector } from 'react-redux';
export function useIsAuthenticated() {
return useSelector(state => !!state.auth.userInfo);
}
export function YourComponent(props) {
const isAuthenticated = useIsAuthenticate();
// Return your react sub-tree here based on `isAuthenticated`
// instead of `isAuthenticated()` like before.
}
高阶组件
import { connect } from 'react-redux';
export function withIsAuthenticated(Component) {
function mapStateToProps(state) {
return {
isAuthenticated: !!state.auth.userInfo
};
}
return connect(mapStateToProps)(function({ isAuthenticated, ...props }) {
return <Component isAuthenticated={isAuthenticated} {...props}/>;
});
}
export function YourComponent({ isAuthenticated, ...props }) {
// Return your react sub-tree here based on `isAuthenticated`
// instead of `isAuthenticated()` like before.
}
观点
就我个人而言,我觉得 HOC 引入了比必要的复杂得多的复杂性,如果我没记错的话,这是创建 Hook API 背后的主要驱动力之一。
推荐阅读
- python - django 中的自动迁移处理
- c++ - 我不明白如何在 C++ 中使用 size_t
- c++ - 如何使用 Qt Creator 调试 C++ 项目?
- android - 为什么 IO Dispatchers 在 Kotlin corotines 中创建超过 64 个线程?
- c# - 当客户端和服务器都使用 Unity 镜像时如何处理?
- django - 为什么 django 库 xhtml2pdf 返回错误?
- jquery - 在 jQuery 中获取 :after 选择器的边距值
- google-colaboratory - Google Colab 中是否有“等待”的等价物?
- javascript - 如何为我的 django 在线电子商务网站设置 Google Pay?
- laravel - 带有 ssl 和 nginx 的 Laravel-websockets