发现自己其实很多基本问题要么没搞清,要么没有在意,这些迟早都有可能成为一个幺蛾子,给我当头一击。
这个问题可以引申为是不是所有的状态都应该放在dva中管理才是最好的。
项目中用dva管理了一个状态,类似订单详情展示页面,每次订单详情就可以查看这个订单对应的信息,看起来貌似没有毛病.
进入页面就马上获取数据详情, getSingleDataDetail();会通过触发dva中的action改变dva中的singleDataDetail数据。
// 进入页面就马上获取数据详情,
useEffect(() => {
console.log(213, '执行了!')
getSingleDataDetail();
}, []);
//
通过useMemo依赖singleDataDetail创造了另一个值作为权限判断,以及创造渲染的数据。
const dataDetail: DataManagement.typeSingleDataDetail = useMemo(() => {
if (!singleDataDetail) {
InfoModal({
title: '提示',
content: '服务异常,未获取到数据详情,请联系管理员!',
closable: false,
onOk: () => {
router.push('/back/dataManagementkuanzhen');
},
});
return initDataDetail;
} else {
const { canEdit = true} = singleDataDetail;
if (!canEdit) {
// message.info('您没有编辑该指标的权限!');
router.push('/back/dataManagement');
}
return singleDataDetail;
}
}, [singleDataDetail]);
这样子遇到的问题是当singleDataDetail为里面的canEdit为false的时候回退出这个页面,但是当下一次另外一个订单进入的时候拿到,一开始拿到的singleDataDetail.canEdit默认值就会是false,这样就会导致退出,因为
进入页面就马上获取数据详情
用到的这个useEffect是相当于componentDidMount componentDidUpdate,componentWillMount这样一个角色,会先执行dataDetail 那个useMemo,会先进行判断,这样明显是不可行的!
解决办法:1.要么在验证能否编辑及验证是否应该退出之前判断一下是不是本订单;2.不把订单信息放在dva的state中,直接通过axios访问获取数据或者直接在dva的action中返回数据。
const dataDetail: DataManagement.typeSingleDataDetail = useMemo(() => {
if (!singleDataDetail) {
InfoModal({
title: '提示',
content: '服务异常,未获取到详情,请联系管理员!',
closable: false,
onOk: () => {
router.push('/back/dataManagement');
},
});
return initDataDetail;
} else {
const {
params: { id },
} = match as any;
> // 加个对id的判断区分是不是当前订单,免得用到上一个订单的信息导致退出!
const { canEdit = true, id: singleDataDetailId } = singleDataDetail;
if (!canEdit && singleDataDetailId == id) {
router.push('/back/dataManagement');
}
return singleDataDetail;
}
}, [singleDataDetail]);
const {
params: { id },
} = match as any;
// 加个对id的判断区分是不是当前订单,免得用到上一个订单的信息导致退出!
const { canEdit = true, id: singleDataDetailId } = singleDataDetail;
if (!canEdit && singleDataDetailId == id) {
但是因为我用useEffect(()=>{},[])这样一开始就会去执行请求订单详情的信息,改变dva model中的状态,然后通过connect 相当于监听了这个状态。
而useEffect 是相当于componentDidMount componentDidUpdate,componentWillMount这样一个角色。所以在初始化的时候如果用到dva model中的值就有可能拿到以前的那个上一个订单的值,
###### 我这个最大问题就是有个根据值来进行的退出机制!所以一开始用到了上一个订单的信息,由于上一个订单的信息刚好判断是退出,结果不该退出的导致了退出,非得第二次进去才行!