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