鍍金池/ 問答/HTML/ element tree 多個樹形控件使用同一個數(shù)據(jù)時,添加插入children

element tree 多個樹形控件使用同一個數(shù)據(jù)時,添加插入children為什么不會同步?

我現(xiàn)在有兩個對話框,一個為上傳文件,一個是移動到,兩個對話框都有tree,并且共用同一個treeData數(shù)據(jù)和新建文件夾方法,對話框里面分別有新建文件夾的方法,會在所點擊的路徑內(nèi)添加children。

現(xiàn)在遇到的問題是,兩個對話框共用同一數(shù)據(jù),共用相同新建文件夾方法的情況下,新建文件夾永遠都只會添加到第一個對話框,第二個對話框新建也會提示成功,但是添加的數(shù)據(jù)還是會跑到第一個對話框中。

如果不共用同一數(shù)據(jù),只共用新建的方法時就不會出現(xiàn)第二個對話框新建文件夾時數(shù)據(jù)跑到第一個對話框的情況。

一直沒弄明白到底是怎么回事?還請大神幫忙看看是什么原因。謝謝了
圖片描述

圖片描述

圖片描述
圖片描述
圖片描述
圖片描述
補充內(nèi)容:
各位大佬們看這張圖應該就更好理解我說的意思了
圖片描述

回答
編輯回答
風清揚

大佬們,看得明白我的描述嗎?請問為什么會這樣子呢?很急,一直沒解決,幫幫忙,會的幫忙解答一下了,謝謝?。?/p>

2017年8月13日 01:52
編輯回答
近義詞
<template>
  <div>
    <h1>Tree One</h1>
    <el-tree
      key="tree-one"
      ref="treeOne"
      :data="data"
      :props="defaultProps"
      show-checkbox
      node-key="id"
      default-expand-all
      :expand-on-click-node="false"
      :render-content="renderContent">
    </el-tree>

    <h1>Tree Two</h1>
    <el-tree
      key="tree-two"
      ref="treeTwo"
      :data="data"
      :props="defaultProps"
      show-checkbox
      node-key="id"
      default-expand-all
      :expand-on-click-node="false"
      :render-content="renderContent">
    </el-tree>
  </div>
</template>

<script>
let id = 1000

export default {
  data () {
    return {
      data: [
        {
          id: 1,
          label: 'Level one 1',
          children: [
            {
              id: 4,
              label: 'Level two 1-1',
              children: [
                {
                  id: 9,
                  label: 'Level three 1-1-1'
                },
                {
                  id: 10,
                  label: 'Level three 1-1-2',
                  children: [
                    {
                      id: 11,
                      label: 'Level four 1-1-2-1'
                    },
                    {
                      id: 12,
                      label: 'Level four 1-1-2-2'
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          id: 2,
          label: 'Level one 2'
        }
      ],
      defaultProps: {
        children: 'children',
        label: 'label'
      }
    }
  },

  methods: {
    // 自己手動同步數(shù)據(jù),eval!!!!!
    /*
    append (data) {
      const newChild = { id: id++, label: 'testtest', children: [] }
      if (!data.children) {
        this.$set(data, 'children', [])
      }

      data.children.push(newChild)

      // eval hack, nextTick is required
      this.$nextTick(() => {
        this.$refs.treeTwo.store.setData(this.data)
      })
    },
    */
    
    // 替換整個data
    append (node, data, store) {
      const treeOne = this.$refs.treeOne
      const treeTwo = this.$refs.treeTwo
      console.log('tree', treeOne, treeTwo, treeOne === treeTwo) // trees are different

      const storeOne = treeOne.store
      const storeTwo = treeTwo.store
      console.log('store', storeOne, storeTwo, storeOne === storeTwo) // stores are different

      const nodeOne = storeOne.getNode(data.id)
      const nodeTwo = storeTwo.getNode(data.id)
      console.log('node', nodeOne, nodeTwo,
        nodeOne === nodeTwo,
        nodeOne === node,
        nodeTwo === node
      ) // nodes are different

      const dataOne = nodeOne.data
      const dataTwo = nodeTwo.data
      console.log('data', dataOne, dataTwo,
        dataOne === dataTwo,
        dataOne === data,
        dataTwo === data
      ) // all true!!!

      // just replace all the data of two tree
      const newChild = { id: id++, label: 'testtest', children: [] }

      const traverse = node => {
        return {
          id: node.id,
          label: node.label,
          children: (node.children ? node.children.map(traverse) : []).concat(node.id === data.id ? [newChild] : [])
        }
      }

      const traversed = this.data.map(traverse)

      this.data = traversed
    },


    remove (node, data) {
      const parent = node.parent
      const children = parent.data.children || parent.data
      const index = children.findIndex(d => d.id === data.id)
      children.splice(index, 1)
    },

    renderContent (h, { node, data, store }) {
      return (
        <span style="flex: 1; display: flex; align-items: center; justify-content: space-between; font-size: 14px; padding-right: 8px;">
          <span>
            <span>{node.label}</span>
          </span>
          <span>
            <el-button
              style="font-size: 12px;"
              type="text"
              on-click={() => this.append(data)}
            >
              Append
            </el-button>
            <el-button
              style="font-size: 12px;"
              type="text"
              on-click={() => this.remove(node, data)}
            >
              Delete
            </el-button>
          </span>
        </span>
      )
    }
  }
}
</script>

<style lang="scss" scoped>

</style>
2017年1月15日 14:09