亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

管理系統(tǒng)內(nèi) Tag 功能的實現(xiàn)

Tikitoo / 3500人閱讀

摘要:愈發(fā)純熟的業(yè)務(wù)代碼開始做菜原文地址背景需求分析背景某日,被后臺拿著一個別人實現(xiàn)好的管理系統(tǒng)說道了一頓,說需要實現(xiàn)得比某框架更好地址需求分析需求管理系統(tǒng)內(nèi)實現(xiàn)瀏覽器標簽的功能分析切換不主動更新頁面重點關(guān)閉活動中的切換至后一個若關(guān)閉為最后一個,

愈發(fā)純熟的業(yè)務(wù)代碼——開始做菜

原文地址

1.背景 && 需求分析 1.1 背景

某日,被后臺拿著一個別人實現(xiàn)好的管理系統(tǒng)說道了一頓,說需要實現(xiàn)得比某框架更好

地址:pig4cloud

1.2 需求分析

需求:管理系統(tǒng)內(nèi)實現(xiàn)瀏覽器 Tag 標簽的功能

分析:

切換 Tag 不主動更新頁面(重點)

關(guān)閉活動中的 Tag 切換至后一個

若關(guān)閉 Tag 為最后一個,切換至前一個

2. 實現(xiàn)邏輯

技術(shù)棧:react + react-router + react-redux + react-saga

重點:組件更新,頁面不變

上 demo :

2.1 內(nèi)存邏輯

思路:卻分活動狀態(tài)內(nèi)的存,和在打開過的內(nèi)存,兩個內(nèi)存同事更新,切換 Tag 從打開過的數(shù)組內(nèi)調(diào)取數(shù)據(jù),有數(shù)據(jù)使用該數(shù)據(jù),無數(shù)據(jù)則發(fā)起請求

tagList 側(cè)欄點擊過的 Tag 數(shù)組

activeTag 活動狀態(tài)的 Tag

操作同歸在 Reduce 內(nèi),方便后續(xù) Tag 內(nèi)外部交互

/*.
目錄:/src/store/index.js
*/
const appReducer ={
  tabListStatus: (state = { tabList: [], activeTab: null }, action) => {
    switch (action.type) {
      case "tabListChange":
          //
      case "tabListAdd":
          //
      case "tabListRemove":
          //
      case "tabListClear":
          //
      default:
        return state
    }
  },
  // ...
}

所有內(nèi)存初始狀態(tài),都在 App.js->componentDidUpdate 生命周期內(nèi)存操作

/*
目錄:/src/App.js
 */

componentDidUpdate(prevProps, prevState) {
  if (this.props.tabListStatus !== prevProps.tabListStatus) {
    const { tabList, activeTab } = this.props.tabListStatus
    sessionStorage.setItem("tabList", JSON.stringify(tabList))
    sessionStorage.setItem("activeTab", JSON.stringify(activeTab))
    this.setState({
      tabList,
      activeTab: activeTab !== null ? activeTab.key : "/"
    })
  }
}
2.2 外部交互邏輯

側(cè)欄邏輯,新增

點擊邏輯,切換 Tag

關(guān)閉 Tag

class App extends Component {
  // 點擊側(cè)欄
  handleOnMenuItem = param => {
    const { tabListAdd, tabListStatus } = this.props
    const { tabList } = tabListStatus
    const userMenu = menuDataSource
    const menu = this.menuItemFilter(userMenu, `/nav_${param.key}`)

    let paramTab = {
      title: menu.name,
      key: menu.path,
      queryParam: {},
      dataSource: {}
    }

    //判斷是否為新增
    let pushBol = true
    tabList.map(tab => {
      if (tab.key === paramTab.key) {
        pushBol = false
        paramTab = Object.assign({},paramTab,tab)
      }
      return tab
    })

    if (pushBol) {
      tabList.push(paramTab)
    }

    tabListAdd({
      tabList,
      activeTab: paramTab
    })

    this.toPath(`nav_${param.key}`)
  }
  // 點擊 Tag
  onChange = activeKey => {
    // console.log("....", activeKey)
    const { tabListStatus, tabListAdd } = this.props
    const { tabList } = tabListStatus
    const userMenu = tabList
    const menu = this.menuChangeFilter(userMenu, activeKey)

    const paramTab = {
      ...menu
    }

    tabListAdd({
      tabList,
      activeTab: paramTab
    })

    this.toPath(activeKey)
  }
  // 關(guān)閉邏輯
  remove = targetKey => {
    let activeKey = this.state.activeTab
    let panes = this.state.tabList
    let lastIndex
    panes.forEach((pane, i) => {
      if (pane.key === targetKey) {
        lastIndex = panes.length - 1 === i ? i - 1 : i
      }
    })
    const panesFilter = panes.filter(pane => pane.key !== targetKey)

    if (panesFilter.length && activeKey === targetKey) {
      if (lastIndex >= 0) {
        activeKey = panesFilter[lastIndex]
      } else {
        activeKey = panesFilter[0]
      }
    } else {
      activeKey = null
    }

    this.props.tabListAdd({
      tabList: panesFilter,
      activeTab: activeKey
    })

    this.toPath(activeKey !== null ? activeKey.key : "/")
  }

  // ...
}
2.3 內(nèi)部交互邏輯

判斷是否新增

操作更新 onChange, onClear, onSubmit

