我只是试图分派一个操作到store ,并得到这个错误.我不知道什么是flexer2,也不知道为什么会有一个TypeError:

listener2 is not a function
TypeError: listener2 is not a function
    at wrappedListener
    at Map.forEach (<anonymous>)
    at Object.dispatch
    at dispatch
    at App

这是我唯一的切片:

import {createSlice} from '@reduxjs/toolkit';

const PostContainerSlice = createSlice({
  name: "postContainer",
  initialState: [],
  reducers: {
    addPost: (state, action) => {
      state.push(action.payload)
    },
  }
})

export const {addPost} = PostContainerSlice.actions;
export default PostContainerSlice.reducer;

_

import {configureStore} from '@reduxjs/toolkit';
import PostContainerReducer from './features/post/PostContainerSlice.js';

export default configureStore({
  reducer: {
    postContainer: PostContainerReducer
  }
})


Index.js:

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import store from './store.js';

const root = ReactDOM.createRoot(document.getElementById('root')).render(
  <React.StrictMode>
      <App dispatch={store.dispatch} state={store.getState()} />
  </React.StrictMode>
);

store.subscribe(root);

App.js:

import './App.css';
import PostContainer from './features/post/PostContainer'

function App(props) {
  const {state, dispatch} = props;

  dispatch({
    type: 'postContainer/addPost',
    payload: 'test'
  })
  console.log(state)

 
}

export default App;

控制台记录存储的状态工作正常,只是调度导致了这种情况.当从index.js中删除'store. subscribe(root)'时,错误不会发生,但控制台日志(log)显示没有被分派,存储保持不变.也许这和这个问题无关. 此外,当在App呈现上方从index.js分派和记录状态时,存储似乎正常分派和记录.我以为这是一个线索,但却一无所获.

推荐答案

Issue

这里所讨论的"listener"是store.subscribe期望传递的listener回调函数.

subscribe(listener)

ReactDOM.createRoot().render不返回函数.

const root = ReactDOM.createRoot(document.getElementById('root')).render(
  <React.StrictMode>
      <App dispatch={store.dispatch} state={store.getState()} />
  </React.StrictMode>
);

store.subscribe(root); // root is not a function

Solution

您也许可以创建一个函数来呈现应用程序,该应用程序也可以用作侦听器回调.

示例:

const root = ReactDOM.createRoot(document.getElementById('root'));

const renderApp = () => { 
  root.render(
    <React.StrictMode>
      <App dispatch={store.dispatch} state={store.getState()} />
    </React.StrictMode>
  );
};

renderApp(); // <-- call once to initially render app

store.subscribe(renderApp); // <-- pass as listener to rerender with state changes

100 This 101 how we use Redux in React though!

您应该导入并包装App组件到react-redux Provider组件中,以向React应用程序提供Redux store上下文.

import React from 'react';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';
import './index.css';
import App from './App';
import store from './store.js';

const root = ReactDOM.createRoot(document.getElementById('root')).render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>
);

App组件和子ReactTree中的所有组件都应该导入并使用react-redux中的useDispatchuseSelector钩子来将动作分派到存储中,并订阅所选的状态更新.

import { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import './App.css';
import PostContainer from './features/post/PostContainer'

function App() {
  const dispatch = useDispatch();
  const postContainer = useSelector(state => state.postContainer);

  useEffect(() => {
    dispatch({
      type: 'postContainer/addPost',
      payload: 'test'
    });
  }, [dispatch]);

  useEffect(() => {
    console.log({ postContainer });
  }, [postContainer]);
 
  ...
}

export default App;

Reactjs相关问答推荐

客户端组件中服务器组件的两难境地

REACT路由DOM根据参数呈现不同的路由

有没有办法让两个状态在两次精准渲染中更新?

如何在Reac.js中通过子组件和props 调用父组件函数?

react -在选项中 Select 我想要显示和图像.但当我 Select 该选项时,我希望控件仅显示该选项的文本部分

React中的useEffect钩子

在React Create App TS项目中安装material UI

在Map()完成React.js中的多个垃圾API请求后执行函数

useEffect不重新渲染

如何在React组件中自动更新图表数据?

React 为什么标签导致 onClick 事件运行 2 次?

react 本机屏幕转换

如何在 TimePicker 中更改时钟 colored颜色 和确定按钮字体 colored颜色 - MUI React

如何更新redux状态存在的输入框

状态链接未传递到路由页面

在准备回调中使用状态属性(Redux 工具包)

如何通过onpress on view in react native flatlist来降低和增加特定视图的高度?

响应式媒体 React Tailwind

React如何在用户登录后等待当前用户数据被获取

React-Native PDF 注释