使用antD遇到的坑(一)

Layout使用中的一些坑

Demo:

import React, { Component } from 'react';
import { hashHistory, Link } from 'react-router';
import { Layout, Menu, Icon } from 'antd';
import 'antd/dist/antd.css';

const { Header, Sider, Content } = Layout;
const rootSubmenuKeys = ['sub1', 'sub2', 'sub3'];

class SiderDemo extends Component {
  constructor(props) {
    super(props);
    this.state = {
      collapsed: false,//當前Sider收起狀態(tài)
      openKeys: [''],//當前展開的 SubMenu 菜單項 key 數(shù)組
      selectedKeys: [''],//當前選中的菜單項 key 數(shù)組
    };
  }

  /**
   * 
   * @param {*} e 被選中時調(diào)用
   */
  selectMenu = e => {
    this.setState({selectedKeys: e.selectedKeys});
  }

  /**
   * 
   * @param {*} openKeys SubMenu 展開/關(guān)閉的回調(diào)
   */
  openSubMenu = openKeys => {
    const { collapsed} = this.state;
    if (collapsed) {
      return false;//因收縮Sider后hover SubMenu還會觸發(fā)該事件昆汹,因此在此判斷當前Sider的收縮狀態(tài)來return false;
    }
    const latestOpenKey = openKeys.find(key => this.state.openKeys.indexOf(key) === -1);
    if (rootSubmenuKeys.indexOf(latestOpenKey) === -1) {
      this.setState({openKeys});
    } else {
      this.setState({
        openKeys: latestOpenKey ? [latestOpenKey] : [],
      });
    }
  }

  /**
   * 
   * Sider收縮控制
   */
  toggle = () => {
    this.setState({
      collapsed: !this.state.collapsed,
    });
  }

  render() {
    const { openKeys, selectedKeys, collapsed } = this.state;
    let defaultProps = collapsed ? {} : { openKeys };//當你展開菜單項,Sider收縮后會顯示二級菜單項(PS:收縮Sider后hover SubMenu時會顯示該級下的二級菜單满粗,此處是因為openKeys有值,因此會自動顯示二級菜單,體驗不太好)准脂,因此此處用來控制Menu組件的openKeys
    return (
      <Layout>
        <Sider
          trigger={null}
          collapsible
          collapsed={collapsed}
        >
          <div className="logo" />
          <Menu theme="dark" mode="inline" {...defaultProps} style={{width: 200}}/* 加上固定width,縮放Sider的時候可以防抖,明顯不卡了沟饥! */ onSelect={(e)=> this.selectMenu(e)} onOpenChange={this.openSubMenu} selectedKeys={selectedKeys}>
            <SubMenu key="sub1" title={<span><Icon type="mail" /><span>Navigation One</span></span>}>
                <Menu.Item key="1">Option 1</Menu.Item>
                <Menu.Item key="2">Option 2</Menu.Item>
                <Menu.Item key="3">Option 3</Menu.Item>
                <Menu.Item key="4">Option 4</Menu.Item>
           </SubMenu>
           <SubMenu key="sub2" title={<span><Icon type="appstore" /><span>Navigation Two</span></span>}>
              <Menu.Item key="5">Option 5</Menu.Item>
              <Menu.Item key="6">Option 6</Menu.Item>
           </SubMenu>
           <SubMenu key="sub3" title={<span><Icon type="setting" /><span>Navigation Three</span></span>}>
              <Menu.Item key="9">Option 9</Menu.Item>
              <Menu.Item key="10">Option 10</Menu.Item>
              <Menu.Item key="11">Option 11</Menu.Item>
              <Menu.Item key="12">Option 12</Menu.Item>
           </SubMenu>
          </Menu>
        </Sider>
        <Layout>
          <Header style={{ background: '#fff', padding: 0 }}>
            <Icon
              className="trigger"
              type={this.state.collapsed ? 'menu-unfold' : 'menu-fold'}
              onClick={this.toggle}
            />
          </Header>
          <Content style={{
            margin: '24px 16px', padding: 24, background: '#fff', minHeight: 280,
          }}
          >
            Content
          </Content>
        </Layout>
      </Layout>
    );
  }
}

ReactDOM.render(<SiderDemo />, mountNode);

因為我們?yōu)榱丝s放Sider時防抖贤旷,給其設(shè)置了固定width,因此現(xiàn)在收縮后幼驶,去hover SubMenu會發(fā)現(xiàn)二級菜單的定位會有偏差,這里給其設(shè)置固定的left值就好了(ps:根據(jù)Sider收縮的寬度去設(shè)置就好了)购桑, css如下:

.ant-menu-dark.ant-menu-submenu-popup {
  left: 84px!important;
}
#components-layout-demo-responsive .logo {
  height: 32px;
  background: rgba(255,255,255,.2);
  margin: 16px;
}

