Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何重构此Redux connect代码?_Javascript_Reactjs_Ecmascript 6_Redux_Ecmascript 5 - Fatal编程技术网

Javascript 如何重构此Redux connect代码?

Javascript 如何重构此Redux connect代码?,javascript,reactjs,ecmascript-6,redux,ecmascript-5,Javascript,Reactjs,Ecmascript 6,Redux,Ecmascript 5,我想在无状态组件(纯函数)中使用Redux connect和asyncConnect,因此我需要将这些类装饰器重构为常规函数调用 但是,我找不到带有connect anywhere的asyncConnect示例 以下是我所拥有的: @asyncConnect([{ deferred: true, promise: ({ params, store: { dispatch, getState } }) => { if (!isLoaded(getState())) {

我想在无状态组件(纯函数)中使用Redux connect和asyncConnect,因此我需要将这些类装饰器重构为常规函数调用

但是,我找不到带有connect anywhere的asyncConnect示例

以下是我所拥有的:

@asyncConnect([{
  deferred: true,
  promise: ({ params, store: { dispatch, getState } }) => {
    if (!isLoaded(getState())) {
      return dispatch(loadUser(params.userID))
    }
  },
}])
@connect(
  state => ({ // eslint-disable-line
    user: state.publicData.user.data,
    error: state.publicData.user.error,
    loading: state.publicData.user.loading,
  }),
  { initializeWithKey })
export default class UserProfile extends Component {
  ...stuff
}
asyncConnect(
  someStuff,
  connect(moreStuff)
)(props => <div />)
以下是我需要的:

@asyncConnect([{
  deferred: true,
  promise: ({ params, store: { dispatch, getState } }) => {
    if (!isLoaded(getState())) {
      return dispatch(loadUser(params.userID))
    }
  },
}])
@connect(
  state => ({ // eslint-disable-line
    user: state.publicData.user.data,
    error: state.publicData.user.error,
    loading: state.publicData.user.loading,
  }),
  { initializeWithKey })
export default class UserProfile extends Component {
  ...stuff
}
asyncConnect(
  someStuff,
  connect(moreStuff)
)(props => <div />)
异步连接(
一些东西,
连接(更多内容)
)(道具=>)

我只是不知道如何实际编写它。

您可以使用Dan在redux中提供的
compose
函数

import { compose } from 'redux';
import { connect } from 'react-redux';

...

export default compose(
  asyncConnect(...),
  connect(...)
)(props => <div />);
从'redux'导入{compose};
从'react redux'导入{connect};
...
导出默认组合(
异步连接(…),
连接(…)
)(道具=>);
compose
从右向左应用


有趣的是,这本质上是使用类所使用的decorator语法的替代方法。您可以对类使用相同的方法


还有一点建议/提示

React严重依赖于功能概念。它帮了我很大的忙,让我对其中的一些感到舒服。我强烈推荐以下免费在线书籍。你不必一直深入到单子的世界,我想说至少前6章会给你带来巨大的进步


非常有帮助,谢谢。你说这种方法也适用于类是对的,我想知道除了“更好的”语法之外,装饰器还有什么好处?我猜装饰器真正的“好处”是它们与它们所装饰的类的搭配。更容易了解类的其他行为。我对他们唯一的不满是,该功能仍在提案中,目前正在进行更新。因此,如果提案发生了变化,您的代码库将面临一些管理更新工作的风险。我认为compose不能以这种方式使用。即使是最基本的示例也会因类型错误而失败:
export default compose(function(){return true})
TypeError:(0,_reactRedux.compose)不是一个函数
My bad!您必须从
redux
导入,而不是
react redux
:)