问题描述
我需要创建一些转换并有一个场景,在这个场景中,“进入”转换的 Child 应该对其转换状态有一个概念。
我尝试做的是在转换之前将“transitionDone”状态设置为“false”,在转换完成后我将此状态更新为“true”。
但是如果我通过不同的路线,续集过渡在安装时立即获得“transitionDone:true”,但我希望它为假,以便我可以告诉组件它已完成过渡。
一个简单的例子
父组件
import {
browserRouter as Router,Switch,Route,useLocation
} from "react-router-dom";
import { useEffect,useState,useRef } from "react";
import Chapter from "./Chapter";
import { Transition,SwitchTransition } from "react-transition-group";
//
function Content() {
const location = useLocation();
const [transitionDone,setTransitionDone] = useState(false);
const promiseRef = useRef(Promise.resolve(true));
// OnEnter Transition
let onEnter = (node) => {
setTransitionDone(false);
console.log("Parent: transition start");
// perform the transition and the resolve
// imagine an transition which takes 500ms
promiseRef.current = new Promise((resolve,reject) => {
setTimeout(() => {
resolve("enter");
},500);
});
};
// OnExit Transition
let onExit = (node) => {
promiseRef.current = new Promise((resolve,reject) => {
resolve("exit");
});
};
//
let endListener = (node,done) => {
//
promiseRef.current
.then((type) => {
// check if this is the enter transition
if (type === "enter") {
console.log("Parent: transition done");
setTransitionDone(true);
}
return;
})
.then(done);
};
return (
<div className="content">
<SwitchTransition mode="in-out">
<Transition
key={location.pathname}
onEnter={onEnter}
onExit={onExit}
addEndListener={endListener}
>
<div>
<Switch location={location}>
<Route path="/:chapterSlug">
<Chapter transitionDone={transitionDone}></Chapter>
</Route>
</Switch>
</div>
</Transition>
</SwitchTransition>
</div>
);
}
export default Content;
子组件
import { useParams } from "react-router-dom";
import { useEffect } from "react";
export default function Chapter(props) {
const { transitionDone } = props;
const { chapterSlug } = useParams();
useEffect(() => {
console.log(`Child: mount,transitionDone: ${transitionDone}`);
},[]);
useEffect(() => {
console.log(`Child: transitionDone changed ${transitionDone}`);
},[transitionDone]);
return <div className="chapter">Chapter: {chapterSlug}</div>;
}
我还制作了一个沙盒示例 https://codesandbox.io/s/late-microservice-83e0y?file=/src/Chapter.js:0-476
如果您单击第 1 章,控制台将显示:
- 父级:过渡开始
- 子:mount,transitionDone:false
- 孩子:transitionDone 更改为 false
- 父级:转换完成
- 孩子:transitionDone 已更改为 true
这就是我想要的,因为子组件在安装时有一个错误的 transitionDone 。 但是如果我点击第 02 章:
- 父级:过渡开始
- 子:mount,transitionDone:true
- 孩子:transitionDone 已更改为 true
- 孩子:transitionDone 更改为 false
- 父级:转换完成
- 孩子:transitionDone 已更改为 true
当孩子登上它已经有transitionDone true...
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)