刚学到 redux, 遇到一个问题

2023-03-29 17:47:07 +08:00
 blankmiss

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>
);

2009 次点击
所在节点    React
17 条回复
ljtfdt
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);

这个组件中,有两个导出,你导入的时候是不是取错组件了?
bojackhorseman
2023-03-29 18:15:46 +08:00
如果是单项目中使用,我觉得不如用 jotai 之类的状态管理库,好写也好看,redux 写起来好复杂😹
blankmiss
2023-03-29 18:23:09 +08:00
@ljtfdt 这个好象是 说 es6 的导出格式吧 两种导入的方法 这个是 webstorm 的默认生成模版 应该不会有错
blankmiss
2023-03-29 18:23:55 +08:00
@bojackhorseman 按照路线学的 哈哈
ljtfdt
2023-03-29 18:26:22 +08:00
@blankmiss 但是你使用 About 组件的时候是怎么导入的?
blankmiss
2023-03-29 18:26:32 +08:00
app 里面直接引用的 store 有数据,about 组件里面用的 react-redux 的 connect 无数据
ljtfdt
2023-03-29 18:27:00 +08:00
@blankmiss 你在哪里使用了 About 组件
blankmiss
2023-03-29 18:27:47 +08:00
@ljtfdt import {About} from "./pages/About";
blankmiss
2023-03-29 18:28:21 +08:00
@ljtfdt 我改成 import About from "./pages/About"; 就可以了 这是为什么呢
ljtfdt
2023-03-29 18:28:30 +08:00
@blankmiss 你试试 import About from "./pages/About";
ljtfdt
2023-03-29 18:29:54 +08:00
@blankmiss import {About} from "./pages/About"; 这样导入的话 使用的是 export class About extends PureComponent 这里导出的,而不是经过 connect 高阶组件包裹的那个组件
blankmiss
2023-03-29 18:31:18 +08:00
@ljtfdt 懂了 可以理解为 我用的是原生的 about 组件 不是用的 connect 返回的新组件 谢谢你的帮忙
Jaosn
2023-03-30 10:57:16 +08:00
都 2023 年了,不推荐用
MENGKE
2023-03-30 11:14:39 +08:00
好几年没用过 redux 了,写起来太复杂太麻烦了,现在我都是用 zustand 之类的状态库
dw2693734d
2023-04-02 14:34:29 +08:00
什么年代了,不用 redux 了。直接自带的 use 系列就够了
blankmiss
2023-04-02 15:01:05 +08:00
@dw2693734d 因为才刚学 昨天才学到 hook
snowma
2023-04-09 07:14:41 +08:00
用 dva.js 吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/928228

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX