Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.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 我可以将.getState()方法作为道具传递给我的组件吗?_Javascript_Frontend_Redux - Fatal编程技术网

Javascript 我可以将.getState()方法作为道具传递给我的组件吗?

Javascript 我可以将.getState()方法作为道具传递给我的组件吗?,javascript,frontend,redux,Javascript,Frontend,Redux,我可以将dispatch作为道具添加到我的容器中。我还可以将state对象的副本传递给我的容器。但是,我要做的是将方法“getState()”作为this.props.getState传递给我的容器 有没有办法做到这一点 我为什么要这样做: 我的应用程序的结构相当大,为了简化,我尝试将实际上不需要放在单独文件(一个“实用程序”文件夹)中的容器中的任何逻辑排除在外。例如,我们有一个自定义后端,因此所有处理从后端发送和接收的代码都保存在../utilities/api.js中 现在,为了让这些实用

我可以将dispatch作为道具添加到我的容器中。我还可以将state对象的副本传递给我的容器。但是,我要做的是将方法“getState()”作为this.props.getState传递给我的容器

有没有办法做到这一点


我为什么要这样做:

我的应用程序的结构相当大,为了简化,我尝试将实际上不需要放在单独文件(一个“实用程序”文件夹)中的容器中的任何逻辑排除在外。例如,我们有一个自定义后端,因此所有处理从后端发送和接收的代码都保存在../utilities/api.js中

现在,为了让这些实用程序能够访问存储,我已经直接从../store/createStore.js导入了存储。这很好,但我想做的是使用依赖注入从调用api的组件传递dispatch和getState,这样就更容易为这些应用程序编写单元测试,并增加我们将来可能开发的其他Redux应用程序的模块性

基本上,我想写的是这样的:

//(Pesudocode)
// ../containers/SomeComponent.js
import api from '../utilities/api'

class SomeComponent extends Component {
  constructor(props){
    super(props);
    this.api = api(this.props.dispatch, this.props.getState);
}

someMethod(){
  this.api.foo('bar');
}
// etc. 

// pseudocode
// in ../utilities/api.js
export default function(dispatch, getState){
  return {
    foo: function (bar){
      // dispatch a complicated action which changes the state considerably
       dispatch(action.someAction(bar))
      // get the new state. 
       console.log("New State", getState());
    }
    baz: function (razz, dugi){
      // do something else
    }
  }
我发现,在构建类时可以发送当前状态的副本,但我确实需要调用函数getState(),因为其中一些函数是异步的


可能还有其他模式,例如使用异步操作,但是对于我们正在做的事情,它工作得很好

这可以使用React解决,React本质上是一种依赖项注入机制,允许您在组件树的任意级别发送类似prop的值

如果您使用的是Redux或类似的状态容器,则其实现类似于此:

const存储;
类应用程序扩展组件{
静态childContextTypes:{
getState:React.PropTypes.func.isRequired
}
getChildContext(){
返回{
getState:()=>store.getState()
}
}
render(){
返回
}
}
类ChildComponent扩展组件{
构造函数(道具、上下文){
超级(道具、背景);
this.api=api(props,context.getState);
}
静态上下文类型:{
getState:React.PropTypes.func.isRequired
}

}
您要做的是重新创建连接组件。
connect()
调用中的
mapstatetops
参数所做的是从存储中提取选定状态并将其作为道具附加。我不建议这样做,但你可以把整个州作为一个论点来传递

退一步,看看您正在尝试做什么,似乎您可以使用redux thunk库并围绕您的api创建一个包装动作创建者,它可能看起来像这样

const apiAction = (url, onComplete) => {
    return (dispatch, getState) =>
        const state = getState();
        ...some logic

        api(foo, bar, onComplete)
}
您当前正在使用api调用包装redux操作创建者,而您应该使用redux操作创建者包装api调用