当前位置:  开发笔记 > 前端 > 正文

解耦React组件和Redux Connect

如何解决《解耦React组件和ReduxConnect》经验,为你挑选了1个好方法。

如此处所示,我试图尽可能地解耦我的应用程序组件,并使他们不知道任何存储或操作创建者.

目标是让他们管理自己的状态并调用函数来发出变化.我被告知你使用道具这样做.

考虑到

// Menu.jsx

import React from 'react'
import { className } from './menu.scss'
import Search from 'components/search'

class Menu extends React.Component {
  render () {
    return (
      
    )
  }
}

// Search.jsx

import React from 'react'
import { className } from './search.scss'

class Search extends React.Component {
  render () {
    let { searchTerm, onSearch } = this.props

    return (
      

{searchTerm}

onSearch(e.target.value)} value={searchTerm} />
) } } Search.propTypes = { searchTerm: React.PropTypes.string, onSearch: React.PropTypes.function } export default Search

和阅读在这里我看到了智能使用的Providerconnect我的执行将是这个样子:

import { bindActionCreators, connect } from 'redux'
import actions from 'actions'

function mapStateToProps (state) {
  return {
    searchTerm: state.searchTerm
  }
}

function mapDispatchToProps (dispatch) {
  return bindActionCreators({
    dispatchSearchAction: actions.search
  }, dispatch)
}

export default connect(mapStateToProps, mapDispatchToProps)(Search)

假设我有一个商店处理searchTerm作为全球状态的一部分.

问题是,这段代码属于哪里?如果我把它放进去,Search.jsx我将把它与组件结合起来,更重要的是redux.

我应该有我的组件的两个不同版本,一个解耦和一个connect()ed并且必须

使用它?如果是的话,我的文件树会是什么样子?每个组件一个文件或类似的文件make-all-connected.js



1> 小智..:

在redux中,存在一种称为容器的新组件,这是使用connect(mapStateToProps,mapActionsToProps)将组件和操作传递给当前组件的组件.

全部取决于组件的使用.例如,如果组件Search仅用于相同的状态和操作,那么You容器可能与您的组件相同:

// Search.jsx
import { connect } from 'redux'
import actions from 'actions'
import React from 'react'
import { className } from './search.scss'

class Search extends React.Component {
  render () {
    let { searchTerm, onSearch } = this.props

    return (
      

{searchTerm}

onSearch(e.target.value)} value={searchTerm} />
) } } Search.propTypes = { searchTerm: React.PropTypes.string, onSearch: React.PropTypes.function } function mapStateToProps ({searchTerm}) { return { searchTerm }; } const mapDispatchToProps = { onSearch: actions.search } export default connect(mapStateToProps, mapDispatchToProps)(Search)

但是,如果您的计划是在另一个容器中重用此组件,则searchTerm或该操作在全局状态上是不同的.最好的方法是将此属性传递给其他容器,并使搜索组件保持纯净.像这样:

// Container1.jsx
import { connect } from 'redux'
import actions from 'actions'
import React, { Component } from 'react'

class Container1 extends Component {
  render() {
    const { searchTerm, handleOnSearch } = this.props;
    return (
      
) } } function mapStateToProps ({interState: {searchTerm}}) { return { searchTerm }; } const mapDispatchToProps = { handleOnSearch: actions.search } export default connect(mapStateToProps, mapDispatchToProps)(Container1) // Container2.jsx import { connect } from 'redux' import otherActions from 'otheractions' import React, { Component } from 'react' class Container2 extends Component { render() { const { searchTerm, handleOnSearch } = this.props; return (
) } } function mapStateToProps ({otherState: {searchTerm}}) { return { searchTerm }; } const mapDispatchToProps = { handleOnSearch: otherActions.search } export default connect(mapStateToProps, mapDispatchToProps)(Container2)

有关更多信息,请阅读有关使用redux with react的官方文档.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有