Skip to content

Commit 9804f71

Browse files
redux使用hooks写法
1 parent b8563bf commit 9804f71

File tree

18 files changed

+201
-270
lines changed

18 files changed

+201
-270
lines changed

src/components/layout-set/index.js

Lines changed: 24 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
import { useState } from "react";
1+
import { useCallback, useState } from "react";
22
import MyIcon from "../icon";
33
import { Button, Drawer, message, Row, Radio } from "antd";
4-
import { connect } from "react-redux";
5-
import { changeLayoutMode } from "@/store/layout/action";
6-
import { setVisible } from "@/store/visibel/action";
7-
import * as Types from "../../store/layout/actionTypes";
4+
import { useDispatch, useSelector } from "react-redux";
5+
import { setVisible as stateSetVisibel, changeLayoutMode } from "@/store/action";
6+
import * as Types from "@/store/layout/actionTypes";
87
import { setLayoutMode, setCompVisibel as util_setCompVisibel } from "@/utils";
98
import singImg from "@/assets/images/layout2.jpg";
109
import twoImg from "@/assets/images/layout1.jpg";
1110
import twoFlanksImg from "@/assets/images/layout3.jpg";
11+
import { getComponentsVisible, getLayoutMode } from "@/store/getters";
1212
import "./index.less";
13+
1314
const modes = [
1415
{
1516
img: singImg,
@@ -37,41 +38,27 @@ const RadioArray = [
3738
v: false,
3839
},
3940
];
40-
const mapDispatchToProps = (dispatch) => ({
41-
setMode: (mode) => dispatch(changeLayoutMode(mode)),
42-
setCompVisible: (key, val) => dispatch(setVisible(key, val)),
43-
});
44-
const mapStateToProps = (state) => ({
45-
layoutMode: state.layout,
46-
componentsVisible: state.componentsVisible,
47-
});
48-
function useLayoutSet({ setMode, layoutMode, componentsVisible }) {
41+
42+
export default function LayoutSet() {
4943
const [visible, setVisible] = useState(false);
50-
const wakeup = () => setVisible(true);
51-
const onClose = () => setVisible(false);
52-
const setLayout = (mode) => {
53-
setMode(mode);
54-
message.success("布局设置成功!");
55-
};
56-
const saveLayout = () => {
44+
// state
45+
const dispatch = useDispatch()
46+
const componentsVisible = useSelector(getComponentsVisible)
47+
const layoutMode = useSelector(getLayoutMode)
48+
49+
const setMode = useCallback((mode) => dispatch(changeLayoutMode(mode)), [dispatch])
50+
const wakeup = useCallback(() => setVisible(true), []);
51+
const onClose = useCallback(() => setVisible(false), []);
52+
const saveLayout = useCallback(() => {
5753
setLayoutMode(layoutMode);
5854
util_setCompVisibel(componentsVisible);
5955
message.success("布局保存本地成功!");
60-
};
61-
62-
return {
63-
wakeup,
64-
visible,
65-
onClose,
66-
setLayout,
67-
saveLayout,
68-
};
69-
}
56+
}, [layoutMode, componentsVisible]);
57+
const setLayout = useCallback((mode) => {
58+
setMode(mode);
59+
message.success("布局设置成功!");
60+
}, [setMode]);
7061

71-
function LayoutSet(props) {
72-
const { wakeup, visible, onClose, setLayout, saveLayout } =
73-
useLayoutSet(props);
74-
const { componentsVisible = {}, setCompVisible } = props;
7562
return (
7663
<div className="layoutset-container">
7764
<MyIcon type="icon_setting" onClick={wakeup} />
@@ -90,7 +77,7 @@ function LayoutSet(props) {
9077
<div
9178
key={m.mode}
9279
onClick={() => setLayout(m.mode)}
93-
className={m.mode === props.layoutMode ? "col active" : "col"}
80+
className={m.mode === layoutMode ? "col active" : "col"}
9481
>
9582
<img src={m.img} alt={m.alt}></img>
9683
</div>
@@ -101,7 +88,7 @@ function LayoutSet(props) {
10188
<Row key={key} className="visibel-list">
10289
{key === "footer" ? "底部:" : "顶部切换导航:"}
10390
<Radio.Group
104-
onChange={(e) => setCompVisible(key, e.target.value)}
91+
onChange={(e) => dispatch(stateSetVisibel(key, e.target.value))}
10592
value={componentsVisible[key]}
10693
>
10794
{RadioArray.map((i) => (
@@ -121,5 +108,3 @@ function LayoutSet(props) {
121108
</div>
122109
);
123110
}
124-
125-
export default connect(mapStateToProps, mapDispatchToProps)(LayoutSet);

src/components/menu-dnd/index.js

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import React, { useEffect, useState, useCallback, useMemo } from "react";
22
import MyIcon from "@/components/icon";
33
import { DragDropContext, Droppable, Draggable } from "react-beautiful-dnd";
4+
import { message } from "antd";
45
import { Link, useHistory } from "react-router-dom";
5-
import "./index.less";
66
import ContextMenu from "../contextMenu";
7-
import { connect } from "react-redux";
7+
import { useDispatch, useSelector } from "react-redux";
88
import { filterOpenKey } from "@/store/action";
9-
import { message } from "antd";
9+
import { getCurrentPath, getOpenedMenu } from "@/store/getters";
10+
import "./index.less";
11+
1012
// 重新记录数组顺序
1113
const reorder = (list, startIndex, endIndex) => {
1214
const result = Array.from(list);
@@ -17,13 +19,17 @@ const reorder = (list, startIndex, endIndex) => {
1719
return result;
1820
};
1921

20-
function MenuDnd({ openedMenu, filterOpenMenu, currentPath }) {
22+
export default function MenuDnd() {
2123
const history = useHistory();
2224
const [data, setData] = useState([]);
2325
const [contextMenuVisible, setVisible] = useState(false)
2426
const [currentItem, setCurrentItem] = useState(null)
2527
const [point, setPoint] = useState({ x: 0, y: 0 })
26-
28+
// state
29+
const dispatch = useDispatch()
30+
const openedMenu = useSelector(getOpenedMenu)
31+
const currentPath = useSelector(getCurrentPath)
32+
const filterOpenMenu = useCallback((key) => dispatch(filterOpenKey(key)), [dispatch])
2733

2834
// 根据 选中的菜单 往里添加拖拽选项
2935
useEffect(() => {
@@ -202,15 +208,4 @@ function MenuDnd({ openedMenu, filterOpenMenu, currentPath }) {
202208
setVisible={setVisible}
203209
/>
204210
</>);
205-
}
206-
const mapStateToProps = (state) => ({
207-
openedMenu: state.menu.openedMenu,
208-
currentPath: state.menu.currentPath
209-
})
210-
const mapDispatchToProps = (dispatch) => ({
211-
filterOpenMenu: (key) => dispatch(filterOpenKey(key)),
212-
});
213-
export default connect(
214-
mapStateToProps,
215-
mapDispatchToProps
216-
)(MenuDnd);
211+
}

src/layout/header.js

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,13 @@
1-
import React from "react";
1+
import React, { useCallback } from "react";
22
import { Layout, Menu, Dropdown } from "antd";
33
import logo from "@/assets/images/logo.svg";
44
import MyIcon from "@/components/icon/";
5-
import { connect } from "react-redux";
5+
import { useDispatch, useSelector } from "react-redux";
6+
import { getStateUser } from "@/store/getters";
67
import { clearUser } from "@/store/user/action";
7-
import { setKey, saveToken, clearLocalDatas, } from "@/utils";
8+
import { clearLocalDatas } from "@/utils";
89
import { USER_INFO, TOKEN, MENU, } from "@/common"
910
const { Header } = Layout;
10-
const mapStateToProps = (state) => ({
11-
userInfo: state.user,
12-
});
13-
14-
const mapDispatchToProps = (dispatch) => ({
15-
clearStateUser: () => {
16-
dispatch(clearUser());
17-
},
18-
});
1911

2012
const RightMenu = ({ logout }) => (
2113
<Menu className="right-down">
@@ -31,16 +23,15 @@ const RightMenu = ({ logout }) => (
3123

3224
const getPopupContainer = (HTMLElement) => HTMLElement;
3325

34-
const LayoutHeader = ({ userInfo, clearStateUser, children }) => {
35-
const logout = () => {
26+
const LayoutHeader = ({ children }) => {
27+
const userInfo = useSelector(getStateUser)
28+
const dispatch = useDispatch()
29+
const clearStateUser = useCallback(() => dispatch(clearUser()), [dispatch])
30+
const logout = useCallback(() => {
3631
clearLocalDatas([USER_INFO, TOKEN, MENU]);
37-
if (userInfo) {
38-
setKey(true, USER_INFO, { ...userInfo, isLogin: false });
39-
}
40-
saveToken();
4132
window.location.reload();
42-
clearStateUser(userInfo);
43-
};
33+
clearStateUser();
34+
}, [clearStateUser]);
4435
return (
4536
<Header className="header">
4637
<div className="logo">
@@ -60,4 +51,4 @@ const LayoutHeader = ({ userInfo, clearStateUser, children }) => {
6051
</Header>
6152
);
6253
};
63-
export default connect(mapStateToProps, mapDispatchToProps)(LayoutHeader);
54+
export default LayoutHeader

src/layout/index.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { SingleColumn, TowColumn, TwoFlanks } from "./mode";
2-
import { connect } from "react-redux";
2+
import { useSelector } from "react-redux";
33
import * as ActionTypes from "../store/layout/actionTypes";
4+
import { getComponentsVisible, getLayoutMode } from "@/store/getters";
45
import "./index.less";
5-
const mapStateToProps = (state) => ({
6-
LayoutMode: state.layout,
7-
visibel: state.componentsVisible,
8-
});
9-
function LayoutContainer({ LayoutMode, visibel }) {
6+
7+
export default function LayoutContainer() {
8+
const LayoutMode = useSelector(getLayoutMode)
9+
const visibel = useSelector(getComponentsVisible)
1010
switch (LayoutMode) {
1111
case ActionTypes.SINGLE_COLUMN:
1212
return <SingleColumn visibel={visibel} />;
@@ -18,5 +18,3 @@ function LayoutContainer({ LayoutMode, visibel }) {
1818
return null;
1919
}
2020
}
21-
22-
export default connect(mapStateToProps, null)(LayoutContainer);

src/layout/siderMenu.js

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,15 @@
11
import React, { useCallback, useMemo, useState } from "react";
2-
import { connect } from "react-redux";
2+
import { useDispatch, useSelector } from "react-redux";
33
import { Link } from "react-router-dom";
44
import { Layout, Menu, Button, Affix, Col } from "antd";
55
import MyIcon from "@/components/icon";
66
import { setOpenKey } from "@/store/action";
77
import { stopPropagation } from "@/utils";
88
import * as layoutTypes from "@/store/layout/actionTypes";
9+
import { getLayoutMode, getMenuList, getOpenMenuKey, getSelectMenuKey } from "@/store/getters";
910
const { Sider } = Layout;
1011
const { SubMenu } = Menu;
1112

12-
const mapDispatchToProps = (dispatch) => ({
13-
setOpenKeys: (val) => dispatch(setOpenKey(val)),
14-
});
15-
16-
const mapStateToProps = (state) => ({
17-
openKeys: state.menu.openMenuKey,
18-
selectedKeys: state.menu.selectMenuKey,
19-
layout: state.layout,
20-
menuList: state.menu.menuList,
21-
});
2213
const SliderContent = ({ children }) => {
2314
const [collapsed, setCollapsed] = useState(false);
2415
// 折叠菜单
@@ -70,16 +61,16 @@ const renderMenu = (item, path = "") => {
7061
);
7162
};
7263

73-
const SiderMenu = ({ openKeys, selectedKeys, setOpenKeys, layout, menuList }) => {
64+
const SiderMenu = () => {
65+
const openMenuKey = useSelector(getOpenMenuKey)
66+
const menuList = useSelector(getMenuList)
67+
const layout = useSelector(getLayoutMode)
68+
const selectMenuKey = useSelector(getSelectMenuKey)
69+
const menuComponent = useMemo(() => menuList && menuList.map((i) => renderMenu(i, "")), [menuList]);
70+
const dispatch = useDispatch()
7471

75-
const menuComponent = useMemo(
76-
() => menuList && menuList.map((i) => renderMenu(i, "")),
77-
[menuList]
78-
);
7972
// 菜单组折叠
80-
const onOpenChange = useCallback((keys) => {
81-
setOpenKeys(keys);
82-
}, [setOpenKeys]);
73+
const onOpenChange = useCallback((keys) => dispatch(setOpenKey(keys)), [dispatch]);
8374
// classname
8475
const clsName = useMemo(() => {
8576
if (layout !== layoutTypes.SINGLE_COLUMN) {
@@ -108,13 +99,12 @@ const SiderMenu = ({ openKeys, selectedKeys, setOpenKeys, layout, menuList }) =>
10899
triggerSubMenuAction="click"
109100
className={clsName}
110101
onOpenChange={onOpenChange}
111-
openKeys={openKeys}
112-
selectedKeys={selectedKeys}
113-
>
114-
{menuComponent}
115-
</Menu>
102+
openKeys={openMenuKey}
103+
selectedKeys={selectMenuKey}
104+
children={menuComponent}
105+
/>
116106
</WrapContainer>
117107
);
118108
};
119109

120-
export default connect(mapStateToProps, mapDispatchToProps)(SiderMenu);
110+
export default SiderMenu

src/layout/topMenu.js

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
import React, { useEffect, useState } from "react";
2-
import { connect } from "react-redux";
2+
import { useSelector } from "react-redux";
33
import MenuDnd from "@/components/menu-dnd";
44
import MyIcon from "@/components/icon";
55
import { reduceMenuList } from "@/utils";
66
import { Breadcrumb } from "antd";
77
import { getMenus } from "@/common";
8-
9-
const mapStateToProps = (state) => ({
10-
childKey: state.menu.selectMenuKey,
11-
});
8+
import { getSelectMenuKey } from "@/store/getters";
129

1310
function getParent(list, parentKey) {
1411
return list.find((i) => i[MENU_KEY] === parentKey);
@@ -28,16 +25,16 @@ async function getBreadArray(ckey) {
2825
return arr;
2926
}
3027

31-
function TopMenu({ childKey }) {
28+
function TopMenu() {
3229
const [breadArr, setBread] = useState([]);
33-
30+
const selectMenuKey = useSelector(getSelectMenuKey)
3431
useEffect(() => {
3532
async function get() {
36-
let data = await getBreadArray(childKey[0]);
33+
let data = await getBreadArray(selectMenuKey[0]);
3734
setBread(data);
3835
}
3936
get();
40-
}, [childKey]);
37+
}, [selectMenuKey]);
4138

4239
return (
4340
<div className="top-menu-wrapper">
@@ -59,4 +56,4 @@ function TopMenu({ childKey }) {
5956
);
6057
}
6158

62-
export default connect(mapStateToProps, null)(TopMenu);
59+
export default TopMenu

0 commit comments

Comments
 (0)