<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        使用react render props實現倒計時的示例代碼

        來源:懂視網 責編:小采 時間:2020-11-27 22:02:57
        文檔

        使用react render props實現倒計時的示例代碼

        使用react render props實現倒計時的示例代碼:react的組件模式可以觀看Michael Chan的演講視頻,平時大家常聽到的react模式也是HOC, HOC的使用場景很多,譬如react-redux的connect,這里不贅述HOC相關,感興趣可以自行了解。 首先是這樣一個場景,我的業務需要實現倒計時,倒計時你懂得,倒計時經常應用在
        推薦度:
        導讀使用react render props實現倒計時的示例代碼:react的組件模式可以觀看Michael Chan的演講視頻,平時大家常聽到的react模式也是HOC, HOC的使用場景很多,譬如react-redux的connect,這里不贅述HOC相關,感興趣可以自行了解。 首先是這樣一個場景,我的業務需要實現倒計時,倒計時你懂得,倒計時經常應用在

        react的組件模式可以觀看Michael Chan的演講視頻,平時大家常聽到的react模式也是HOC, HOC的使用場景很多,譬如react-redux的connect,這里不贅述HOC相關,感興趣可以自行了解。

        首先是這樣一個場景,我的業務需要實現倒計時,倒計時你懂得,倒計時經常應用在預告一個活動的開始,像秒殺,像開售搶購等,或者活動的截止。

        我們來梳理一下這個倒計時的功能:

      1. 定時更新時間,以秒為度;
      2. 可以更新倒計時的截止時間,比如從10月1日更新為10月2日;
      3. 倒計時結束,執行對應結束邏輯;
      4. 倒計時結束,開啟另一個活動倒計時;
      5. 同時有多個倒計時;
      6. 這個時候我便開始編碼,考慮代碼復用,我用Class的模式實現一個倒計時:

        class Timer {
         constructor(time, countCb, timeoutCb) {
         this.countCb = countCb;
         this.timeoutCb = timeoutCb;
         this.setDelayTime(time);
         }
        
         intervalId = null;
        
         clearInterval = () => {
         if (this.intervalId) {
         clearInterval(this.intervalId);
         }
         }
        
         // 更新倒計時的截止時間
         setDelayTime = (time) => {
         this.clearInterval();
        
         if (time) {
         this.delayTime = time;
         this.intervalId = setInterval(() => {
         this.doCount();
         }, 1000);
         }
         }
        
         doCount = () => {
         const timeDiffSecond =
         `${this.delayTime - Date.now()}`.replace(/\d{3}$/, '000') / 1000;
        
         if (timeDiffSecond <= 0) {
         this.clearInterval();
         if (typeof this.timeoutCb === 'function') {
         this.timeoutCb();
         }
         return;
         }
        
         const day = Math.floor(timeDiffSecond / 86400);
         const hour = Math.floor((timeDiffSecond % 86400) / 3600);
         const minute = Math.floor((timeDiffSecond % 3600) / 60);
         const second = Math.floor((timeDiffSecond % 3600) % 60);
        
         // 執行回調,由調用方決定顯示格式
         if (typeof this.countCb === 'function') {
         this.countCb({
         day,
         hour,
         minute,
         second,
         });
         }
         }
        }
        
        export default Timer;

        通過class的方式可以實現我的上述功能,將格式顯示交給調用方決定,Timer只實現倒計時功能,這并沒有什么問題,我們看調用方如何使用:

         // 這是一個react組件部分代碼 
         componentDidMount() {
         // 開啟倒計時
         this.countDownLiveDelay();
         }
        
         componentDidUpdate() {
         // 開啟倒計時
         this.countDownLiveDelay();
         }
        
         componentWillUnmount() {
         if (this.timer) {
         this.timer.clearInterval();
         }
         }
        
         timer = null;
        
         countDownLiveDelay = () => {
         const {
         countDownTime,
         onTimeout,
         } = this.props;
        
         if (this.timer) { return; }
        
         const time = countDownTime * 1000;
        
         if (time <= Date.now()) {
         onTimeout();
         }
         // new 一個timer對象
         this.timer = new Timer(time, ({ hour, minute, second }) => {
         this.setState({
         timeDelayText: `${formateTimeStr(hour)}:${formateTimeStr(minute)}:${formateTimeStr(second)}`,
         });
         }, () => {
         this.timer = null;
        
         if (typeof onTimeout === 'function') {
         onTimeout();
         }
         });
         }
        
         render() {
         return (
         <span style={styles.text}>{this.state.timeDelayText}</span>
         );
         }

        查看這種方式的調用的缺點:調用方都需要手動開啟倒計時,countDownLiveDelay方法調用

        總感覺不夠優雅,直到我看到了react的render props, 突然靈關一現,來了下面這段代碼:

        let delayTime;
        // 倒計時組件
        class TimeCountDown extends Component {
         state = {
         day: 0,
         hour: 0,
         minute: 0,
         second: 0,
         }
        
         componentDidMount() {
         delayTime = this.props.time;
         this.startCountDown();
         }
        
         componentDidUpdate() {
         if (this.props.time !== delayTime) {
         delayTime = this.props.time;
        
         this.clearTimer();
         this.startCountDown();
         }
         }
        
         timer = null;
        
         clearTimer() {
         if (this.timer) {
         clearInterval(this.timer);
         this.timer = null;
         }
         }
        
         // 開啟計時
         startCountDown() {
         if (delayTime && !this.timer) {
         this.timer = setInterval(() => {
         this.doCount();
         }, 1000);
         }
         }
        
         doCount() {
         const {
         onTimeout,
         } = this.props;
        
         // 使用Math.floor((delayTime - Date.now()) / 1000)的話會導致這里值為0,前面delayTime - Date.now() > 0
         const timeDiffSecond = (delayTime - `${Date.now()}`.replace(/\d{3}$/, '000')) / 1000;
        
         if (timeDiffSecond <= 0) {
         this.clearTimer();
         if (typeof onTimeout === 'function') {
         onTimeout();
         }
         return;
         }
        
         const day = Math.floor(timeDiffSecond / 86400);
         const hour = Math.floor((timeDiffSecond % 86400) / 3600);
         const minute = Math.floor((timeDiffSecond % 3600) / 60);
         const second = Math.floor((timeDiffSecond % 3600) % 60);
        
         this.setState({
         day,
         hour,
         minute,
         second,
         });
         }
        
         render() {
         const {
         render,
         } = this.props;
        
         return render({
         ...this.state,
         });
         }
        }
        
        export default TimeCountDown;

        具體TimeCountDown代碼可戳這里

        調用方:

        import TimeCountDown from 'TimeCountDown';
        function formateTimeStr(num) {
         return num < 10 ? `0${num}` : num;
        }
        // 業務調用倒計時組件
        class CallTimer extends Component {
         onTimeout = () => {
         this.forceUpdate();
         }
         render() {
         // 傳遞render函數
         return (
         <span style={styles.statusText}>
         距直播還有
         <TimeCountDown
         time={time}
         onTimeout={() => { this.onTimeout(); }}
         render={({ hour, minute, second }) => {
         return (
         <span>
         {formateTimeStr(hour)}:{formateTimeStr(minute)}:{formateTimeStr(second)}
         </span>
         );
         }}
         />
         </span>
         )
         }
        }

        對比這種方式,通過傳遞一個函數render方法給到TimeCountDown組件,TimeCountDown組件渲染時執行props的render方法,并傳遞TimeCountDown的state進行渲染,這就是render props的模式了,這種方式靈活、優雅很多,很多場景都可以使用這種方式,而無需使用HOC。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        使用react render props實現倒計時的示例代碼

        使用react render props實現倒計時的示例代碼:react的組件模式可以觀看Michael Chan的演講視頻,平時大家常聽到的react模式也是HOC, HOC的使用場景很多,譬如react-redux的connect,這里不贅述HOC相關,感興趣可以自行了解。 首先是這樣一個場景,我的業務需要實現倒計時,倒計時你懂得,倒計時經常應用在
        推薦度:
        標簽: 實現 倒計時 React
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产四虎免费精品视频| 全黄大全大色全免费大片| 免费观看黄色的网站| 久久亚洲精品视频| 特级做A爰片毛片免费看无码| 亚洲精品成人网久久久久久| 日韩毛片免费一二三| 国产jizzjizz免费看jizz| 久久人午夜亚洲精品无码区| 国产免费一区二区三区VR| 亚洲av无码专区在线电影天堂| 日韩特黄特色大片免费视频| 亚洲色偷精品一区二区三区| 在线观看亚洲免费| 美女黄网站人色视频免费| 亚洲综合色区在线观看| 中国人免费观看高清在线观看二区| 亚洲无线码一区二区三区| a成人毛片免费观看| 亚洲国产精品lv| 日本黄网站动漫视频免费| 亚洲av第一网站久章草| 国产国拍亚洲精品福利| 日本中文字幕免费高清视频| 亚洲第一页在线观看| 啦啦啦手机完整免费高清观看| 杨幂最新免费特级毛片| 日日噜噜噜噜夜夜爽亚洲精品| 十八禁无码免费网站| 在线aⅴ亚洲中文字幕| 亚洲成a人无码av波多野按摩| 三级网站免费观看| 亚洲免费网站在线观看| 免费观看国产精品| 日本免费一区二区久久人人澡| 亚洲三级在线观看| 老司机亚洲精品影视www| 免费精品国产自产拍在| 成人免费网站久久久| 久久狠狠高潮亚洲精品| 精品剧情v国产在免费线观看|