<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實現(xiàn)全局組件的Toast輕提示效果

        來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 22:07:07
        文檔

        React實現(xiàn)全局組件的Toast輕提示效果

        React實現(xiàn)全局組件的Toast輕提示效果:Toast是常用的輕提示彈框,常用于頁面loading和提示語彈窗。 本例基于React實現(xiàn)一個隨時可調(diào)用且不隨頁面渲染的全局組件。 需求分析 Toast 不需要同頁面一起被渲染,而是根據(jù)需要被隨時調(diào)用。 Toast 是一個輕量級的提示組件,它的提示不會打斷用戶操作,并
        推薦度:
        導讀React實現(xiàn)全局組件的Toast輕提示效果:Toast是常用的輕提示彈框,常用于頁面loading和提示語彈窗。 本例基于React實現(xiàn)一個隨時可調(diào)用且不隨頁面渲染的全局組件。 需求分析 Toast 不需要同頁面一起被渲染,而是根據(jù)需要被隨時調(diào)用。 Toast 是一個輕量級的提示組件,它的提示不會打斷用戶操作,并

        Toast是常用的輕提示彈框,常用于頁面loading和提示語彈窗。

        本例基于React實現(xiàn)一個隨時可調(diào)用且不隨頁面渲染的全局組件。

        需求分析

      1. Toast 不需要同頁面一起被渲染,而是根據(jù)需要被隨時調(diào)用。
      2. Toast 是一個輕量級的提示組件,它的提示不會打斷用戶操作,并且會在提示的一段時間后自動關閉。
      3. Toast 需要提供幾種不同的消息類型以適應不同的使用場景。
      4. Toast 的方法必須足夠簡潔,以避免不必要的代碼冗余。
      5. 如何使用

        首先引入

        import Toast from './components/toast'

        JSX中事件調(diào)用:

        <button onClick={() => { Toast.info('普通提示') }}>普通提示</button>

        JS中方法調(diào)用:

        Toast.info('普通提示')

        回調(diào)方法:

        const hideLoading = Toast.loading('加載中...', 0, () => {
         Toast.success('加載完成')
        })
        setTimeout(hideLoading, 2000)

        調(diào)用規(guī)則:

        3個參數(shù):

      6. content 提示內(nèi)容 string(loading方法為可選)
      7. duration 提示持續(xù)時間 number,單位ms(可選)
      8. onClose 提示關閉時的回調(diào)函數(shù)(可選)
      9. Toast.info("普通",2000)
        Toast.success("成功",1000,() => {
         console.log('回調(diào)方法')
        }))
        Toast.error("錯誤")
        Toast.loading()

        代碼實現(xiàn)

        目錄結(jié)構(gòu):

        1. index.js:對外export接口,設置默認的參數(shù)值,全局創(chuàng)建或銷毀Toast的DIV。
        2. toast.js:Toast具體顯示的內(nèi)容及多次調(diào)用Toast時的狀態(tài)管理。
        3. toast.css:Toast的樣式,費話不多說。

        index.js:

        import React from 'react'
        import ReactDOM from 'react-dom'
        import Toast from './toast'
        import './toast.css'
        
        function createNotification() {
         const div = document.createElement('div')
         document.body.appendChild(div)
         const notification = ReactDOM.render(<Toast />, div)
         return {
         addNotice(notice) {
         return notification.addNotice(notice)
         },
         destroy() {
         ReactDOM.unmountComponentAtNode(div)
         document.body.removeChild(div)
         }
         }
        }
        
        let notification
        const notice = (type, content, duration = 2000, onClose) => {
         if (!notification) notification = createNotification()
         return notification.addNotice({ type, content, duration, onClose })
        }
        
        export default {
         info(content, duration, onClose) {
         return notice('info', content, duration, onClose)
         },
         success(content = '操作成功', duration, onClose) {
         return notice('success', content, duration, onClose)
         },
         error(content, duration , onClose) {
         return notice('error', content, duration, onClose)
         },
         loading(content = '加載中...', duration = 0, onClose) {
         return notice('loading', content, duration, onClose)
         }
        }

        toast.js:

        import React, { Component } from 'react'
        
        class ToastBox extends Component {
         constructor() {
         super()
         this.transitionTime = 300
         this.state = { notices: [] }
         this.removeNotice = this.removeNotice.bind(this)
         }
        
         getNoticeKey() {
         const { notices } = this.state
         return `notice-${new Date().getTime()}-${notices.length}`
         }
        
         addNotice(notice) {
         const { notices } = this.state
         notice.key = this.getNoticeKey()
        
         // notices.push(notice);//展示所有的提示
         notices[0] = notice;//僅展示最后一個提示
         
         this.setState({ notices })
         if (notice.duration > 0) {
         setTimeout(() => {
         this.removeNotice(notice.key)
         }, notice.duration)
         }
         return () => { this.removeNotice(notice.key) }
         }
        
         removeNotice(key) {
         const { notices } = this.state
         this.setState({
         notices: notices.filter((notice) => {
         if (notice.key === key) {
         if (notice.onClose) setTimeout(notice.onClose, this.transitionTime)
         return false
         }
         return true
         })
         })
         }
        
         render() {
         const { notices } = this.state
         const icons = {
         info: 'toast_info',
         success: 'toast_success',
         error: 'toast_error',
         loading: 'toast_loading'
         }
         return (
         <div className="toast">
         {
         notices.map(notice => (
         <div className="toast_bg" key={notice.key}>
         <div className='toast_box'>
         <div className={`toast_icon ${icons[notice.type]}`}></div>
         <div className='toast_text'>{notice.content}</div> 
         </div>
         </div>
         ))
         }
         </div>
         )
         }
        }
        
        export default ToastBox

        toast.css:

        .toast {
         position: fixed;
         left: 0;
         top: 0;
         z-index: 999;
         display: flex;
         flex-direction: column; }
         .toast_bg {
         position: fixed;
         width: 100%;
         height: 100%;
         left: 0;
         top: 0; }
         .toast_box {
         position: relative;
         left: 50%;
         top: 50%;
         width: 2.8rem;
         height: 2rem;
         margin: -1rem -1.4rem;
         background: rgba(0, 0, 0, 0.65);
         border-radius: .1rem;
         color: #fff; }
         .toast_text {
         position: absolute;
         bottom: 16%;
         text-align: center;
         width: 90%;
         margin: 0 5%;
         height: .28rem;
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap; }
         .toast_icon {
         position: relative;
         left: 50%;
         top: 15%;
         margin: -.4rem;
         width: .8rem;
         height: .8rem; }
         .toast_loading {
         -webkit-animation: loading 1s steps(12, end) infinite;
         animation: loading 1s steps(12, end) infinite;
         background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAM1BMVEUAAAD///////////////////////////////////////////////////////////////+3leKCAAAAEHRSTlMAENCA8KAgsGDgQMCQUDBwhylaLQAAAL1JREFUOMu9U0kSwyAMK9jsS/T/1zZt2pgEZzq9RBeMZYRGDI/70bO5JptjrOAQVTonIJVK5bW2ma9A7VvpK8OdeQfbZectrDnyU+Oo0b68wGK0muDPdxpOciaizq5pkAgiIPAoew2rBVNYZoM2YHbZDNKz/2Ogam3ff5gMEL8wisfh2KKZiFiGWFkk1B7NSbhNQFy4M2+PghbODNsg7y8THM2njiy8gBgcaEUA9GgNJbxh6fJv+NxiFvYmPAFtCQZNK1qZIAAAAABJRU5ErkJggg==") no-repeat;
         background-size: 100%; }
         .toast_success {
         background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAM1BMVEUAAAD///////////////////////////////////////////////////////////////+3leKCAAAAEHRSTlMA8DAQ0GBP4LCggMBwIJBAIttdjAAAAINJREFUOMvdkUsOwyAMBbH5hUCauf9pK1SlohF438x2LPn52f09+8vUfiNb/gighj8FouEjYCUoQDXiBSD7pdcMiK7XC9wCFmlDO3T20Scgx287ne13pwDU89NOJ3g3maCmJDANqIGRtLj8oi1ed1GMdmcB7wXIYX8QdQZJiM5Em3smbyVICDCOrCqSAAAAAElFTkSuQmCC") no-repeat;
         background-size: 100%; }
         .toast_error {
         background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAMFBMVEUAAAD///////////////////////////////////////////////////////////87TQQwAAAAD3RSTlMA0BDAMODwUKBgsCCAQJClzVPvAAAA0UlEQVQoz2MgErAclv9o44Dgc8b/B4KvBTA+t/3XdgeWivjPG6ACbl8ngNXlp0AN+L8IwtD6DzFm2w+Y3v5sMGW/ACbA9Rms9ZsCTIApH2QR608GhoUKQJ4xA8P8AKCAP5CwF2JgUPwIlPwCFDj/AMRRYJIHCnL8AZkJ1AfkAcUYGNhBpso7MICUgBQw8H4EEv/B5ssDFYA4mAKYWjANfd+Aai3CYZ9BDoM63RDkdEGQ0zE9h+l9zADCDEIGt2/wQEZEwwVepGhgYEdEFGZUEgYAW05XI3jSsVwAAAAASUVORK5CYII=") no-repeat;
         background-size: 100%; }
         .toast_info {
         background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAALVBMVEUAAAD///////////////////////////////////////////////////////+hSKubAAAADnRSTlMA4CCAwKBAMJBg8NAQUNhWlbcAAAC+SURBVCjPYyASsLfse+1cgOBzyr0DgocXYHwmv4dtCkwZck8UoAJZDydA1C2H8NnexUAYR99BjNF6CtMbtwhM+QUACUUhIMH6BKz14QEgafcYSPDIgSxifMkAE2CYJwAk6gQQAozPgURfA0KAA0T6JSAE2ECm7lNACDC9BhLvGGACIA6GAFyLohBEC9xQqLeeQKwFA4i1EIfBAeNzuNMVhSBOx/AcpvcxAwgzCDEDGTMaGHhhEYWIShN4VBIGAPvRT5YzufhUAAAAAElFTkSuQmCC") no-repeat;
         background-size: 100%; }
        
        @-webkit-keyframes loading {
         0% {
         -webkit-transform: rotate3d(0, 0, 1, 0deg);
         transform: rotate3d(0, 0, 1, 0deg); }
         100% {
         -webkit-transform: rotate3d(0, 0, 1, 360deg);
         transform: rotate3d(0, 0, 1, 360deg); } }
        
        @keyframes loading {
         0% {
         -webkit-transform: rotate3d(0, 0, 1, 0deg);
         transform: rotate3d(0, 0, 1, 0deg); }
         100% {
         -webkit-transform: rotate3d(0, 0, 1, 360deg);
         transform: rotate3d(0, 0, 1, 360deg); } }

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

        文檔

        React實現(xiàn)全局組件的Toast輕提示效果

        React實現(xiàn)全局組件的Toast輕提示效果:Toast是常用的輕提示彈框,常用于頁面loading和提示語彈窗。 本例基于React實現(xiàn)一個隨時可調(diào)用且不隨頁面渲染的全局組件。 需求分析 Toast 不需要同頁面一起被渲染,而是根據(jù)需要被隨時調(diào)用。 Toast 是一個輕量級的提示組件,它的提示不會打斷用戶操作,并
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲精品日韩专区silk | 真人无码作爱免费视频| 亚洲视频免费在线看| 国产亚洲成av人片在线观看| 搜日本一区二区三区免费高清视频| 免费观看的av毛片的网站| 亚洲AV无码无限在线观看不卡| 最近免费中文字幕视频高清在线看| 亚洲最大中文字幕| 在线观看视频免费完整版| 亚洲AV成人影视在线观看| 天天看片天天爽_免费播放| 亚洲一卡2卡三卡4卡无卡下载| 在线免费不卡视频| 蜜桃传媒一区二区亚洲AV| 免费大黄网站在线观| 少妇亚洲免费精品| 亚洲精品夜夜夜妓女网| 无码人妻丰满熟妇区免费| 亚洲黄色在线视频| 四虎永久在线精品免费网址 | 亚洲色精品88色婷婷七月丁香| 久香草视频在线观看免费| 中文字幕亚洲激情| 无码av免费网站| 亚洲免费视频观看| 又黄又大又爽免费视频| 中文字幕在线观看免费| 亚洲高清无在码在线电影不卡| 国语成本人片免费av无码| kk4kk免费视频毛片| 亚洲精品无码不卡| 天天看片天天爽_免费播放| 中文毛片无遮挡高清免费| 亚洲精品在线免费看| 国产jizzjizz免费看jizz| 两性色午夜免费视频| 麻豆狠色伊人亚洲综合网站| 日本中文一区二区三区亚洲| 久艹视频在线免费观看| 亚洲日韩精品国产3区|