使用標記符號,或者直接判斷一個 key 值是否存在值,來發(fā)送請求,demo 內(nèi)使用 dataSource 是否存在為空來判斷是否需要發(fā)送請求

componentDidMount() {
  const { tabListStatus, musicList_query_param, musicList } = this.props
  const { dataSource } = tabListStatus.activeTab

  if (!Object.keys(dataSource).length) {
    musicList(musicList_query_param)
  }
}

操作更新 onChange, onClear, onSubmit 除了這一些以外還會存在不同的操作,demo 大致分了這幾個操作,均使用 reducer 操作,App.js 內(nèi)監(jiān)聽操作,更改內(nèi)存,模塊內(nèi)不參與內(nèi)存更改

onChange = (tabList, e) => {
  e.persist()
  if (!e || !e.target) {
    return
  }
  const { target } = e
  const operateParam = operateQuery(tabList, {
    [target.id]: target.type === "checkbox" ? target.checked : target.value
  })

  this.props.tabListChange(operateParam)
}
3. 對比 3.1 Vue 的實現(xiàn)

技術(shù)棧:vue + vue-router + vuex

UI 框架:ant-design

關(guān)鍵:keep-alive

3.2 React 的實現(xiàn)

技術(shù)棧:react + react-router + redux

UI 框架:ant-design

關(guān)鍵:redux 與內(nèi)存處理

4. 總結(jié)

實現(xiàn)上面肯定是 Vue 更快實現(xiàn)的,但對使用 React 內(nèi)存的控制也是一件非常好玩的事情,如果項目大了,就更好玩了

實際上這種實現(xiàn)有點雞肋,因為用戶一個不留意,關(guān)了頁面,這些 Tag 就不存在了,無論是那種管理系統(tǒng),這個實現(xiàn)如果配合到后臺,可能就更好玩了

感謝 @白白,感謝 @同事,都提供了很不錯的思路

感謝閱讀,代碼很爛,請輕噴

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/106544.html

相關(guān)文章

  • FastD 最佳實踐四: 構(gòu)建系統(tǒng)可視化監(jiān)控

    摘要:的展示非常炫酷,絕對是運維提升逼格的一大利器。另外的可視化功能比強得多,而且以上版本將集成報警功能。它由寫成,著力于高性能地查詢與存儲時序型數(shù)據(jù)。被廣泛應(yīng)用于存儲系統(tǒng)的監(jiān)控數(shù)據(jù),行業(yè)的實時數(shù)據(jù)等場景。 原有監(jiān)控系統(tǒng) showImg(https://segmentfault.com/img/remote/1460000011082384); 整個系統(tǒng)以 Graphite (carbon ...

    khlbat 評論0 收藏0
  • 數(shù)據(jù)聚合 & 分組:新一代系統(tǒng)監(jiān)控核心功能

    摘要:而今,我們就已經(jīng)實現(xiàn)了這樣的功能使用標簽來實現(xiàn)數(shù)據(jù)的聚合和分組。數(shù)據(jù)聚合和分組在中,我們實現(xiàn)了數(shù)據(jù)的聚合和分組。指所需聚合的的查詢條件。所以,與會聚合為一條曲線,而和的關(guān)系是分組的關(guān)系。 遙想 2015 年 8 月 17 日,Cloud Insight 還在梳理功能原型,暢想 Cloud Insight 存在的意義:為什么阿里云用戶需要使用 Cloud Insight 來加強管理。 而...

    lijinke666 評論0 收藏0
  • 開源一個監(jiān)控數(shù)據(jù)采集Agent:OpenFalcon-SuitAgent

    摘要:目前此系統(tǒng)僅支持類系統(tǒng)下使用,不支持系統(tǒng)什么是這是一個獲取各種系統(tǒng)的監(jiān)控數(shù)據(jù)的。監(jiān)控數(shù)據(jù)上報公有的跟官方社區(qū)的思想一致采集的系統(tǒng)監(jiān)控信息如內(nèi)存等等一百多種沒有任何信息其他的業(yè)務(wù)系統(tǒng)的監(jiān)控都會打上。 OpenFalcon-SuitAgent 項目地址:github 版本說明 本系統(tǒng)版本劃分如下 alpha:內(nèi)部測試版(不建議使用于生產(chǎn)環(huán)境) beta:公開測試版(不建議使用于生產(chǎn)環(huán)境)...

    linkin 評論0 收藏0
  • 開源一個監(jiān)控數(shù)據(jù)采集Agent:OpenFalcon-SuitAgent

    摘要:目前此系統(tǒng)僅支持類系統(tǒng)下使用,不支持系統(tǒng)什么是這是一個獲取各種系統(tǒng)的監(jiān)控數(shù)據(jù)的。監(jiān)控數(shù)據(jù)上報公有的跟官方社區(qū)的思想一致采集的系統(tǒng)監(jiān)控信息如內(nèi)存等等一百多種沒有任何信息其他的業(yè)務(wù)系統(tǒng)的監(jiān)控都會打上。 OpenFalcon-SuitAgent 項目地址:github 版本說明 本系統(tǒng)版本劃分如下 alpha:內(nèi)部測試版(不建議使用于生產(chǎn)環(huán)境) beta:公開測試版(不建議使用于生產(chǎn)環(huán)境)...

    王晗 評論0 收藏0

發(fā)表評論

0條評論

Tikitoo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<