如何 hide/display 使用按钮和 redux 分隔表单?

How to hide/display separate forms using buttons and redux?

我是 React 和 redux 的新手(并且在堆栈溢出时发帖!)。

我想要hide/display一个基于按钮选择的redux-form。

我有两个按钮:Option-A 和 Option-B。

我完全按照 redux 教程让他们的 onClick 方法通过容器分派 setVisibilityFilter(buttonprops.filter)See: FilterLink.js 这工作正常并使用相应的选项更新状态的 visibilityFilter。

但是,我对如何访问州的过滤器以 hide/display 不同的形式感到困惑。我想要类似于 formValueSelector 所做的事情,但它不适用于按钮(因为它们没有 return 值?)

这是我的主要组件的代码:

class MainForm extends Component {
  render() {
    const { error } = this.props
    return ( 
      <Grid.Column width={9}>
        <Button.Group floated='right'>
        <FilterLink filter={VisibilityFilters.SHOW_A}>A</FilterLink>
        <Button.Or />
        <FilterForm filter={VisibilityFilters.SHOW_B}>B</FilterLink>
        </Button.Group>
        /* If SHOW_A, display FORM_A, else if SHOW_B, display FORM_B */
    </Grid.Column> 
  )
}}

我觉得现在直接玩弄状态会浪费实现 redux 的努力。我认为我应该将值作为道具传递给子表单,但我很困惑如何这样做,特别是因为我不知道如何在不更改 onClick 的情况下获得该值,而 onClick 已经在 FilterLink.js

中定义

一定有某种方法可以将我的状态可见性过滤器访问到 hide/display 表单,只是不确定如何到达那里。谢谢!

确保您已将要有条件地呈现东西的组件连接到 redux 存储。

import { connect } from 'react-redux'

...

const mapStateToProps = state => ({visibleFilter: state.visibilityFilter})
export default connect(mapStateToProps)(MainForm)

然后您可以在连接组件的道具中访问此信息,例如

render() {

  return {

     {this.props.visibleFilter === VisibilityFilters.SHOW_A && (<FormA /> )}

     {this.props.visibleFilter === VisibilityFilters.SHOW_B && (<FormB /> )}

   }

}

使用 connect,您可以将 Redux Store 中的任何内容通过它的 props 传递给您的组件。

因此,根据您发布的 link,这应该可行:

import { connect } from 'react-redux'

class MainForm extends Component {
  render() {
    const { error, visibilityFilter } = this.props
    return ( 
      <Grid.Column width={9}>
        <Button.Group floated='right'>
        <FilterLink filter={VisibilityFilters.SHOW_A}>A</FilterLink>
        <Button.Or />
        <FilterForm filter={VisibilityFilters.SHOW_B}>B</FilterLink>
        </Button.Group>
        {visibilityFilter === VisibilityFilters.SHOW_A
          ? <FormA />
          : <FormB />
        }
    </Grid.Column> 
  )
}}

const mapStateToProps = state => ({
  visibilityFilter: state.visibilityFilter
})

export default connect(mapStateToProps)(MainForm)