欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

可以增加子節(jié)點

可以刪除子節(jié)點

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

可以取消編輯信息

具體的效果圖如下:

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

正文

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

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

通過數(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é)點沒有刪除按鈕
    </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這個數(shù)組中的數(shù)據(jù),然后使用this.setState({ data: this.data })更新界面,具體的看下代碼就成,很簡單。

最后優(yōu)化這個組件的時候,遇到一個比較坑的。本來想是當在某節(jié)點上增加子節(jié)點時,父節(jié)點自動展開,代碼邏輯上沒有問題,但是必須手動執(zhí)行過一次展開或者搜索的操作,所寫的邏輯才能生效。

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

componentDidMount() {
  this.onExpand([]); // 手動觸發(fā),否則會遇到第一次添加子節(jié)點不展開的Bug
 }

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

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

應用場景描述:

Select 被form 所包裹,且被getFieldDecorator修飾。所以值的改變應該通過form的setFieldsValue方法。

Select模式肯定會是multiple。且以最多三個值舉例。

解決思路如下:

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

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

2 最后通過重新查看文檔。發(fā)現(xiàn)還有一個方法可用,即 validator。驗證值,通過驗證所選值的數(shù)量是否大于三個,然后重新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('最多選擇三種語言')
  } else {
    newArr = value ;
    callback()
  }
}
 
<FormItem>
{getFieldDecorator('languages', {
rules:[{required: true,message : '請選擇三種語言',
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的實現(xiàn)操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue中v-model的應用及使用詳解

    vue中v-model的應用及使用詳解

    v-model用于表單數(shù)據(jù)的雙向綁定,其實它就是一個語法糖。這篇文章主要介紹了vue中v-model的應用,需要的朋友可以參考下
    2018-06-06
  • Vue中Table組件行內(nèi)右鍵菜單實現(xiàn)方法(基于 vue + AntDesign)

    Vue中Table組件行內(nèi)右鍵菜單實現(xiàn)方法(基于 vue + AntDesign)

    這篇文章主要介紹了Vue中Table組件行內(nèi)右鍵菜單實現(xiàn)方法,該項目是基于 vue + AntDesign的,具體實例代碼給大家介紹的非常詳細 ,需要的朋友可以參考下
    2019-11-11
  • Vuex 命名空間 namespaced的使用

    Vuex 命名空間 namespaced的使用

    本文主要介紹了Vuex 命名空間 namespaced的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • vue+echarts實現(xiàn)多條折線圖

    vue+echarts實現(xiàn)多條折線圖

    這篇文章主要為大家詳細介紹了vue+echarts實現(xiàn)多條折線圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • vue項目純前端實現(xiàn)的模板打印功能示例代碼

    vue項目純前端實現(xiàn)的模板打印功能示例代碼

    在Vue項目中,通過使用vue-print-nb插件,可以實現(xiàn)頁面的打印功能,這篇文章主要介紹了vue項目純前端實現(xiàn)的模板打印功能的相關(guān)資料,需要的朋友可以參考下
    2024-10-10
  • vue使用pdf-dist實現(xiàn)pdf預覽以及水印添加

    vue使用pdf-dist實現(xiàn)pdf預覽以及水印添加

    這篇文章主要為大家詳細介紹了vue如何使用pdf-dist實現(xiàn)pdf預覽以及水印添加的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-10-10
  • vue實現(xiàn)打包添加二級目錄

    vue實現(xiàn)打包添加二級目錄

    這篇文章主要介紹了vue實現(xiàn)打包添加二級目錄方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Vue?elementUI表單嵌套表格并對每行進行校驗詳解

    Vue?elementUI表單嵌套表格并對每行進行校驗詳解

    element-ui中有詳細的各種表格及表格方法,下面這篇文章主要給大家介紹了關(guān)于Vue?elementUI表單嵌套表格并對每行進行校驗的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • Vue動態(tài)加載圖片在跨域時無法顯示的問題及解決方法

    Vue動態(tài)加載圖片在跨域時無法顯示的問題及解決方法

    這篇文章主要介紹了解決VUE動態(tài)加載圖片在跨域時無法顯示的問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • 關(guān)于Vue中的watch監(jiān)視屬性

    關(guān)于Vue中的watch監(jiān)視屬性

    這篇文章主要介紹了關(guān)于Vue中的watch監(jiān)視屬性,Vue中的watch默認不監(jiān)視對象內(nèi)部值的改變,當被監(jiān)視的屬性變化時,回調(diào)函數(shù)自動調(diào)用,進行相關(guān)操作,需要的朋友可以參考下
    2023-04-04

最新評論