国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

React跨路由組件動畫

這篇具有很好參考價值的文章主要介紹了React跨路由組件動畫。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

我們是袋鼠云數(shù)棧 UED 團(tuán)隊(duì),致力于打造優(yōu)秀的一站式數(shù)據(jù)中臺產(chǎn)品。我們始終保持工匠精神,探索前端道路,為社區(qū)積累并傳播經(jīng)驗(yàn)價值。

本文作者:佳嵐

回顧傳統(tǒng)React動畫

對于普通的 React 動畫,我們大多使用官方推薦的 react-transition-group,其提供了四個基本組件 Transition、CSSTransition、SwitchTransition、TransitionGroup

Transition

Transition 組件允許您使用簡單的聲明式 API 來描述組件的狀態(tài)變化,默認(rèn)情況下,Transition 組件不會改變它呈現(xiàn)的組件的行為,它只跟蹤組件的“進(jìn)入”和“退出”狀態(tài),我們需要做的是賦予這些狀態(tài)意義。

其一共提供了四種狀態(tài),當(dāng)組件感知到 in prop 變化時就會進(jìn)行相應(yīng)的狀態(tài)過渡

  • 'entering'
  • 'entered'
  • 'exiting'
  • 'exited'
const defaultStyle = {
  transition: `opacity ${duration}ms ease-in-out`,
  opacity: 0,
}

const transitionStyles = {
  entering: { opacity: 1 },
  entered:  { opacity: 1 },
  exiting:  { opacity: 0 },
  exited:  { opacity: 0 },
};

const Fade = ({ in: inProp }) => (
  <Transition in={inProp} timeout={duration}>
    {state => (
      <div style={{
        ...defaultStyle,
        ...transitionStyles[state]
      }}>
        I'm a fade Transition!
      </div>
    )}
  </Transition>
);

CSSTransition

此組件主要用來做 CSS 樣式過渡,它能夠在組件各個狀態(tài)變化的時候給我們要過渡的標(biāo)簽添加上不同的類名。所以參數(shù)和平時的 className 不同,參數(shù)為:classNames

<CSSTransition
  in={inProp}
  timeout={300}
  classNames="fade"
  unmountOnExit
>
  <div className="star">?</div>
</CSSTransition>

// 定義過渡樣式類
.fade-enter {
  opacity: 0;
}
.fade-enter-active {
  opacity: 1;
  transition: opacity 200ms;
}
.fade-exit {
  opacity: 1;
}
.fade-exit-active {
  opacity: 0;
  transition: opacity 200ms;
}

SwitchTransition

SwitchTransition 用來做組件切換時的過渡,其會緩存?zhèn)魅氲?children,并在過渡結(jié)束后渲染新的 children

function App() {
 const [state, setState] = useState(false);
 return (
   <SwitchTransition>
     <CSSTransition
       key={state ? "Goodbye, world!" : "Hello, world!"}
       classNames='fade'
     >
       <button onClick={() => setState(state => !state)}>
         {state ? "Goodbye, world!" : "Hello, world!"}
       </button>
     </CSSTransition>
   </SwitchTransition>
 );
}

TransitionGroup

如果有一組 CSSTransition 需要我們?nèi)ミ^渡,那么我們需要管理每一個 CSSTransition 的 in 狀態(tài),這樣會很麻煩。

TransitionGroup 可以幫我們管理一組 Transition 或 CSSTransition 組件,為此我們不再需要給 Transition 組件傳入 in 屬性來標(biāo)識過渡狀態(tài),轉(zhuǎn)用 key 屬性來代替 in

