網站搜尋

reactjs - 我如何在 TypeScript 中讓 SwitchTransition 與 CSSTransition 一起工作


所以我一直在使用 react-trasition-group 對同一個元素的不同狀態進行過渡動畫,這裡一切運作正常。問題出現在需要在多個(兩個)元素之間進行過渡時。我不確定文檔中是怎麼描述的,但每當我輸入 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 應該如何工作的相關說明。任何幫助都將不勝感激。|

附註:我已經在 Github 和 Stackoverflow 上檢查過類似的問題,但顯然之前沒有人遇到過這樣的錯誤。

編輯: 我想我應該更詳細地說明,因為我已經收到兩個建議叫我將布林值改成字串。那不是我的問題。我的問題是過渡本身無法正常工作,這是因為 react-transition-group 不知為何按照文件的說明需要一個 key。我也注意到 addEndListener 也會引起問題。

答案#1

是的,確實 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 是為了向過渡元件提供元素參考,以防止出現此錯誤:

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