在使用過程中發(fā)現(xiàn)Menu收縮時(前提是已經(jīng)展開了二級菜單)氏淑,二級菜單會自動展開勃蜘,這是由于設(shè)置了openkeys的原因假残,可以通過判斷菜單在收起狀態(tài)時,給Menu不設(shè)置openKeys值阳惹,這樣就變?yōu)椴皇芸亟M件耗帕,交給antd處理。

解決方案:判斷菜單是否處于收縮狀態(tài)設(shè)置openkeys

這個問題解決后發(fā)現(xiàn)仿便,hover這些收縮后的一級菜單Icon時,會觸發(fā)onOpenChange嗽仪,導(dǎo)致openKeys改變,導(dǎo)致當前展開的 SubMenu 菜單項改變沽翔。

解決方案:函數(shù)內(nèi)判斷收縮狀態(tài)窿凤,若收縮了則直接return false

/**
 * 
 * @param {*} openKeys SubMenu 展開/關(guān)閉的回調(diào)
 */
openSubMenu = openKeys => {
  const { collapsed} = this.state;
  if (collapsed) {
    return false;//因收縮Sider后hover SubMenu還會觸發(fā)該事件,因此在此判斷當前Sider的收縮狀態(tài)來return false;
  }
  const latestOpenKey = openKeys.find(key => this.state.openKeys.indexOf(key) === -1);
  if (rootSubmenuKeys.indexOf(latestOpenKey) === -1) {
    this.setState({openKeys});
  } else {
    this.setState({
      openKeys: latestOpenKey ? [latestOpenKey] : [],
    });
  }
}

const { openKeys } = this.state;
let defaultProps = collapsed ? {} : { openKeys };

 <Menu theme="dark" mode="inline" {...defaultProps} style={{width: 200}}/* 加上固定width,縮放Sider的時候可以防抖雳殊,明顯不卡了! */ onSelect={(e)=> this.selectMenu(e)} onOpenChange={this.openSubMenu} selectedKeys={selectedKeys}>
  <SubMenu key="sub1" title={<span><Icon type="mail" /><span>Navigation One</span></span>}>
    <Menu.Item key="1">Option 1</Menu.Item>
    <Menu.Item key="2">Option 2</Menu.Item>
    <Menu.Item key="3">Option 3</Menu.Item>
    <Menu.Item key="4">Option 4</Menu.Item>
  </SubMenu>
  <SubMenu key="sub2" title={<span><Icon type="appstore" /><span>Navigation Two</span></span>}>
    <Menu.Item key="5">Option 5</Menu.Item>
    <Menu.Item key="6">Option 6</Menu.Item>
  </SubMenu>
  <SubMenu key="sub3" title={<span><Icon type="setting" /><span>Navigation Three</span></span>}>
    <Menu.Item key="9">Option 9</Menu.Item>
    <Menu.Item key="10">Option 10</Menu.Item>
    <Menu.Item key="11">Option 11</Menu.Item>
    <Menu.Item key="12">Option 12</Menu.Item>
  </SubMenu>
 </Menu>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痢艺,一起剝皮案震驚了整個濱河市介陶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哺呜,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件友驮,死亡現(xiàn)場離奇詭異,居然都是意外死亡卸留,警方通過查閱死者的電腦和手機椭豫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喳整,“玉大人,你說我怎么就攤上這事框都『浅浚” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵摸屠,是天一觀的道長。 經(jīng)常有香客問我檩咱,道長,這世上最難降的妖魔是什么刻蚯? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任桑嘶,我火速辦了婚禮,結(jié)果婚禮上不翩,老公的妹妹穿的比我還像新娘。我一直安慰自己器钟,他們只是感情好妙蔗,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眉反,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寸五。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天梳杏,我揣著相機與錄音,去河邊找鬼十性。 笑死,一個胖子當著我的面吹牛楷掉,可吹牛的內(nèi)容都是我干的霞势。 我是一名探鬼主播烹植,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼刊橘,長吁一口氣:“原來是場噩夢啊……” “哼颂鸿!你這毒婦竟也來了促绵?” 一聲冷哼從身側(cè)響起嘴纺,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尖坤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慢味,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡倔约,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年上鞠,在試婚紗的時候發(fā)現(xiàn)自己被綠了顶岸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叫编。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搓逾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恃逻,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布凸郑,位于F島的核電站矛市,受9級特大地震影響芙沥,放射性物質(zhì)發(fā)生泄漏浊吏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一歌憨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧务嫡,春花似錦漆改、人聲如沸心铃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愉棱。三九已至唆铐,卻和暖如春奔滑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背档押。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工祈纯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粒没。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓簇爆,卻偏偏與公主長得像癞松,于是被迫代替她去往敵國和親入蛆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361