<TransitionGroup>
  { 
      this.state.list.map((item, index) => {  
          return ( 
            <CSSTransition
                key = {item.id}
                timeout  = {1000}
                classNames = 'fade'
                unmountOnExit
              >
                <TodoItem />  
              </CSSTransition>
          )
        }
  }
</TransitionGroup>

TransitionGroup 會監(jiān)測其 children 的變化,將新的 children 與原有的 children 使用 key 進(jìn)行比較,就能得出哪些 children 是新增的與刪除的,從而為他們注入進(jìn)場動畫或離場動畫。

React跨路由組件動畫

FLIP 動畫

FLIP 是什么?

FLIPFirstLast、InvertPlay四個單詞首字母的縮寫

First, 元素過渡前開始位置信息

Last:執(zhí)行一段代碼,使元素位置發(fā)生變化,記錄最后狀態(tài)的位置等信息.

Invert:根據(jù) First 和 Last 的位置信息,計(jì)算出位置差值,使用 transform: translate(x,y) 將元素移動到First的位置。

Play: ?給元素加上 transition 過渡屬性,再講 transform 置為 none,這時候因?yàn)?transition 的存在,開始播放絲滑的動畫。

Flip 動畫可以看成是一種編寫動畫的范式,方法論,對于開始或結(jié)束狀態(tài)未知的復(fù)雜動畫,可以使用 Flip 快速實(shí)現(xiàn)

位置過渡效果

React跨路由組件動畫

代碼實(shí)現(xiàn):

  const container = document.querySelector('.flip-container');
  const btnAdd = document.querySelector('#add-btn')
  const btnDelete = document.querySelector('#delete-btn')
  let rectList = []

  function addItem() {
    const el = document.createElement('div')
    el.className = 'flip-item'
    el.innerText = rectList.length + 1;
    el.style.width = (Math.random() * 300 + 100) + 'px'

    // 加入新元素前重新記錄起始位置信息
    recordFirst();

    // 加入新元素
    container.prepend(el)
    rectList.unshift({
      top: undefined,
      left: undefined
    })
    
    // 觸發(fā)FLIP
    update()
  }

  function removeItem() {
    const children = container.children;
    if (children.length > 0) {
      recordFirst();
      container.removeChild(children[0])
      rectList.shift()
      update()
    }
  }

  // 記錄位置
  function recordFirst() {
    const items = container.children;
    for (let i = 0; i < items.length; i++) {
      const rect = items[i].getBoundingClientRect();
      rectList[i] = {
        left: rect.left,
        top: rect.top
      }
    }
  }

  function update() {
    const items = container.children;
    for (let i = 0; i < items.length; i++) {
      // Last
      const rect = items[i].getBoundingClientRect();
      if (rectList[i].left !== undefined) {

       // Invert
        const transformX = rectList[i].left - rect.left;
        const transformY = rectList[i].top - rect.top;

        items[i].style.transform = `translate(${transformX}px, ${transformY}px)`
        items[i].style.transition = "none"

        // Play
        requestAnimationFrame(() => {
          items[i].style.transform = `none`
          items[i].style.transition = "all .5s"
        })
      }
    }
  }

  btnAdd.addEventListener('click', () => {
    addItem()
  })
  btnDelete.addEventListener('click', () => {
    removeItem()
  })

使用 flip 實(shí)現(xiàn)的動畫 demo

亂序動畫:

React跨路由組件動畫

縮放動畫:

React跨路由組件動畫

React跨路由組件動畫

在 React 中路由之前的切換動畫可以使用 react-transition-group 來實(shí)現(xiàn),但對于不同路由上的組件如何做到動畫過渡是個很大的難題,目前社區(qū)中也沒有一個成熟的方案。

React跨路由組件動畫

使用flip來實(shí)現(xiàn)

在路由 A 中組件的大小與位置狀態(tài)可以當(dāng)成 First, 在路由 B 中組件的大小與位置狀態(tài)可以當(dāng)成 Last,

從路由 A 切換至路由B時,向 B 頁面?zhèn)鬟f First 狀態(tài),B 頁面中需要過渡的組件再進(jìn)行 Flip 動畫。

為此我們可以抽象出一個組件來幫我們實(shí)現(xiàn) Flip 動畫,并且能夠在切換路由時保存組件的狀態(tài)。

對需要進(jìn)行過渡的組件進(jìn)行包裹, 使用相同的 flipId 來標(biāo)識他們需要在不同的路由中過渡。

