【问题标题】:How to create toggle navbar in react with redux thunk如何创建切换导航栏以与 redux thunk 做出反应
【发布时间】:2019-07-18 00:05:12
【问题描述】:

我正在使用带有 redux thunk 的反应。我创建了一个动作,两个减速器(一个父母和一个孩子)和一个商店。现在我将 reactstrap 用于导航栏,其中 this.state 方法用于切换导航栏,但我想 toggle 使用 调度动作 和 设置和从存储中获取状态。以下是我的代码:

/* App.js */

import React from "react";
import { connect } from 'react-redux';
import {
  Collapse,
  Navbar,
  NavbarToggler,
  NavbarBrand,
  Nav,
  NavItem,
  NavLink } from 'reactstrap';
import { simpleAction } from './actions/simpleAction';

const mapStateToProps = state => ({
  ...state
})
const mapDispatchToProps = dispatch => ({
  simpleAction: () => dispatch(simpleAction())
})

class App extends React.Component {
  constructor(props) {
    super(props);

    this.toggle = this.toggle.bind(this);
    this.state = {
      isOpen: false
    };
  }
  toggle() {
    this.setState({
      isOpen: !this.state.isOpen
    });
  }
  simpleAction = (event) => {
   this.props.simpleAction();
  }
  render() {
    return (
      <div>
        <Navbar color="light" light expand="md">
          <NavbarBrand href="/">reactstrap</NavbarBrand>
          <NavbarToggler onClick={this.toggle} />
          <Collapse isOpen={this.state.isOpen} navbar>
            <Nav className="ml-auto" navbar>
              <NavItem>
                <NavLink href="/components/">Components</NavLink>
              </NavItem>
              <NavItem>
                <NavLink href="https://github.com/reactstrap/reactstrap">GitHub</NavLink>
              </NavItem>
            </Nav>
          </Collapse>
        </Navbar>
      </div>
    );
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(App);

/* simpleAction.js */

export const simpleAction = () => dispatch => {
 dispatch({
  type: 'SIMPLE_ACTION',
  payload: 'result_of_simple_action'
 })
}

/* simpleReducer.js */

export default (state = {}, action) => {
 switch (action.type) {
  case 'SIMPLE_ACTION':
   return {
    result: action.payload
   }
  default:
   return state
 }
}

【问题讨论】:

    标签: javascript reactjs redux react-redux


    【解决方案1】:

    您可以为 toggle 创建一个新操作,例如:

    export const toggleAction = () => dispatch => {
     dispatch({
      type: 'TOGGLE_ACTION'
     })
    }
    

    在减速器中:

    export default (state = { isOpen: false }, action) => {
     switch (action.type) {
      case 'TOGGLE_ACTION':
       state.isOpen = !state.isOpen;
       return state;
    
      default:
       return state;
     }
    }
    

    你可以将reducers和action结合到redux的connect方法上。 您可以简单地将更新后的 props 值用于isOpen 属性。

    编辑 应用组件将如下所示:

    ...
    import { toggleAction } from './actions/toogleAction';
    
    const mapStateToProps = state => ({
      ...state
    })
    const mapDispatchToProps = dispatch => ({
      simpleAction: () => dispatch(simpleAction()),
      toggleAction: () => dispatch(toggleAction())
    })
    
    class App extends React.Component {
      constructor(props) {
        super(props);
    
        this.toggle = this.toggle.bind(this);
      }
      toggle() {
        this.props.toggleAction();
      }
      simpleAction = (event) => {
       this.props.simpleAction();
      }
      render() {
        return (
          <div>
            <Navbar color="light" light expand="md">
              <NavbarBrand href="/">reactstrap</NavbarBrand>
              <NavbarToggler onClick={this.toggle} />
              <Collapse isOpen={this.props.isOpen} navbar>
                ...
              </Collapse>
            </Navbar>
          </div>
        );
      }
    }
    
    export default connect(mapStateToProps, mapDispatchToProps)(App);
    

    【讨论】:

    • 我不需要提供类型为“TOGGLE_ACTION”的有效载荷吗?
    • 有效负载不是必需的,有效负载类型就足够了,因为我们没有进行任何 API 调用,因此没有响应作为有效负载传递。我们可以像上面那样简单地切换减速器状态。
    • 点赞!但是答案是完全可以理解的,因为您没有给出 App 组件的示例。
    • @rajat,我已经编辑了我的答案并添加了应用程序组件逻辑。
    • 你能告诉我,如何在 redux 中使用 react 管理表单吗?
    【解决方案2】:

    在同一个文件或您想要的任何文件中创建另一个操作

    export const toggleNav = () => dispatch => {
     dispatch({
      type: 'TOGGLE_NAV',
     })
    }
    

    还有一个类似的减速器

    export default (state = false, action) => {
     switch (action.type) {
      case 'TOGGLE_NAV':
       return !state;
    
      default:
       return state;
     }
    }
    

    使用键 navStatus 将其添加到您的组合减速器中 并更新 mapDispatchToProps,如下所示

    const mapDispatchToProps = dispatch => ({
      simpleAction: () => dispatch(simpleAction()),
      toggleNav: () => dispatch(toggleNav()),
    })
    

    NavbarToggler onClick 事件 (onClick={this.props.toggleNav}) 上添加该操作,并将该道具设置为 Collapse 组件的 isOpen 道具 (isOpen={this.props.navStatus})。

    将调度映射到道具

    mapDispatchToProps 是一个函数,它的名字可以是任何东西,但是为了可读性,我们将它命名为mapDispatchToProps,它有一个参数dispatch,如果你想访问组件中的一个动作作为道具你必须遵循这个语法,或者你可以简单地使用下面的语法

    export default connect(mapStateToProps, { simpleAction, toggleNav })(App);
    //or
    export default connect(mapStateToProps, { 
      simpleAction: simpleAction,
      toggleNav: toggleNav,
    })(App);
    
    

    react-redux 会检查 mapDispatchToProps 是 action 还是 object,如果 value 是 object,react-redux 会自己做 dispatch 操作。

    【讨论】:

    • 点赞!但由于 mapDispatchToProps,答案尚不清楚。
    • 关于 Map Dispatch To Props 的更新,如果你想使用表单库尝试Formik,它的 react 推荐表单处理库和 redux 表单比这个贵很多
    猜你喜欢
    • 2020-12-10
    • 2021-10-13
    • 2014-11-16
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多