【问题标题】:React Redux Search ReducerReact Redux 搜索缩减器
【发布时间】:2019-03-29 16:45:03
【问题描述】:

目前我有以下减速器开关语句。它所做的只是切换侧边栏的状态,所以它首先显示然后隐藏然后显示。这简单。

switch(action.type) {
      case 'SIDEBAR_DISPLAY_TOGGLE':
    return {
      ...state,
      Sidebar : {
        ...state.Sidebar,
        Display : !state.Sidebar.Display
      }
    }
      default:
        return state;
    }

现在我有一个像这里这样的输入字段

人们可以键入以搜索帐户。我正在尝试设置 Redux,因此当用户键入时,它会保存到 Redux 全局状态,我可以从另一个组件中提取它。我已经为它设置了这个 reducer 代码,但我不知道如何将用户类型从该组件中提取到这个 reducer 中?

 function reducer(state = initialState, action) {
    switch(action.type) {
      case 'ACCOUNT_SEARCH':
        return {
          ...state,
          AccountNumberSearch : {
            ...state.AccountNumberSearch,
            AccountNumber : ''
          }
        }
      default:
        return state;
    }
  }
}

【问题讨论】:

  • 一个约定是将值放在action.payload 中,但这取决于您的操作做什么以及您如何调用/发送它。请贴出相关代码。还要记住,每次击键都使用 redux 存储可能是矫枉过正。您可能希望使用本地状态来控制该字段,或者将存储去抖动到 redux 存储,或者在一些额外的用户操作(例如按下按钮)之后存储它。

标签: redux react-redux


【解决方案1】:

动作只是一个具有名为type 的字符串值的对象。此对象的任何其他属性也将被传递,因此您可以使用它来传递键入的文本。

如果您使用函数来创建动作,则类似于:

export function accountNumberSearch(accountNumber) {
    return { type: 'ACCOUNT_SEARCH', accountNumber };
}

然后在您的减速器中,您将能够将状态中的值分配给 action.accountNumber。

      AccountNumberSearch : {
        ...state.AccountNumberSearch,
        AccountNumber : action.accountNumber,
      }

然后您可以像往常一样将您的状态映射到道具(就像您为侧边栏切换所做的那样)。

另外,顺便说一句,您应该考虑使用 combineReducers - Docs 模块化您的减速器 这会比你现在做的方式容易得多。


编辑:处理更改

首先,您需要将搜索框的输入字段连接到 onChange 侦听器。如果您像onChange={this.onSearchChange} 一样执行此操作,则可以在函数中从event 获取值:

onSearchChange = event => {
    this.props.AccountNumberSearch(event.target.value);
}

然后在 mapDispatchToProps 中,您将发送您的操作 + 传递的值以发送:

const mapDispatchToProps = dispatch => {
    return {
        AccountNumberSearch: AccountNumber => dispatch(importedActions.AccountNumberSearch(AccountNumber)),
    }
}

然后,在你想要接收这个值的组件中,你可以将 redux 状态映射到 props,比如:

const mapStateToProps = state => {
    return {
        AccountNumber: state.AccountNumberSearch.AccountNumber,
    }
}

然后您可以通过调用 this.props.AccountNumber 在您的渲染函数中访问该值。

如果您需要在此值更改时执行某些操作,您可以随时收听componentDidUpdate,并将该值与旧值进行比较 - 如果更改,请调用您需要执行的任何函数。

【讨论】:

  • 如何将更改发送到accountNumberSearch 操作?我有这个动作export const AccountNumberSearch = () => ({ type: "ACCOUNT_NUMBER_SEARCH" });,我更新为export const AccountNumberSearch = (accountNumber) => ({ type: "ACCOUNT_NUMBER_SEARCH", accountNumber });并将它添加到reducerAccountNumber : action.accountNumber,,但不知道如何在用户输入页面上的输入字段时更新它?
  • 所以在您想要接收更新的其他组件的mapStateToProps 上,您可以将state.AccountNumberSearch.AccountNumber 映射到一个道具,例如AccountNumber: state.AccountNumberSearch.AccountNumber,
  • 您甚至可以在该组件上收听componentDidUpdate 上的更改,通过将其包装在if (prevProps.AccountNumber !== this.props.AccountNumber && this.props.AccountNumber !== null) { ... } 中,您可以调用另一个操作(如 API 操作)来获取结果,例如.
  • 好的,我在输入字段 value: AccountNumber, onChange: this.updateAccountNumber('AccountNumber'), now 输入字段加载了我在 redux 商店中默认输入的内容,但我无法更改它......这是update function updateAccountNumber = name => (event, { newValue }) => {AccountNumberSearch(event.target.value) }
  • 你不能只调用动作,它只会返回一个对象。您需要将对象从您的商店或 mapDispatchToProps 传递到 dispatch(...)
猜你喜欢
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 2017-10-18
  • 2016-11-23
  • 2019-02-01
  • 1970-01-01
相关资源
最近更新 更多