【问题标题】:Reusing react/redux component on different routes connected to different part of state在连接到不同状态部分的不同路由上重用 react/redux 组件
【发布时间】:2016-06-02 05:18:27
【问题描述】:

我遇到了一个问题,因为我有一个相当复杂的组件来呈现项目列表。项目列表直接取自 redux 状态树。我想要 2 个单独的路由来重用同一个组件,但每个路由都将连接到状态树中的不同列表。

这是一个简化的例子:

从状态树开始:

state = {
    fruits: ['apple', 'banana', 'grape', 'pear'],
    vegetables: ['celery', 'carrot', 'cucumber']
}

和一个简单的列表组件

class ListView extends Component {
  render() {
    return (
      <div>
        {this.props.items.map((item, index) => 
          <div key={index}>{item}</div>
        )}
      </div>
    )
  }
}

function mapStateToProps(state) {
  return {
    items: state.fruits
  }
}

export default connect(mapStateToProps)(ListView)

更高级别的 App 组件如下所示:

class App extends Component {
  render() {
    return (
      <div>
        {this.props.children}
      </div>
    )
  }
}

export default connect()(App)

路线看起来像这样:

  <Route path='/' component={App}>
    <IndexRedirect to='fruits' />
    <Route path='fruits' component={ListView} />
    <Route path='vegetables' component={ListView} />
  </Route>

所以现在 ListView 组件连接到 redux 状态的水果部分。但是我想在这里使用路由结构,所以“/fruits”和“/vegetables”都将使用相同的组件,但“/fruits”将列出水果,而“/vegetables”将列出蔬菜。

显而易见的解决方法是创建一个全新且相同的组件类并更改 mapStateToProps 方法以连接到蔬菜数组。

有没有办法重用这个组件,但可以访问每个状态树的不同部分?

【问题讨论】:

  • 对我的答案进行了更新,包括使用路由器中的组件。

标签: javascript reactjs react-router redux


【解决方案1】:

从您的 ListView 中,您可以将 FruitsList 和 VeggiesList 导出为单独的组件,然后根据路线显示正确的组件。

class ListView extends Component {
  render() {
    return (
      <div>
        {this.props.items.map((item, index) => 
          <div key={index}>{item}</div>
        )}
      </div>
    )
  }
}

function mapStateToPropsVeggies(state) {
  return {
    items: state.veggies
  }
}

function mapStateToPropsFruits(state) {
  return {
    items: state.fruits
  }
}

const VeggiesList = connect(mapStateToPropsVeggies)(ListView);
const FruitsList = connect(mapStateToPropsFruits)(ListView);

export default ListView;
export {
    VeggiesList,
    FruitsList
};

然后将路由器更新为:

<Route path='/' component={App}>
  <IndexRedirect to='fruits' />
  <Route path='fruits' component={FruitsList} />
  <Route path='vegetables' component={VeggiesList} />
</Route>

【讨论】:

  • 美丽的构图:)
  • +1 也用于导出原始 ListView。这样,您可以将它与其他容器一起重用,并像任何其他功能组件一样对其进行测试。
猜你喜欢
  • 2018-04-27
  • 2018-02-11
  • 2019-03-07
  • 2017-11-20
  • 2018-09-04
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多