gpt4 book ai didi

javascript - 商店的 React/Redux props 属性未定义

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:57:34 25 4
gpt4 key购买 nike

在我的应用中,我正在使用:

"devDependencies": {
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-preset-es2016": "^6.24.1",
"babel-preset-react": "^6.24.1",
"bootstrap": "^4.0.0",
"browser-sync": "^2.24.5",
"browser-sync-webpack-plugin": "^2.2.2",
"cross-env": "^5.1",
"jquery": "^3.2",
"laravel-mix": "^2.0",
"popper.js": "^1.12",
"react": "^16.4.1",
"react-dom": "^16.4.1",
"react-redux": "^5.0.7",
"react-router-dom": "^4.3.1",
"redux": "^4.0.0",
"redux-thunk": "^2.3.0",
"uuid": "^3.3.2"
},

在 redux 方面我有这个设置:商店.js:

import {createStore, applyMiddleware} from 'redux';
import thunk from 'redux-thunk';

import rootReducer from './reducers';
const initialState = {};
const middleware = [thunk];

const store = createStore(rootReducer, initialState, applyMiddleware(...middleware));

export default store;

rootReducer 是:

import {combineReducers} from 'redux';

import menuReducer from './menuReducer';

const rootReducer = combineReducers({
menu: menuReducer
});

export default rootReducer;

它只有 menuReducer 可用:

import * as types from '../actions/types';

const initialState = {
data: {}
}

export default function(state = initialState, action) {
switch (action.type) {
case types.GET_MENU:
return {
...state,
data: action.payload
}
default:
return state;
}
}

它通过单​​个菜单操作获取提要:

import * as types from './types';

export const getMenu = () => (dispatch) => {
fetch('/admin/json/menu.json')
.then(res => res.json())
.then(data => dispatch({
type: types.GET_MENU,
payload: data
})
)
}

最后是在组件方面:应用程序.js:

import React from 'react';
import {Provider} from 'react-redux';
import {BrowserRouter} from 'react-router-dom';

import store from '../store';
import SideMenu from './sidemenu';
import Content from './content';

class App extends React.Component {
render() {
return(
<Provider store={store}>
<BrowserRouter basename='/yonetim'>
<div className="h-100">
<SideMenu className="h-100"/>
<Content className="h-100"/>
</div>
</BrowserRouter>
</Provider>
);
};
};

export default App;

以及尝试使用此基本 redux 实现的组件:

import React, {Fragment} from 'react';
import {v1 as uuid} from 'uuid';
import {connect} from 'react-redux';

import {getMenu} from '../actions/menuActions';
import MenuDropdown from './parts/menu-dropdown';
import MenuItem from './parts/menu-item';

class SideMenu extends React.Component {
componentWillMount() {
this.props.getMenu();
}
render() {
console.log(this.props.menuData);
return(
<header>
<div className="cnt-menu-head">
<h6>{this.props.menuData.heading}</h6>
</div>
<div className="cnt-menu">
<ul className="nav nav-pills flex-column">
{this.props.menuData.sections.map((section, i) => {
if (section.type === 'link') {
let key = uuid();
return <MenuItem key={key} exact={section.exact} linkTo={section.linkTo} linkText={section.linkText}/>
} else if (section.type === 'dropdown') {
let keyedLinks = section.links.map((link) => {
link.key = uuid();
return link;
});
return (
<Fragment key={uuid()}>
<div className="horizontal-separator"></div>
<MenuDropdown linkText={section.linkText} links={keyedLinks}/>
</Fragment>
)
}
})}
</ul>
</div>
</header>
);
};
};

function mapStateToProps(state) {
return {
menuData: state.menu.data
}
}

export default connect(mapStateToProps, {getMenu})(SideMenu);

发生的事情是:

我得到错误:

Uncaught TypeError: Cannot read property 'map' of undefined

引用 this.props.menuData.sections.map() 我的部分代码。现在有趣的是:

  1. 这个组件的渲染函数被调用了两次
  2. 当我将 console.log() 放在 action 和 reducer 中时,我发现它们也被调用了两次。
  3. 当我注释掉试图在 render() 中使用 this.props.menuData 的代码时,然后 console.log(this.props.menuData) ; 渲染函数的开头在 render() 的第一次运行中打印为空,然后填充了我在第二次运行中尝试使用的实际数据。我完全不知道这段代码是怎么回事,也不知道根本原因是什么。任何帮助深表感谢。谢谢。

最佳答案

这里的问题是您正在调用“异步”操作(获取),该操作在获取后分派(dispatch)数据。

因此,您的组件会加载,但随后当您的函数 (getMenu) 将操作分派(dispatch)给 Redux 时,您的组件会第二次运行。

我可能会建议做一个三元组来调节 menuData 消费者的渲染并显示一个加载器:

在你的渲染中:

return this.props.menuData.sections ? (actualCodeGoesHere) : <Loader />

关于javascript - 商店的 React/Redux props 属性未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51110557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com