最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Ant Design的可編輯Tree的實(shí)現(xiàn)操作

 更新時(shí)間:2020年10月31日 09:40:03   作者:JerryMissToml  
這篇文章主要介紹了Ant Design的可編輯Tree的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

前言

最近在用Ant Design寫(xiě)一個(gè)后臺(tái),遇到的需求就是實(shí)現(xiàn)一個(gè)可動(dòng)態(tài)增減和編輯子節(jié)點(diǎn)的Tree。GitHub上看了一圈,沒(méi)好用和合適的。索性就基于Ant Design中的Tree組件寫(xiě)一個(gè)。

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

可以增加子節(jié)點(diǎn)

可以刪除子節(jié)點(diǎn)

可以編輯子節(jié)點(diǎn)信息

可以取消編輯信息

具體的效果圖如下:

主要的就是借助 TreeNode 的 title 屬性,它的類型是string|ReactNode。

正文

經(jīng)過(guò)分析,一個(gè)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)應(yīng)該是

{
  value: 'Root', // 顯示的信息
  defaultValue: 'Root', // 當(dāng)某一節(jié)點(diǎn)進(jìn)入編輯狀態(tài),然后點(diǎn)擊close按鈕,節(jié)點(diǎn)的信息應(yīng)該恢復(fù)原始狀態(tài),
  key: '0-1', // 節(jié)點(diǎn)的Key,全局唯一
  parentKey: '0', // 父節(jié)點(diǎn)的Key
  isEditable: false // 是否處于可編輯狀態(tài)
  children:[] // 子節(jié)點(diǎn)
}

通過(guò)數(shù)據(jù)結(jié)構(gòu)組裝TreeNode的代碼如下:

data= [
   {
    value: 'Root',
    defaultValue: 'Root',
    key: '0-1',
    parentKey: '0',
    isEditable: false
   }
  ];
  
  state={
    data: this.data
  }
 
renderTreeNodes = data => data.map((item) => {
  if (item.isEditable) { // 編輯狀態(tài)下
   item.title = (
    <div>
     <input value={item.value}
      onChange={(e) => this.onChange(e, item.key)}/>
     <Icon type='close' style={{marginLeft:10}} onClick={() => this.onClose(item.key, item.defaultValue)}/>
     <Icon type='check' style={{marginLeft:10}} onClick={() => this.onSave(item.key)}/>
    </div>
   );
  } else {
   item.title = (
    <div>
     <span>
      {item.value}
     </span>
     <Icon style={{ marginLeft: 10 }} type='edit' onClick={() => this.onEdit(item.key)} />
     <Icon style={{ marginLeft: 10 }} type='plus' onClick={() => this.onAdd(item.key)} />
     {item.parentKey === '0' ? null : (<Icon style={{ marginLeft: 10 }} type='minus' onClick={() => this.onDelete(item.key)} />)} // 根節(jié)點(diǎn)沒(méi)有刪除按鈕
    </div>
   )
  }
 
  if (item.children) {
   return (
    <TreeNode title={item.title} key={item.key} dataRef={item}>
     {this.renderTreeNodes(item.children)}
    </TreeNode>
   );
  }
 
  return <TreeNode {...item}/>;
 })
 
 ...
 // 渲染界面
 render() {
  return (
   <div>
    <Tree>
     {this.renderTreeNodes(this.state.data)}
    </Tree>
   </div>
  )
 }

之后所有的增刪修改等都是先修改data這個(gè)數(shù)組中的數(shù)據(jù),然后使用this.setState({ data: this.data })更新界面,具體的看下代碼就成,很簡(jiǎn)單。

最后優(yōu)化這個(gè)組件的時(shí)候,遇到一個(gè)比較坑的。本來(lái)想是當(dāng)在某節(jié)點(diǎn)上增加子節(jié)點(diǎn)時(shí),父節(jié)點(diǎn)自動(dòng)展開(kāi),代碼邏輯上沒(méi)有問(wèn)題,但是必須手動(dòng)執(zhí)行過(guò)一次展開(kāi)或者搜索的操作,所寫(xiě)的邏輯才能生效。

后來(lái)沒(méi)辦法,只能在生命周期函數(shù)中DOM加載完畢后主動(dòng)觸發(fā)下:

componentDidMount() {
  this.onExpand([]); // 手動(dòng)觸發(fā),否則會(huì)遇到第一次添加子節(jié)點(diǎn)不展開(kāi)的Bug
 }

代碼放在GitHub上了,地址是 react-editable-tree,歡迎有同樣需要的小伙伴參考,star和fork 也是極好的。

補(bǔ)充知識(shí):關(guān)于antd Select 限制選擇個(gè)數(shù)的解決方案

應(yīng)用場(chǎng)景描述:

Select 被form 所包裹,且被getFieldDecorator修飾。所以值的改變應(yīng)該通過(guò)form的setFieldsValue方法。

Select模式肯定會(huì)是multiple。且以最多三個(gè)值舉例。

解決思路如下:

1 起初是想在Select的onchange事件中判斷values的數(shù)量,數(shù)量大于三個(gè)的時(shí)候來(lái)重新setFieldsValue;且把最后的選項(xiàng)值替換成剛剛選擇的值。

后來(lái)發(fā)現(xiàn)setFieldsValue方法不起作用,Select的值會(huì)一直增加。后來(lái)想想可能是 setFieldsValue與onchange 沖突,通過(guò)setFieldsValue 無(wú)法改變onchange后的值。

