react 18 npm: lst 版本
{ "name": "04_learn_redux", "version": "0.1.0", "private": true, "dependencies": { "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "axios": "^1.3.4", "react": "^18.2.0", "react-dom": "^18.2.0", "react-redux": "^8.0.5", "react-scripts": "5.0.1", "redux": "^4.2.1", "redux-thunk": "^2.4.2", "web-vitals": "^2.1.4" }
我看文档上写的这个用 connect 高阶函数 用 mapStateToProps 去获取值传给组件 但是我打印了 props 是 {}
pages/about.jsx
import React, {PureComponent} from 'react'; import { connect } from 'react-redux' export class About extends PureComponent { render() { console.log("about",this.props) const { counter } = this.props console.log("about",counter) //控制台显示 about undefined return ( <div> <h2> About Counter: {counter}</h2> </div> ); } } // 传入 组件的 state 然后返回一个隐射关系 因为不是 store 里的所有数据我们都需要 const mapStateToProps = state => ({ counter: state.counter }) // connect 是一个高阶函数 调用方法为 connect(函数 1 ,函数 2)(组件) export default connect(mapStateToProps)(About);
store/index.js
import {createStore} from "redux"; import reducer from "./reducer"; const store = createStore(reducer) export default store
stote/reducer.js
import * as actionTypes from "./constants" const initialState = { counter: 100 } function reducer(state = initialState, action) { switch (action.type) { case actionTypes.ADD_NUMBER: return { ...state, counter: state.counter + action.num } case actionTypes.SUB_NUMBER: return { ...state, counter: state.counter - action.num } case actionTypes.CHANGE_BANNERS: return { ...state, banners: action.banners } case actionTypes.CHANGE_RECOMMENDS: return { ...state, recommends: action.recommends } default: return state } } export default reducer
index.js
import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App'; import { Provider } from 'react-redux' import store from './store' const root = ReactDOM.createRoot(document.getElementById('root')); root.render( <React.StrictMode> {/* 包裹 最顶层 传入一个 store */} <Provider store={store}> <App/> </Provider> </React.StrictMode> );
![]() | 1 cF06myaQ57WHKMBv 2023-03-29 18:07:50 +08:00 ![]() import React, {PureComponent} from 'react'; import { connect } from 'react-redux' // 导出 About export class About extends PureComponent { render() { console.log("about",this.props) const { counter } = this.props console.log("about",counter) //控制台显示 about undefined return ( <div> <h2> About Counter: {counter}</h2> </div> ); } } const mapStateToProps = state => ({ counter: state.counter }) // 默认导出 export default connect(mapStateToProps)(About); 这个组件中,有两个导出,你导入的时候是不是取错组件了? |
![]() | 2 dumbass 2023-03-29 18:15:46 +08:00 如果是单项目中使用,我觉得不如用 jotai 之类的状态管理库,好写也好看,redux 写起来好复杂 |
![]() | 3 blankmiss OP @ljtfdt 这个好象是 说 es6 的导出格式吧 两种导入的方法 这个是 webstorm 的默认生成模版 应该不会有错 |
![]() | 4 blankmiss OP @bojackhorseman 按照路线学的 哈哈 |
![]() | 5 cF06myaQ57WHKMBv 2023-03-29 18:26:22 +08:00 ![]() @blankmiss 但是你使用 About 组件的时候是怎么导入的? |
![]() | 6 blankmiss OP app 里面直接引用的 store 有数据,about 组件里面用的 react-redux 的 connect 无数据 |
![]() | 7 cF06myaQ57WHKMBv 2023-03-29 18:27:00 +08:00 ![]() @blankmiss 你在哪里使用了 About 组件 |
![]() | 9 blankmiss OP @ljtfdt 我改成 import About from "./pages/About"; 就可以了 这是为什么呢 |
![]() | 10 cF06myaQ57WHKMBv 2023-03-29 18:28:30 +08:00 ![]() @blankmiss 你试试 import About from "./pages/About"; |
![]() | 11 cF06myaQ57WHKMBv 2023-03-29 18:29:54 +08:00 ![]() @blankmiss import {About} from "./pages/About"; 这样导入的话 使用的是 export class About extends PureComponent 这里导出的,而不是经过 connect 高阶组件包裹的那个组件 |
![]() | 12 blankmiss OP @ljtfdt 懂了 可以理解为 我用的是原生的 about 组件 不是用的 connect 返回的新组件 谢谢你的帮忙 |
![]() | 13 Jaosn 2023-03-30 10:57:16 +08:00 都 2023 年了,不推荐用 |
![]() | 14 MENGKE 2023-03-30 11:14:39 +08:00 好几年没用过 redux 了,写起来太复杂太麻烦了,现在我都是用 zustand 之类的状态库 |
![]() | 15 dw2693734d 2023-04-02 14:34:29 +08:00 什么年代了,不用 redux 了。直接自带的 use 系列就够了 |
![]() | 16 blankmiss OP @dw2693734d 因为才刚学 昨天才学到 hook |
17 snowma 2023-04-09 07:14:41 +08:00 用 dva.js 吧 |