<FlipRouteAnimate className="about-profile" flipId="avatar" animateStyle={{ borderRadius: "15px" }}>
  <img src={require("./touxiang.jpg")} alt="" />
</FlipRouteAnimate>

完整代碼:

import React, { createRef } from "react";
import withRouter from "./utils/withRouter";
class FlipRouteAnimate extends React.Component {
  constructor(props) {
    super(props);
    this.flipRef = createRef();
  }
  // 用來存放所有實(shí)例的rect
  static flipRectMap = new Map();
  componentDidMount() {
    const {
      flipId,
      location: { pathname },
      animateStyle: lastAnimateStyle,
    } = this.props;

    const lastEl = this.flipRef.current;

    // 沒有上一個路由中組件的rect,說明不用進(jìn)行動畫過渡
    if (!FlipRouteAnimate.flipRectMap.has(flipId) || flipId === undefined) return;

    // 讀取緩存的rect
    const first = FlipRouteAnimate.flipRectMap.get(flipId);
    if (first.route === pathname) return;

    // 開始FLIP動畫
    const firstRect = first.rect;
    const lastRect = lastEl.getBoundingClientRect();

    const transformOffsetX = firstRect.left - lastRect.left;
    const transformOffsetY = firstRect.top - lastRect.top;

    const scaleRatioX = firstRect.width / lastRect.width;
    const scaleRatioY = firstRect.height / lastRect.height;

    lastEl.style.transform = `translate(${transformOffsetX}px, ${transformOffsetY}px) scale(${scaleRatioX}, ${scaleRatioY})`;
    lastEl.style.transformOrigin = "left top";

    for (const styleName in first.animateStyle) {
      lastEl.style[styleName] = first.animateStyle[styleName];
    }

    setTimeout(() => {
      lastEl.style.transition = "all 2s";
      lastEl.style.transform = `translate(0, 0) scale(1)`;
      // 可能有其他屬性也需要過渡
      for (const styleName in lastAnimateStyle) {
        lastEl.style[styleName] = lastAnimateStyle[styleName];
      }
    }, 0);
  }

  componentWillUnmount() {
    const {
      flipId,
      location: { pathname },
      animateStyle = {},
    } = this.props;
    const el = this.flipRef.current;
    // 組件卸載時保存自己的位置等狀態(tài)
    const rect = el.getBoundingClientRect();

    FlipRouteAnimate.flipRectMap.set(flipId, {
      // 當(dāng)前路由路徑
      route: pathname,
      // 組件的大小位置
      rect: rect,
      // 其他需要過渡的樣式
      animateStyle,
    });
  }
  render() {
    return (
      <div
        className={this.props.className}
        style={{ display: "inline-block", ...this.props.style, ...this.props.animateStyle }}
        ref={this.flipRef}
      >
        {this.props.children}
      </div>
    );
  }
}

實(shí)現(xiàn)效果:

React跨路由組件動畫

共享組件的方式實(shí)現(xiàn)

要想在不同的路由共用同一個組件實(shí)例,并不現(xiàn)實(shí),樹形的 Dom 樹并不允許我們這么做。

React跨路由組件動畫

我們可以換個思路,把組件提取到路由容器的外部,然后通過某種方式將該組件與路由頁面相關(guān)聯(lián)。

React跨路由組件動畫

我們將 Float 組件提升至根組件,然后在每個路由中使用 Proxy 組件進(jìn)行占位,當(dāng)路由切換時,每個 Proxy 將其位置信息與其他 props 傳遞給 Float 組件,F(xiàn)loat 組件再根據(jù)接收到的狀態(tài)信息,將自己移動到對應(yīng)位置。

我們先封裝一個 Proxy 組件, ?使用 PubSub 發(fā)布元信息。

