当前位置: 首页 > 知识库问答 >
问题:

react redux操作不调用reducer

鲁成天
2023-03-14

我一辈子都不能让我的一个动作叫减速机。我已经在这个应用程序中编写了多个其他动作和减法器,效果非常好。

它是筛选函数的开始。我有一个文本输入字段,在这里我不断跟踪输入字段的状态,并将字段值分配给redux操作。我有一个控制台。记录操作内部,该操作会正确记录每次按键。

我似乎不能理解的是,为什么减速器不是在每个按键调用。我已经尝试了减速器内的多个console.log,但是没有一个被键盘记录下来。

第一个控制台。当我刷新页面时,会调用reducer中的log。如果我尝试记录操作。输入,我得到:

@@redux/PROBE_UNKNOWN_ACTION1.0.i.0.0.9

如果我在同一个应用程序中编写的任何其他减速器中尝试相同的操作,我会得到相应类型的注销。

一些代码:

过滤器组件:

import React, { useState } from 'react'
import { useDispatch } from 'react-redux';
import { filterAnecdotes } from '../reducers/filterReducer';

const Filter = () => {
  const [value, setValue] = useState("");

  const handleChange = (e) => {
    setValue(e.target.value)
  }

  useDispatch(filterAnecdotes(value));
  const style = {
    marginBottom: 10
  }

  return (
    <div style={style}>
      filter <input onChange={handleChange} />
    </div>
  )
}

export default Filter

减速器和动作:在这里,我还没有弄清楚如何获得所有轶事的状态,以及实际返回的内容。现在,我只是想让它被正确地调用。

const filterReducer = (state = null, action) => {

  // These logs only get logged on refresh.
  // The action.type should be 'SEARCH', but is not.
  console.log("From filterReducer")
  console.log(action.type)

  switch(action.type) {
    case 'SEARCH':

      // This is not called at all.
      console.log(action.type, action.data)

      return action.data;
    default:
      return state
  }
}

export const filterAnecdotes = (filter) => {
  console.log(filter);
  return {
    type: 'SEARCH',
    data: filter
  }
}

export default filterReducer;

实际工作的redux文件示例

const reducer = (state = [], action) => {
  console.log(state, action)
  switch(action.type){
    case 'NEW_ENTRY_NOTIFICATION':
    console.log(action.type)
      return [...state, action.data]
    case 'NEW_VOTE_NOTIFICATION':
      return [...state, action.data]
    case 'HIDE_NOTIFICATION':
      return []
    default:
      return state
  }
}

export const createNewEntryNotification = (notification) => {
  return {
    type: 'NEW_ENTRY_NOTIFICATION',
    data: notification
  }
}

export const createNewVoteNotification = (notification) => {
  return {
    type: 'NEW_VOTE_NOTIFICATION',
    data: notification
  }
}

export const hideNotification = () => {
  return {
    type: 'HIDE_NOTIFICATION'
  }
}


export default reducer

应用组件(应该是无关的)

import React from 'react';
import NewEntry from './components/AnecdoteForm'
import AnecdoteList from './components/AnecdoteList'
import Notification from './components/Notification'
import Filter from './components/Filter';

const App = () => {

  return (
    <div>
      <h2>Anecdotes</h2>
      <Filter />
      <Notification />
      <AnecdoteList />
      <NewEntry />
    </div>
  )
}

store(应为无关)

import anecdoteReducer from './anecdoteReducer';
import notificationReducer from './notificationReducer';
import filterReducer from './filterReducer';
import { combineReducers } from 'redux'


const reducer = combineReducers({
  anecdotes: anecdoteReducer,
  notifications: notificationReducer,
  filters: filterReducer,
});


export default reducer

index.js(也应无关)

import React from 'react'
import ReactDOM from 'react-dom'
import { createStore } from 'redux'
import { Provider } from 'react-redux'
import App from './App'
import reducer from './reducers/store'

const store = createStore(reducer)

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
)


export default App

如果需要,我很乐意提供更多信息。这适用于fullstackopen的项目。

共有2个答案

闻人宏盛
2023-03-14

useDispatch的使用被误解了。链接供参考:https://react-redux.js.org/api/hooks#usedispatch

您应该从useDisfield创建一个调度:

常量调度=useDispatch();

调度(filterAnecdotes(value));

敖子安
2023-03-14

尝试在const[value,setValue]=useState(“”)之后像这样实例化useDispatch

const dispatch = useDispatch();

然后使用intance来分派操作

dispatch(filterAnecdotes(value));

 类似资料:
  • 任何人都可以指向一个官方Java文档,该文档描述了流将调用每个元素的每个“无干扰和无状态”中间操作的次数。 例如: 以上代码当前将调用< code>check方法4次。 在JDK的当前或未来版本中,方法的执行次数是否可能多于或少于从List或任何其他标准JavaAPI创建的流中的元素数量?

  • 我在使用JSF2.0时遇到了问题。命令按钮不调用bean,我已经阅读了balusc应答commandbutton/commandlink/ajax action/listener方法未调用或输入值未更新,但我认为我不会遇到这些情况,这就是我使用的代码: 更新1:

  • 我不能让非常基本的底拖示例按预期工作。下面的代码应该允许服务并发HTTP请求。实际发生的情况是,只有一个请求被处理,在第一个请求完成之前,其他请求都无法通过。 增加XNIO线程数及其工作线程不会改变任何事情。一个随机的XNIO被分配给请求。然后在调度后分配一个随机工作者。服务器一直处于阻塞状态,直到请求得到服务。

  • 我正在我的应用程序中使用ActionSheet。在我的iPhone上它可以工作,但在iPad模拟器上却不行。 这是我的代码: 我的错误是: 由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“您的应用程序已呈现UIAlertControllerStyleActionSheet样式的UIAlertController()。具有此样式的UIAlertController的

  • 问题内容: 我没有完全理解在类的clone()方法中返回super.clone()的想法。首先,与之相关的返回一个对象是一个超类,其中所包含的LESS数据少于所请求的数据,因为一个超类“不是”子类,而是一个子类“是”超类。并且如果有一长串子类,每个子类都调用super.clone(),那为什么不导致它最终在不是子类的链的根部调用Object.clone()? 抱歉,这令人困惑;我有时会迷惑自己 问

  • 看起来lexer操作中的getText()无法检索正确匹配的令牌。这是正常的行为吗?例如,我的部分语法有以下规则用于解析C++样式的标识符,这些规则支持\u序列将unicode字符嵌入到标识符名称中: 使用包含带有不正确unicode转义序列的标识符的1行输入进行测试: 但是,IDENTIFIER lexer规则操作的getText()会产生以下错误结果: 为什么lexer规则的getText()