2 最后通過(guò)重新查看文檔。發(fā)現(xiàn)還有一個(gè)方法可用,即 validator。驗(yàn)證值,通過(guò)驗(yàn)證所選值的數(shù)量是否大于三個(gè),然后重新setFieldsValue ;發(fā)現(xiàn)此法可行。從而解決該疑難雜癥。

好,最后附上代碼供參考:

changeValues = (rule ,value , callback)=> {
  const { setFieldsValue } = this.props.form ;
  let newArr ;
  if (value.length > 3){
    newArr = [].concat(value.slice(0,2), value.slice(-1) ) ;
    setFieldsValue({
    "languages" : newArr ,
    })
    callback('最多選擇三種語(yǔ)言')
  } else {
    newArr = value ;
    callback()
  }
}
 
<FormItem>
{getFieldDecorator('languages', {
rules:[{required: true,message : '請(qǐng)選擇三種語(yǔ)言',
validator : changeValues
}],
validateTrigger : 'onChange',
})(
<Select mode='multiple' >
 
  <Option key={1} value={1}>1</Option>
  <Option key={2} value={2}>2</Option>
   <Option key={3} value={3}>3</Option>
  <Option key={4} value={4}>4</Option>
  <Option key={5} value={5}>5</Option>
</Select>
)}
</FormItem>

以上這篇Ant Design的可編輯Tree的實(shí)現(xiàn)操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue-router重寫(xiě)push方法,解決相同路徑跳轉(zhuǎn)報(bào)錯(cuò)問(wèn)題

    vue-router重寫(xiě)push方法,解決相同路徑跳轉(zhuǎn)報(bào)錯(cuò)問(wèn)題

    這篇文章主要介紹了vue-router重寫(xiě)push方法,解決相同路徑跳轉(zhuǎn)報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Vue分頁(yè)查詢?cè)趺磳?shí)現(xiàn)

    Vue分頁(yè)查詢?cè)趺磳?shí)現(xiàn)

    這篇文章主要介紹了Vue分頁(yè)查詢?cè)趺磳?shí)現(xiàn),使用vue實(shí)現(xiàn)分頁(yè)的邏輯并不復(fù)雜,接收后端傳輸過(guò)來(lái)的數(shù)據(jù),然后根據(jù)數(shù)據(jù)的總數(shù)和每一頁(yè)的數(shù)據(jù)量就可以計(jì)算出一共可以分成幾頁(yè)
    2023-04-04
  • vue proxy 的優(yōu)勢(shì)與使用場(chǎng)景實(shí)現(xiàn)

    vue proxy 的優(yōu)勢(shì)與使用場(chǎng)景實(shí)現(xiàn)

    這篇文章主要介紹了vue proxy 的優(yōu)勢(shì)與使用場(chǎng)景實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 談?wù)刅ue.js——vue-resource全攻略

    談?wù)刅ue.js——vue-resource全攻略

    本篇文章主要介紹了談?wù)刅ue.js——vue-resource全攻略,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • vue實(shí)現(xiàn)At人文本輸入框示例詳解

    vue實(shí)現(xiàn)At人文本輸入框示例詳解

    這篇文章主要為大家介紹了vue實(shí)現(xiàn)At人文本輸入框示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 解決Antd中Form表單的onChange事件中執(zhí)行setFieldsValue不生效

    解決Antd中Form表單的onChange事件中執(zhí)行setFieldsValue不生效

    這篇文章主要介紹了解決Antd中Form表單的onChange事件中執(zhí)行setFieldsValue不生效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Vue前端項(xiàng)目部署IIS的實(shí)現(xiàn)

    Vue前端項(xiàng)目部署IIS的實(shí)現(xiàn)

    這篇文章主要介紹了Vue前端項(xiàng)目部署IIS的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • vue跳轉(zhuǎn)同一路由報(bào)錯(cuò)的問(wèn)題及解決

    vue跳轉(zhuǎn)同一路由報(bào)錯(cuò)的問(wèn)題及解決

    這篇文章主要介紹了vue跳轉(zhuǎn)同一路由報(bào)錯(cuò)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue3?自定義指令控制按鈕權(quán)限的操作代碼

    vue3?自定義指令控制按鈕權(quán)限的操作代碼

    這篇文章主要介紹了vue3?自定義指令控制按鈕權(quán)限,為了提高用戶體驗(yàn),當(dāng)該按鈕無(wú)權(quán)使用時(shí),使用el-tooltip功能進(jìn)行提醒,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • vue3插件json2ts的具體使用

    vue3插件json2ts的具體使用

    本文主要介紹了vue3插件json2ts的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評(píng)論

宁晋县| 惠州市| 灵丘县| 建阳市| 九寨沟县| 遂川县| 沾益县| 柳州市| 察哈| 县级市| 涞源县| 虞城县| 凌云县| 剑阁县| 海宁市| 阳谷县| 杭州市| 淮北市| 措美县| 莱西市| 收藏| 石河子市| 渑池县| 白城市| 抚州市| 怀来县| 简阳市| 东辽县| 濮阳市| 城口县| 金堂县| 呼图壁县| 长白| 河北省| 拉萨市| 九龙县| 揭东县| 疏附县| 同德县| 织金县| 昭觉县|