@fairys/taro-tools-react 1.0.32 → 1.0.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/components/custom-tab-bar/index.css +39 -0
- package/esm/components/custom-tab-bar/index.d.ts +57 -0
- package/esm/components/custom-tab-bar/index.js +114 -0
- package/esm/components/index.d.ts +1 -0
- package/esm/components/index.js +1 -0
- package/esm/context/global.data.instance.d.ts +27 -0
- package/esm/context/global.data.instance.js +40 -0
- package/esm/context/global.message.data.instance.d.ts +0 -7
- package/esm/context/global.message.data.instance.js +0 -23
- package/esm/context/index.d.ts +1 -0
- package/esm/context/index.js +1 -0
- package/esm/context/page.data.instance.d.ts +2 -0
- package/esm/context/page.data.instance.js +4 -1
- package/esm/context/page.info.data.instance.d.ts +2 -0
- package/esm/context/page.info.data.instance.js +4 -1
- package/esm/styles/index.css +18 -0
- package/esm/utils/request.js +3 -2
- package/lib/components/custom-tab-bar/index.css +39 -0
- package/lib/components/custom-tab-bar/index.d.ts +57 -0
- package/lib/components/custom-tab-bar/index.js +165 -0
- package/lib/components/index.d.ts +1 -0
- package/lib/components/index.js +9 -0
- package/lib/context/global.data.instance.d.ts +27 -0
- package/lib/context/global.data.instance.js +91 -0
- package/lib/context/global.message.data.instance.d.ts +0 -7
- package/lib/context/global.message.data.instance.js +0 -34
- package/lib/context/index.d.ts +1 -0
- package/lib/context/index.js +9 -0
- package/lib/context/page.data.instance.d.ts +2 -0
- package/lib/context/page.data.instance.js +4 -1
- package/lib/context/page.info.data.instance.d.ts +2 -0
- package/lib/context/page.info.data.instance.js +4 -1
- package/lib/styles/index.css +18 -0
- package/lib/utils/request.js +3 -2
- package/package.json +1 -1
- package/src/components/custom-tab-bar/index.css +38 -0
- package/src/components/custom-tab-bar/index.tsx +169 -0
- package/src/components/index.ts +1 -0
- package/src/context/global.data.instance.ts +69 -0
- package/src/context/global.message.data.instance.ts +1 -34
- package/src/context/index.ts +1 -0
- package/src/context/page.data.instance.tsx +9 -0
- package/src/context/page.info.data.instance.tsx +8 -0
- package/src/utils/request.ts +3 -2
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { proxy, useSnapshot, ref } from 'valtio';
|
|
2
|
+
import { CoverImage, CoverView } from '@tarojs/components';
|
|
3
|
+
import Taro from '@tarojs/taro';
|
|
4
|
+
import { Fragment, memo, useMemo } from 'react';
|
|
5
|
+
import clsx from 'clsx';
|
|
6
|
+
|
|
7
|
+
let fairysTaroCustomTabBarRender: React.ReactNode | undefined;
|
|
8
|
+
|
|
9
|
+
/**自定义底部导航栏状态管理*/
|
|
10
|
+
export const fairysTaroCustomTabBarState = proxy({
|
|
11
|
+
/**当前选中的项*/
|
|
12
|
+
selected: '',
|
|
13
|
+
items: ref([]) as FairysTaroCustomTabBarItemItem[],
|
|
14
|
+
isUpdatedItems: false,
|
|
15
|
+
/**未选中颜色*/
|
|
16
|
+
color: 'rgb(156 163 175)',
|
|
17
|
+
/**选中颜色*/
|
|
18
|
+
selectedColor: '#000',
|
|
19
|
+
/**切换标签*/
|
|
20
|
+
onSwitchTab: (url: string) => {
|
|
21
|
+
fairysTaroCustomTabBarState.selected = url;
|
|
22
|
+
Taro.switchTab({ url });
|
|
23
|
+
},
|
|
24
|
+
/**更新自定义底部导航栏项*/
|
|
25
|
+
onUpdatedItems: (items: FairysTaroCustomTabBarItemItem[]) => {
|
|
26
|
+
fairysTaroCustomTabBarState.items = ref(items);
|
|
27
|
+
fairysTaroCustomTabBarState.isUpdatedItems = true;
|
|
28
|
+
},
|
|
29
|
+
/**设置自定义底部导航栏渲染*/
|
|
30
|
+
onSetTabBarRender: (_tabBarRender: React.ReactNode) => {
|
|
31
|
+
fairysTaroCustomTabBarRender = _tabBarRender;
|
|
32
|
+
fairysTaroCustomTabBarState.isUpdatedItems = false;
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export interface FairysTaroCustomTabBarItemItem {
|
|
37
|
+
/**自定义底部导航栏项文本*/
|
|
38
|
+
text: string;
|
|
39
|
+
/**自定义底部导航栏项 URL*/
|
|
40
|
+
url: string;
|
|
41
|
+
/**自定义底部导航栏项图标*/
|
|
42
|
+
icon?: string;
|
|
43
|
+
/**自定义底部导航栏项样式*/
|
|
44
|
+
style?: React.CSSProperties;
|
|
45
|
+
/**自定义底部导航栏项类名*/
|
|
46
|
+
className?: string;
|
|
47
|
+
/**自定义底部导航栏项选中图标*/
|
|
48
|
+
selectedIcon?: string;
|
|
49
|
+
/**自定义底部导航栏项选中图标样式*/
|
|
50
|
+
selectedIconStyle?: React.CSSProperties;
|
|
51
|
+
/**自定义底部导航栏项图标样式*/
|
|
52
|
+
iconStyle?: React.CSSProperties;
|
|
53
|
+
/**自定义底部导航栏项选中图标类名*/
|
|
54
|
+
selectedIconClassName?: string;
|
|
55
|
+
/**自定义底部导航栏项选中文本样式*/
|
|
56
|
+
selectedTextStyle?: React.CSSProperties;
|
|
57
|
+
/**自定义底部导航栏项文本样式*/
|
|
58
|
+
textStyle?: React.CSSProperties;
|
|
59
|
+
/**自定义底部导航栏项选中文本类名*/
|
|
60
|
+
selectedTextClassName?: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface FairysTaroCustomTabBarProps {}
|
|
64
|
+
|
|
65
|
+
export interface FairysTaroCustomTabBarItemProps {
|
|
66
|
+
/**自定义底部导航栏项*/
|
|
67
|
+
item: FairysTaroCustomTabBarItemItem;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const FairysTaroCustomTabBarItemBase = (props: FairysTaroCustomTabBarItemProps) => {
|
|
71
|
+
const { item } = props;
|
|
72
|
+
const { selected, color, selectedColor } = useSnapshot(fairysTaroCustomTabBarState);
|
|
73
|
+
const isSelected = selected === item.url;
|
|
74
|
+
const className = useMemo(() => clsx('fairys_taro_custom_tab_bar_item', item.className), [item.className]);
|
|
75
|
+
const imgClassName = useMemo(
|
|
76
|
+
() =>
|
|
77
|
+
clsx('fairys_taro_custom_tab_bar_item_img', item.selectedIconClassName, {
|
|
78
|
+
fairys_taro_custom_tab_bar_item_img_selected: isSelected,
|
|
79
|
+
// 'fairystaro__opacity-100': isSelected,
|
|
80
|
+
// 'fairystaro__opacity-60': !isSelected,
|
|
81
|
+
}),
|
|
82
|
+
[item.selectedIconClassName, isSelected],
|
|
83
|
+
);
|
|
84
|
+
const imgStyle = useMemo(() => {
|
|
85
|
+
return {
|
|
86
|
+
opacity: isSelected ? 1 : 0.6,
|
|
87
|
+
};
|
|
88
|
+
}, [isSelected]);
|
|
89
|
+
|
|
90
|
+
const textClassName = useMemo(
|
|
91
|
+
() =>
|
|
92
|
+
clsx('fairys_taro_custom_tab_bar_item_text', item.selectedTextClassName, {
|
|
93
|
+
fairys_taro_custom_tab_bar_item_text_selected: isSelected,
|
|
94
|
+
// 'fairystaro__text-black': isSelected,
|
|
95
|
+
// 'fairystaro__text-gray-400': !isSelected,
|
|
96
|
+
}),
|
|
97
|
+
[item.selectedTextClassName, isSelected],
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
const textStyle = useMemo(() => {
|
|
101
|
+
return { color: isSelected ? selectedColor : color };
|
|
102
|
+
}, [isSelected, color, selectedColor]);
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<CoverView
|
|
106
|
+
onClick={() => fairysTaroCustomTabBarState.onSwitchTab(item.url)}
|
|
107
|
+
key={item.url}
|
|
108
|
+
style={item.style}
|
|
109
|
+
className={className}
|
|
110
|
+
>
|
|
111
|
+
{item.icon ? (
|
|
112
|
+
<CoverImage
|
|
113
|
+
src={isSelected ? item.selectedIcon || item.icon : item.icon}
|
|
114
|
+
className={imgClassName}
|
|
115
|
+
style={{ ...imgStyle, ...((isSelected ? item.selectedIconStyle : item.iconStyle) || {}) }}
|
|
116
|
+
/>
|
|
117
|
+
) : (
|
|
118
|
+
<Fragment />
|
|
119
|
+
)}
|
|
120
|
+
<CoverView
|
|
121
|
+
className={textClassName}
|
|
122
|
+
style={{
|
|
123
|
+
...((isSelected ? item.selectedTextStyle : item.textStyle) || {}),
|
|
124
|
+
...textStyle,
|
|
125
|
+
}}
|
|
126
|
+
>
|
|
127
|
+
{item.text}
|
|
128
|
+
</CoverView>
|
|
129
|
+
</CoverView>
|
|
130
|
+
);
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const FairysTaroCustomTabBarBase = () => {
|
|
134
|
+
const { items } = useSnapshot(fairysTaroCustomTabBarState);
|
|
135
|
+
const _itemsRender = useMemo(() => {
|
|
136
|
+
if (fairysTaroCustomTabBarState.isUpdatedItems === false && fairysTaroCustomTabBarRender) {
|
|
137
|
+
return fairysTaroCustomTabBarRender;
|
|
138
|
+
}
|
|
139
|
+
const render = items.map((item) => {
|
|
140
|
+
return <FairysTaroCustomTabBarItemBase key={item.url} item={item} />;
|
|
141
|
+
});
|
|
142
|
+
fairysTaroCustomTabBarState.onSetTabBarRender(render);
|
|
143
|
+
return render;
|
|
144
|
+
}, [items]);
|
|
145
|
+
|
|
146
|
+
return (
|
|
147
|
+
<CoverView className="fairys_taro_custom_tab_bar">
|
|
148
|
+
<CoverView className="fairys_taro_custom_tab_bar-border"></CoverView>
|
|
149
|
+
{_itemsRender}
|
|
150
|
+
</CoverView>
|
|
151
|
+
);
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export const FairysTaroCustomTabBar = memo(() => {
|
|
155
|
+
return useMemo(() => <FairysTaroCustomTabBarBase />, []);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* 页面高度问题
|
|
160
|
+
*/
|
|
161
|
+
export const useFairysTaroCustomTabBarPageStyle = () => {
|
|
162
|
+
return useMemo(() => {
|
|
163
|
+
const height = Taro.getSystemInfoSync().windowHeight;
|
|
164
|
+
return {
|
|
165
|
+
height: height - 60,
|
|
166
|
+
overflowY: 'auto',
|
|
167
|
+
};
|
|
168
|
+
}, []);
|
|
169
|
+
};
|
package/src/components/index.ts
CHANGED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { proxy, useSnapshot } from 'valtio';
|
|
2
|
+
import navigate from 'utils/navigate';
|
|
3
|
+
import { ProxyInstanceObjectBase } from 'utils/valtio/instance';
|
|
4
|
+
import { globalSettingDataInstance } from './global.setting.data.instance';
|
|
5
|
+
import Taro from '@tarojs/taro';
|
|
6
|
+
import { authDataInstance } from './auth.data.instance';
|
|
7
|
+
|
|
8
|
+
export interface GlobalDataInstanceState {
|
|
9
|
+
/**数据默认值不使用*/
|
|
10
|
+
__defaultValue?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 全局数据实例
|
|
15
|
+
*/
|
|
16
|
+
export class GlobalDataInstance extends ProxyInstanceObjectBase<GlobalDataInstanceState> {
|
|
17
|
+
store = proxy<GlobalDataInstanceState>({});
|
|
18
|
+
/**
|
|
19
|
+
* 跳转登录页面前执行
|
|
20
|
+
*/
|
|
21
|
+
onBeforetToLoginPage?: () => boolean | void;
|
|
22
|
+
/**跳转 redirect 路由*/
|
|
23
|
+
toRedirect = () => {
|
|
24
|
+
// 获取当前路由参数
|
|
25
|
+
const currentPath = Taro.getCurrentInstance().router?.params?.redirect || '';
|
|
26
|
+
if (currentPath) {
|
|
27
|
+
// 跳转 redirect 路由
|
|
28
|
+
navigate.navigateTo({ url: currentPath });
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**跳转登录页面*/
|
|
33
|
+
toLoginPage = () => {
|
|
34
|
+
// 清除登录凭证(token)、权限列表、菜单权限列表、用户信息
|
|
35
|
+
authDataInstance.clear();
|
|
36
|
+
if (this.onBeforetToLoginPage) {
|
|
37
|
+
const f = this.onBeforetToLoginPage();
|
|
38
|
+
if (f === false) {
|
|
39
|
+
// 如果返回false则不跳转登录页面
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const loginPageRoute = globalSettingDataInstance.store.loginPageRoute || '';
|
|
44
|
+
const isLoginPage = navigate.isCurrentPage(loginPageRoute || '');
|
|
45
|
+
const _loginPageRoute = `${loginPageRoute || ''}`.replace(/^\//, '');
|
|
46
|
+
if (isLoginPage) {
|
|
47
|
+
// 如果是登录页面不进行跳转
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// 跳转登录页面
|
|
51
|
+
Taro.navigateTo({ url: `/${_loginPageRoute}` });
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 全局数据实例
|
|
56
|
+
*/
|
|
57
|
+
export const globalDataInstance = new GlobalDataInstance();
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* 全局数据状态管理
|
|
61
|
+
*/
|
|
62
|
+
export const useGlobalData = () => {
|
|
63
|
+
const store = useSnapshot(globalDataInstance.store);
|
|
64
|
+
return [store, globalDataInstance, store.__defaultValue] as [
|
|
65
|
+
GlobalDataInstanceState,
|
|
66
|
+
GlobalDataInstance,
|
|
67
|
+
string | undefined,
|
|
68
|
+
];
|
|
69
|
+
};
|
|
@@ -7,6 +7,7 @@ import type { FairysTaroMessageItemProps } from 'components/Mesage';
|
|
|
7
7
|
import { ProxyInstanceObjectBase } from 'utils/valtio/instance';
|
|
8
8
|
import { globalSettingDataInstance } from './global.setting.data.instance';
|
|
9
9
|
import Taro from '@tarojs/taro';
|
|
10
|
+
import { authDataInstance } from './auth.data.instance';
|
|
10
11
|
|
|
11
12
|
export interface MessageDataType extends FairysTaroMessageItemProps {
|
|
12
13
|
/**用于唯一标识提示框(默认自动生成)*/
|
|
@@ -77,40 +78,6 @@ export class GlobalMessageDataInstance extends ProxyInstanceObjectBase<GlobalMes
|
|
|
77
78
|
hideToast = () => {
|
|
78
79
|
this.store.toastData = ref({ ...this.store.toastData, visible: false });
|
|
79
80
|
};
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* 跳转登录页面前执行
|
|
83
|
-
*/
|
|
84
|
-
onBeforetToLoginPage?: () => boolean | void;
|
|
85
|
-
// 跳转 redirect 路由
|
|
86
|
-
toRedirect = () => {
|
|
87
|
-
// 获取当前路由参数
|
|
88
|
-
const currentPath = Taro.getCurrentInstance().router?.params?.redirect || '';
|
|
89
|
-
if (currentPath) {
|
|
90
|
-
// 跳转 redirect 路由
|
|
91
|
-
navigate.navigateTo({ url: currentPath });
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
/**跳转登录页面*/
|
|
96
|
-
toLoginPage = () => {
|
|
97
|
-
if (this.onBeforetToLoginPage) {
|
|
98
|
-
const f = this.onBeforetToLoginPage();
|
|
99
|
-
if (f === false) {
|
|
100
|
-
// 如果返回false则不跳转登录页面
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
const loginPageRoute = globalSettingDataInstance.store.loginPageRoute || '';
|
|
105
|
-
const isLoginPage = navigate.isCurrentPage(loginPageRoute || '');
|
|
106
|
-
const _loginPageRoute = `${loginPageRoute || ''}`.replace(/^\//, '');
|
|
107
|
-
if (isLoginPage) {
|
|
108
|
-
// 如果是登录页面不进行跳转
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
// 跳转登录页面
|
|
112
|
-
Taro.navigateTo({ url: `/${_loginPageRoute}` });
|
|
113
|
-
};
|
|
114
81
|
}
|
|
115
82
|
/**
|
|
116
83
|
* 全局消息数据实例
|
package/src/context/index.ts
CHANGED
|
@@ -494,6 +494,8 @@ export interface PageDataInstanceContextProviderProps<
|
|
|
494
494
|
valueFields?: M['valueFields'];
|
|
495
495
|
/**是否是第一次加载*/
|
|
496
496
|
isMountLoad?: boolean;
|
|
497
|
+
/**是否使用 useDidShow*/
|
|
498
|
+
isDidShowLoad?: boolean;
|
|
497
499
|
/**页面标题*/
|
|
498
500
|
title?: string;
|
|
499
501
|
/**成功状态码
|
|
@@ -535,6 +537,7 @@ export function PageDataInstanceContextProvider<
|
|
|
535
537
|
responseSuccessCode,
|
|
536
538
|
responseListField,
|
|
537
539
|
responseTotalField,
|
|
540
|
+
isDidShowLoad,
|
|
538
541
|
} = props;
|
|
539
542
|
|
|
540
543
|
const pageInstance = usePageDataInstance(instance);
|
|
@@ -563,6 +566,12 @@ export function PageDataInstanceContextProvider<
|
|
|
563
566
|
}
|
|
564
567
|
}, []);
|
|
565
568
|
|
|
569
|
+
useDidShow(() => {
|
|
570
|
+
if (isDidShowLoad) {
|
|
571
|
+
pageInstance.main_onSearch();
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
|
|
566
575
|
useDidShow(() => {
|
|
567
576
|
if (title) {
|
|
568
577
|
// 列表查询才调用
|
|
@@ -235,6 +235,8 @@ export interface PageInfoDataInstanceContextProviderProps<
|
|
|
235
235
|
title?: string;
|
|
236
236
|
/**页面一加载是否请求详情接口*/
|
|
237
237
|
isMountRequestInfo?: boolean;
|
|
238
|
+
/**是否使用 useDidShow*/
|
|
239
|
+
isDidShowRequestInfo?: boolean;
|
|
238
240
|
/**自定义hooks,挂载参数和设置完初始值后执行*/
|
|
239
241
|
useHooks?: (instance: M) => void;
|
|
240
242
|
}
|
|
@@ -254,6 +256,7 @@ export function PageInfoDataInstanceContextProvider<
|
|
|
254
256
|
title,
|
|
255
257
|
isMountRequestInfo,
|
|
256
258
|
useHooks,
|
|
259
|
+
isDidShowRequestInfo,
|
|
257
260
|
} = props;
|
|
258
261
|
const pageInfoInstance = usePageInfoDataInstance(instance);
|
|
259
262
|
pageInfoInstance.requestInfoConfig = requestInfoConfig;
|
|
@@ -276,6 +279,11 @@ export function PageInfoDataInstanceContextProvider<
|
|
|
276
279
|
}
|
|
277
280
|
}, []);
|
|
278
281
|
|
|
282
|
+
useDidShow(() => {
|
|
283
|
+
if (isDidShowRequestInfo) {
|
|
284
|
+
pageInfoInstance.main_getInfo();
|
|
285
|
+
}
|
|
286
|
+
});
|
|
279
287
|
return (
|
|
280
288
|
<PageInfoDataInstanceContext.Provider value={pageInfoInstance}>{children}</PageInfoDataInstanceContext.Provider>
|
|
281
289
|
);
|
package/src/utils/request.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import Taro from '@tarojs/taro';
|
|
2
2
|
import { globalSettingDataInstance } from 'context/global.setting.data.instance';
|
|
3
3
|
import { globalMessageDataInstance } from 'context/global.message.data.instance';
|
|
4
|
+
import { globalDataInstance } from 'context/global.data.instance';
|
|
4
5
|
|
|
5
6
|
const codeMessage = {
|
|
6
7
|
400: '发出的请求错误',
|
|
@@ -56,7 +57,7 @@ const requestResponseHandle = (
|
|
|
56
57
|
// 权限问题 ,重新登录
|
|
57
58
|
msg = '请重新登录';
|
|
58
59
|
/**重新跳转登录页面*/
|
|
59
|
-
|
|
60
|
+
globalDataInstance.toLoginPage();
|
|
60
61
|
} else if (![globalSettingDataInstance.store.requestSuccessCode, requestSuccessCode, 1, 200].includes(code)) {
|
|
61
62
|
// 提示内容
|
|
62
63
|
// @ts-ignore
|
|
@@ -244,7 +245,7 @@ export class RequestInstance {
|
|
|
244
245
|
}
|
|
245
246
|
}
|
|
246
247
|
options?.fail?.({ errMsg: '未登录' });
|
|
247
|
-
|
|
248
|
+
globalDataInstance.toLoginPage();
|
|
248
249
|
return undefined;
|
|
249
250
|
}
|
|
250
251
|
}
|