问题描述
因此,我一直在使用react-trasition-group
对同一元素的不同状态执行转换,并且所有操作在此都正常。当有多个(两个)元素在其间转换时,会出现问题。我不确定它在documentation中如何工作,但是每当我输入key
时TypeScript都会发疯,并告诉我key
不能为布尔值,这完全可以理解为key
是React保留的东西,可用作动态生成的元素的唯一标识符。
我的尝试
const [trigger,setTrigger] = useState(false)
return(
<SwitchTransition mode="out-in">
<Csstransition
addEndListener={(node: HTMLElement,done: () => void) => {
node.addEventListener("transitionend",done,false)
}}
classNames="myclass"
key={trigger}
>
{trigger ? (
<p>Render when true</p>
) : (
<p>Render when false</p>
)}
</Csstransition>
</SwitchTransition>
)
我遇到的错误是由于上述书面事实,我在文档中找不到SwitchTransition
应该如何工作。任何帮助表示赞赏。|
PS:我已经在Github和Stackoverflow上检查了类似的问题,但显然以前没有人遇到过类似的错误。
编辑:我想我应该做进一步的阐述,因为我有2条建议要求我将布尔值更改为字符串。那不是我的问题。我的问题是过渡本身不起作用,这是由于react-transition-group
由于某种原因想要文档中编写的密钥而引起的。我还注意到addEndListener
也引起了问题。
解决方法
是的,确实Typescript版本有一些差异。这是一个工作版本。
const [trigger,setTrigger] = useState(0);
const nodeRef = useRef<any>(null);
return(
<div>
<button onClick={() => setTrigger(trigger + 1)}>toggle</button>
<SwitchTransition mode="out-in">
<CSSTransition
nodeRef={nodeRef}
addEndListener={(done: () => void) => {
nodeRef.current?.addEventListener("transitionend",done,false);
}}
classNames="myclass"
key={trigger}
>
<div ref={nodeRef}>
<p>{trigger}</p>
</div>
</CSSTransition>
</SwitchTransition>
</div>
)
nodeRef
用于提供对transitions组件的元素引用,以防止出现此错误:
Warning: findDOMNode is deprecated in StrictMode. findDOMNode was passed an instance of Transition which is inside StrictMode. Instead,add a ref directly to the element you want to reference.
参见演示,网址为:https://stackblitz.com/edit/react-ts-fcyubb?file=index.tsx