// FloatProxy.tsx
const FloatProxy: React.FC<any> = (props: any) => {
  const el = useRef();

  // 保存代理元素引用,方便獲取元素的位置信息
  useEffect(() => {
    PubSub.publish("proxyElChange", el);
    return () => {
      PubSub.publish("proxyElChange", null);
    }
  }, []);

  useEffect(() => {
    PubSub.publish("metadataChange", props);
  }, [props]);

  const computedStyle = useMemo(() => {
    const propStyle = props.style || {};
    return {
      border: "dashed 1px #888",
      transition: "all .2s ease-in",
      ...propStyle,
    };
  }, [props.style]);

  return <div {...props} style={computedStyle} ref={el}></div>;
};

在路由中使用, 將樣式信息進(jìn)行傳遞

class Bar extends React.Component {
  render() {
    return (
      <div className="container">
        <p>bar</p>
        <div style={{ marginTop: "140px" }}>
          <FloatProxy style={{ width: 120, height: 120, borderRadius: 15, overflow: "hidden" }} />
        </div>
      </div>
    );
  }
}

創(chuàng)建全局變量用于保存代理信息

// floatData.ts
type ProxyElType = {
  current: HTMLElement | null;
};
type MetaType = {
  attrs: any;
  props: any;
};

export const metadata: MetaType = {
  attrs: {
    hideComponent: true,
    left: 0,
    top: 0
  },
  props: {},
};

export const proxyEl: ProxyElType = {
  current: null,
};

創(chuàng)建一個FloatContainer容器組件,用于監(jiān)聽代理數(shù)據(jù)的變化, ?數(shù)據(jù)變動時驅(qū)動組件進(jìn)行移動

import { metadata, proxyEl } from "./floatData";
class FloatContainer extends React.Component<any, any> {
  componentDidMount() {
    // 將代理組件上的props綁定到Float組件上
    PubSub.subscribe("metadataChange", (msg, props) => {
      metadata.props = props;
      this.forceUpdate();
    });

    // 切換路由后代理元素改變,保存代理元素的位置信息
    PubSub.subscribe("proxyElChange", (msg, el) => {
      if (!el) {
        metadata.attrs.hideComponent = true;
        // 在下一次tick再更新dom
        setTimeout(() => {
          this.forceUpdate();
        }, 0);
        return;
      } else {
        metadata.attrs.hideComponent = false;
      }
      proxyEl.current = el.current;
      const rect = proxyEl.current?.getBoundingClientRect()!;
      metadata.attrs.left = rect.left;
      metadata.attrs.top = rect.top
      this.forceUpdate();
    });
  }

  render() {
    const { timeout = 500 } = this.props;
    const wrapperStyle: React.CSSProperties = {
      position: "fixed",
      left: metadata.attrs.left,
      top: metadata.attrs.top,
      transition: `all ${timeout}ms ease-in`,
   		// 當(dāng)前路由未注冊Proxy時進(jìn)行隱藏
      display: metadata.attrs.hideComponent ? "none" : "block",
    };

    const propStyle = metadata.props.style || {};

    // 注入過渡樣式屬性
    const computedProps = {
      ...metadata.props,
      style: {
        transition: `all ${timeout}ms ease-in`,
        ...propStyle,
      },
    };
    console.log(metadata.attrs.hideComponent)

    return <div className="float-element" style={wrapperStyle}>{this.props.render(computedProps)} </div>;
  }
}

將組件提取到路由容器外部,并使用 FloatContainer 包裹

function App() {
  return (
    <BrowserRouter>
      <div className="App">
        <NavLink to={"/"}>/foo</NavLink>
        <NavLink to={"/bar"}>/bar</NavLink>
        <NavLink to={"/baz"}>/baz</NavLink>
        <FloatContainer render={(attrs: any) => <MyImage {...attrs}/>}></FloatContainer>
        <Routes>
          <Route path="/" element={<Foo />}></Route>
          <Route path="/bar" element={<Bar />}></Route>
          <Route path="/baz" element={<Baz />}></Route>
        </Routes>
      </div>
    </BrowserRouter>
  );
}

實(shí)現(xiàn)效果:

React跨路由組件動畫

