V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
blankmiss
V2EX  ›  React

刚学到 redux, 遇到一个问题

  •  
  •   blankmiss · 2023-03-29 17:47:07 +08:00 · 1986 次点击
    这是一个创建于 606 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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>
    );
    
    
    17 条回复    2023-04-09 07:14:41 +08:00
    ljtfdt
        1
    ljtfdt  
       2023-03-29 18:07:50 +08:00   ❤️ 1
    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);

    这个组件中,有两个导出,你导入的时候是不是取错组件了?
    bojackhorseman
        2
    bojackhorseman  
       2023-03-29 18:15:46 +08:00
    如果是单项目中使用,我觉得不如用 jotai 之类的状态管理库,好写也好看,redux 写起来好复杂😹
    blankmiss
        3
    blankmiss  
    OP
       2023-03-29 18:23:09 +08:00
    @ljtfdt 这个好象是 说 es6 的导出格式吧 两种导入的方法 这个是 webstorm 的默认生成模版 应该不会有错
    blankmiss
        4
    blankmiss  
    OP
       2023-03-29 18:23:55 +08:00
    @bojackhorseman 按照路线学的 哈哈
    ljtfdt
        5
    ljtfdt  
       2023-03-29 18:26:22 +08:00   ❤️ 1
    @blankmiss 但是你使用 About 组件的时候是怎么导入的?
    blankmiss
        6
    blankmiss  
    OP
       2023-03-29 18:26:32 +08:00
    app 里面直接引用的 store 有数据,about 组件里面用的 react-redux 的 connect 无数据
    ljtfdt
        7
    ljtfdt  
       2023-03-29 18:27:00 +08:00   ❤️ 1
    @blankmiss 你在哪里使用了 About 组件
    blankmiss
        8
    blankmiss  
    OP
       2023-03-29 18:27:47 +08:00
    @ljtfdt import {About} from "./pages/About";
    blankmiss
        9
    blankmiss  
    OP
       2023-03-29 18:28:21 +08:00
    @ljtfdt 我改成 import About from "./pages/About"; 就可以了 这是为什么呢
    ljtfdt
        10
    ljtfdt  
       2023-03-29 18:28:30 +08:00   ❤️ 1
    @blankmiss 你试试 import About from "./pages/About";
    ljtfdt
        11
    ljtfdt  
       2023-03-29 18:29:54 +08:00   ❤️ 1
    @blankmiss import {About} from "./pages/About"; 这样导入的话 使用的是 export class About extends PureComponent 这里导出的,而不是经过 connect 高阶组件包裹的那个组件
    blankmiss
        12
    blankmiss  
    OP
       2023-03-29 18:31:18 +08:00
    @ljtfdt 懂了 可以理解为 我用的是原生的 about 组件 不是用的 connect 返回的新组件 谢谢你的帮忙
    Jaosn
        13
    Jaosn  
       2023-03-30 10:57:16 +08:00
    都 2023 年了,不推荐用
    MENGKE
        14
    MENGKE  
       2023-03-30 11:14:39 +08:00
    好几年没用过 redux 了,写起来太复杂太麻烦了,现在我都是用 zustand 之类的状态库
    dw2693734d
        15
    dw2693734d  
       2023-04-02 14:34:29 +08:00
    什么年代了,不用 redux 了。直接自带的 use 系列就够了
    blankmiss
        16
    blankmiss  
    OP
       2023-04-02 15:01:05 +08:00
    @dw2693734d 因为才刚学 昨天才学到 hook
    snowma
        17
    snowma  
       2023-04-09 07:14:41 +08:00
    用 dva.js 吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   941 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:41 · PVG 06:41 · LAX 14:41 · JFK 17:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.