Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.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 减少React Redux状态和调度样板_Javascript_Reactjs_Redux_React Redux - Fatal编程技术网

Javascript 减少React Redux状态和调度样板

Javascript 减少React Redux状态和调度样板,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,我通常使用以下模式构建组件: import selectors from '../store/selectors' import someAction1 from '../actions/someAction1' import someAction2 from '../actions/someAction2' import someAction3 from '../actions/someAction3' class MyComponent extends React.Component {

我通常使用以下模式构建组件:

import selectors from '../store/selectors'
import someAction1 from '../actions/someAction1'
import someAction2 from '../actions/someAction2'
import someAction3 from '../actions/someAction3'

class MyComponent extends React.Component {
  render() => {
    return <Fragment>
      <div>{this.props.someReduxProperty1}</div>
      <div>{this.props.someReduxProperty2}</div>
      <div>{this.props.someReduxProperty3}</div>
      <a onClick={this.props.someAction1}>Action1</a>
      <a onClick={this.props.someAction2}>Action2</a>
      <a onClick={this.props.someAction3}>Action3</a> 
    </Fragment>
  }
}

export default connect(
  (state, ownProps) => {
    return {
      someReduxProperty1: selectors.getSomeReduxProperty1(state),
      someReduxProperty2: selectors.getSomeReduxProperty2(state),
      someReduxProperty3: selectors.getSomeReduxProperty3(state)
    }
  },
  (dispatch) => {
    return {
      someAction1: () => {
        dispatch(someAction1())
      },
      someAction2: () => {
        dispatch(someAction2())
      },
      someAction3: () => {
        dispatch(someAction3())
      }
    }
  }
)(MyComponent)
代码中只有最少的变量名重复。另外一个好处是,由于每个组件的连接调用都是相同的,因此我可以连接一个助手,并进一步缩短我的组件:

export default connectHelper = (componentClass) => {
  return connect((state) => {
    return { state: state }
  })(componentClass)
}
仅仅通过浏览connect调用,我就无法一目了然地看到我的Redux商店使用了哪些属性。我同意这一点

因此,我的问题是:

如果基本上绕过mapStatetoProps,我还会牺牲其他考虑因素吗?我所担心的一个问题是,由于只有一个状态属性,所以每当Redux存储区中的任何属性发生更改时,React可能会过度地重新呈现每个组件。这就是为什么需要在MapStateTops中手动映射属性的原因吗

跳过mapDispatchToProps并使用默认的this.props.dispatch,我会损失什么?我必须做额外的工作,直接在mapDispatchToProps中绘制各州地图;我的努力能得到什么

在React+Redux设置中是否有其他代码组织/模式可以帮助减少组件属性混乱


谢谢!只是让我的头缠在这些工具上。这是一个有趣的练习,但有些事情感觉有点奇怪

是的,有很多方法可以缩短这个时间

首先,您应该使用:

常量映射分派={ 一些行动1, 一些行动2, 一些行动3, }; 第二,虽然我们没有mapState的对象速记等价物,但您可以使用重选来做同样的事情

是的,如果您传递整个状态值,您的组件现在将在每次更新Redux存储时重新呈现,这是基于mapState函数返回的值

第三,考虑在你的组件开始使用破坏来拔出他们需要的特定道具,所以你不会重复这个。道具。每一行。这可以是类组件的呈现方法中的对象分解,也可以是函数组件的函数参数分解


最后,虽然没有具体的反应,但请查看我们的新产品。它包括用于简化几个常见Redux用例的实用程序,包括存储设置、定义缩减器、不可变更新逻辑、检查意外突变,甚至自动创建整个状态片,而无需手动编写任何动作类型或动作创建者。

是的,有很多方法可以缩短此过程

首先,您应该使用:

常量映射分派={ 一些行动1, 一些行动2, 一些行动3, }; 第二,虽然我们没有mapState的对象速记等价物,但您可以使用重选来做同样的事情

是的,如果您传递整个状态值,您的组件现在将在每次更新Redux存储时重新呈现,这是基于mapState函数返回的值

第三,考虑在你的组件开始使用破坏来拔出他们需要的特定道具,所以你不会重复这个。道具。每一行。这可以是类组件的呈现方法中的对象分解,也可以是函数组件的函数参数分解


最后,虽然没有具体的反应,但请查看我们的新产品。它包括简化几个常见Redux用例的实用程序,包括存储设置、定义缩减器、不可变更新逻辑、检查意外突变,甚至自动创建整个状态片,而无需手动编写任何动作类型或动作创建者。

哇,谢谢,马克!在这些链接中有很多信息,谢谢你发布它们!这非常有用!当然你可能也对我的作品感兴趣。哇,谢谢,马克!在这些链接中有很多信息,谢谢你发布它们!这非常有用!当然你可能也对我的工作感兴趣,也对我的工作感兴趣。
export default connectHelper = (componentClass) => {
  return connect((state) => {
    return { state: state }
  })(componentClass)
}
class MyComponent extends React.Component {
  ...
}

export default connectHelper(MyComponent)