目前我們實(shí)現(xiàn)了一個單例的組件,我們將組件改造一下,讓其可以被復(fù)用

首先我們將元數(shù)據(jù)更改為一個元數(shù)據(jù) map,以 layoutId 為鍵,元數(shù)據(jù)為值

// floatData.tsx
type ProxyElType = {
  current: HTMLElement | null;
};
type MetaType = {
  attrs: {
    hideComponent: boolean,
    left: number,
    top: number
  };
  props: any;
};

type floatType = {
  metadata: MetaType,
  proxyEl: ProxyElType
}

export const metadata: MetaType = {
  attrs: {
    hideComponent: true,
    left: 0,
    top: 0
  },
  props: {},
};

export const proxyEl: ProxyElType = {
  current: null,
};

export const floatMap = new Map<string, floatType>()

在代理組件中傳遞layoutId 來通知注冊了相同layoutId的floatContainer做出相應(yīng)變更

// FloatProxy.tsx 

// 保存代理元素引用,方便獲取元素的位置信息
  useEffect(() => {
    const float = floatMap.get(props.layoutId);
    if (float) {
      float.proxyEl.current = el.current;
    } else {
      floatMap.set(props.layoutId, {
        metadata: {
          attrs: {
            hideComponent: true,
            left: 0,
            top: 0,
          },
          props: {},
        },
        proxyEl: {
          current: el.current,
        },
      });
    }
    PubSub.publish("proxyElChange", props.layoutId);
    return () => {
      if (float) {
        float.proxyEl.current = null
        PubSub.publish("proxyElChange", props.layoutId);
      }
    };
  }, []);


// 在路由中使用
 <FloatProxy layoutId='layout1' style={{ width: 200, height: 200 }} />

在FloatContainer組件上也加上layoutId來標(biāo)識同一組

// FloatContainer.tsx

// 監(jiān)聽到自己同組的Proxy發(fā)送消息時進(jìn)行rerender
PubSub.subscribe("metadataChange", (msg, layoutId) => {
    if (layoutId === this.props.layoutId) {
        this.forceUpdate();
    }
});

// 頁面中使用
 <FloatContainer layoutId='layout1' render={(attrs: any) => <MyImage imgSrc={img} {...attrs} />}></FloatContainer>

實(shí)現(xiàn)多組過渡的效果

React跨路由組件動畫

最后

歡迎關(guān)注【袋鼠云數(shù)棧UED團(tuán)隊(duì)】~
袋鼠云數(shù)棧UED團(tuán)隊(duì)持續(xù)為廣大開發(fā)者分享技術(shù)成果,相繼參與開源了歡迎star文章來源地址http://www.zghlxwxcb.cn/news/detail-710597.html

  • 大數(shù)據(jù)分布式任務(wù)調(diào)度系統(tǒng)——Taier
  • 輕量級的 Web IDE UI 框架——Molecule
  • 針對大數(shù)據(jù)領(lǐng)域的 SQL Parser 項(xiàng)目——dt-sql-parser
  • 袋鼠云數(shù)棧前端團(tuán)隊(duì)代碼評審工程實(shí)踐文檔——code-review-practices
  • 一個速度更快、配置更靈活、使用更簡單的模塊打包器——ko

