constructor(list, defaultNodeKey = {}, defaultNodeValue = {}) {
    this.isUpdateRaw = true
    this.raw = list
    this.injectAction = createAction(this) // The core method is injected with interceptor functions, the insert RowNode is automatically converted to TreeNode
    this.root = new TreeNode(
      Date.now(),
      'root',
      [],
      defaultNodeValue,
      this.injectAction
    )
    this.defaultNodeKey = Object.assign(
      {
        id: 'id',
        label: 'label',
        childNodes: 'childNodes',
        isDisabled: 'isDisabled',
        isAsync: 'isAsync',
        isChecked: 'isChecked',
        isVisable: 'isVisable',
        isExpanded: 'isExpanded'
      },
      defaultNodeKey
    )
    this.defaultNodeValue = Object.assign({}, defaultNodeValue)
    // this.checked = []
    // this.expanded = []
    this.initRoot()
  }
@param {object[]} list
@param {object} defaultNodeKey The incoming Node proprtry name maps to the default name