到了這里,關(guān)于React跨路由組件動畫的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 揭秘|來看看袋鼠云數(shù)棧內(nèi)部的資產(chǎn)血緣方案設(shè)計(jì)與實(shí)現(xiàn)

    揭秘|來看看袋鼠云數(shù)棧內(nèi)部的資產(chǎn)血緣方案設(shè)計(jì)與實(shí)現(xiàn)

    數(shù)據(jù)資產(chǎn)現(xiàn)在需要接入數(shù)棧內(nèi)部相關(guān)應(yīng)用的時候,支持查看血緣的類型從表、離線任務(wù)增加到需要表、離線任務(wù)、實(shí)時任務(wù)、API任務(wù)、指標(biāo)、標(biāo)簽等,需要支持?jǐn)?shù)?,F(xiàn)有的所有應(yīng)用任務(wù),最終實(shí)現(xiàn)在數(shù)據(jù)資產(chǎn)平臺查看任務(wù)的完整應(yīng)用鏈路。 雖然增加不同的任務(wù),現(xiàn)階段資產(chǎn)實(shí)

    2024年02月16日
    瀏覽(26)
  • 袋鼠云數(shù)棧前端從 Multirepo 到 Monorepo 研發(fā)效率提升探索之路

    袋鼠云數(shù)棧前端從 Multirepo 到 Monorepo 研發(fā)效率提升探索之路

    我們是袋鼠云數(shù)棧 UED 團(tuán)隊(duì),致力于打造優(yōu)秀的一站式數(shù)據(jù)中臺產(chǎn)品。我們始終保持工匠精神,探索前端道路,為社區(qū)積累并傳播經(jīng)驗(yàn)價值。 本文作者:星野 前端代碼管理一直是困擾著不少前端開發(fā)團(tuán)隊(duì)的難題,從開發(fā)到發(fā)布的整體工作流程中,除了常規(guī)的技術(shù)問題外,往往

    2024年02月04日
    瀏覽(23)
  • 袋鼠云產(chǎn)品功能更新報(bào)告05期|應(yīng)有盡“優(yōu)”,數(shù)棧一大波功能優(yōu)化升級!

    袋鼠云產(chǎn)品功能更新報(bào)告05期|應(yīng)有盡“優(yōu)”,數(shù)棧一大波功能優(yōu)化升級!

    這段時間,我們對產(chǎn)品本身以及客戶反饋的一些問題進(jìn)行了持續(xù)的更新和優(yōu)化,包括對離線平臺數(shù)據(jù)同步功能的更新,數(shù)據(jù)資產(chǎn)平臺血緣問題的優(yōu)化等,力求滿足不同行業(yè)用戶的更多需求,為用戶帶來極致的產(chǎn)品使用體驗(yàn)。 以下為袋鼠云產(chǎn)品功能更新報(bào)告第五期內(nèi)容,更多探

    2024年02月04日
    瀏覽(42)
  • 性能提升30%!袋鼠云數(shù)?;?Apache Hudi 的性能優(yōu)化實(shí)戰(zhàn)解析

    性能提升30%!袋鼠云數(shù)?;?Apache Hudi 的性能優(yōu)化實(shí)戰(zhàn)解析

    Apache Hudi 是一款開源的數(shù)據(jù)湖解決方案,它能夠幫助企業(yè)更好地管理和分析海量數(shù)據(jù),支持高效的數(shù)據(jù)更新和查詢。并提供多種數(shù)據(jù)壓縮和存儲格式以及索引功能,從而為企業(yè)數(shù)據(jù)倉庫實(shí)踐提供更加靈活和高效的數(shù)據(jù)處理方式。 在金融領(lǐng)域,企業(yè)可以使用 Hudi 來處理大量需要

    2024年02月09日
    瀏覽(22)
  • 袋鼠云數(shù)棧 DataOps 數(shù)據(jù)生產(chǎn)力實(shí)踐,實(shí)現(xiàn)數(shù)據(jù)流程的自動化和規(guī)范化

    袋鼠云數(shù)棧 DataOps 數(shù)據(jù)生產(chǎn)力實(shí)踐,實(shí)現(xiàn)數(shù)據(jù)流程的自動化和規(guī)范化

    袋鼠云產(chǎn)品團(tuán)隊(duì)在幫助企業(yè)進(jìn)行數(shù)字化轉(zhuǎn)型實(shí)踐的過程中,發(fā)現(xiàn)很多企業(yè)在數(shù)據(jù)生產(chǎn)鏈路上都有著相同的問題。包括數(shù)據(jù)團(tuán)隊(duì)聚焦于業(yè)務(wù)需求短期內(nèi)的快速交付,內(nèi)部缺少自頂向下的數(shù)據(jù)生產(chǎn)管理制度,在數(shù)據(jù)標(biāo)準(zhǔn)、數(shù)據(jù)生產(chǎn)流程到研發(fā)規(guī)范的各個層面均存在不完善與不規(guī)范

    2024年02月13日
    瀏覽(32)
  • 袋鼠云數(shù)棧UI5.0設(shè)計(jì)實(shí)戰(zhàn)|B端表單這樣設(shè)計(jì),不僅美觀還提效

    袋鼠云數(shù)棧UI5.0設(shè)計(jì)實(shí)戰(zhàn)|B端表單這樣設(shè)計(jì),不僅美觀還提效

    我們是袋鼠云數(shù)棧 UED 團(tuán)隊(duì),致力于打造優(yōu)秀的一站式數(shù)據(jù)中臺產(chǎn)品。我們始終保持工匠精神,探索前端道路,為社區(qū)積累并傳播經(jīng)驗(yàn)價值。 本文作者:大喜 相關(guān)文章:袋鼠云出品!數(shù)棧UI 5.0全新體驗(yàn)升級,設(shè)計(jì)背后的故事 表單是B端產(chǎn)品中最常見的組件之一,主要?于數(shù)據(jù)

    2024年02月03日
    瀏覽(24)
  • ?? 筆記 | react-transition-group 實(shí)現(xiàn)路由切換過渡動畫

    React 18 React router v6 React Transition Group 是一個 React 庫,專門用于在 React 應(yīng)用中管理和處理過渡動畫效果。這個庫提供了一組組件,包括 Transition、CSSTransition、SwitchTransition 和 TransitionGroup,幫助在組件的進(jìn)入和退出時應(yīng)用動畫效果。 Transition 是一個與平臺無關(guān)的組件,通常結(jié)合

    2024年03月09日
    瀏覽(26)
  • 袋鼠云春季生長大會最新議程來啦!4月20日我們云上見

    袋鼠云春季生長大會最新議程來啦!4月20日我們云上見

    如今,數(shù)字經(jīng)濟(jì)正逐步走向深化應(yīng)用、規(guī)范發(fā)展、普惠共享的新階段,數(shù)字經(jīng)濟(jì)與實(shí)體經(jīng)濟(jì)深度融合、基礎(chǔ)軟件國產(chǎn)化替代成為數(shù)字時代主潮流。數(shù)字工具如何讓千行百業(yè)共同實(shí)現(xiàn)韌性生長? 「 2023 袋鼠云春季生長大會」乘風(fēng)而起,帶來數(shù)實(shí)融合趨勢下的產(chǎn)品煥新升級剖析、

    2023年04月17日
    瀏覽(21)
  • react當(dāng)我們有兩個完全不相關(guān)的組件想要通信時,就可以利用這種模式,其中一個組件負(fù)責(zé)訂閱某個消息,而另一個元素則負(fù)責(zé)發(fā)送這個消息。使用Context配合

    在nextjs項(xiàng)目中,發(fā)現(xiàn)兩個組件沒啥關(guān)系,例如一個是一直存在的頭部組件,另一個是頁面中的組件,當(dāng)我點(diǎn)擊頭部組件中的特定按鈕時,把數(shù)據(jù)傳遞到頁面組件中,頁面組件接受到canshu數(shù)據(jù)后在做其他操作,那么他們兩個如何通訊,通過context配合觀察者模式實(shí)現(xiàn)。 首先在其

    2024年02月15日
    瀏覽(29)
  • 性能優(yōu)化-react路由懶加載和組件懶加載

    性能優(yōu)化-react路由懶加載和組件懶加載

    隨著項(xiàng)目越來越大,打包后的包體積也越來越大,嚴(yán)重影響了首屏加載速度,需要對路由和組件做懶加載處理 主要用到了react中的lazy和Suspense。 廢話不多說,直接上干貨 核心代碼 配合路由表的完整例子 效果 組件加載前 組件懶加載后 這樣就會大大加快首屏加載速度

    2024年02月14日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包