如何使用 Vue.js 将多层级 JSON 格式数据渲染为树形结构

阅读时长 11 分钟读完

在前端开发中,经常会遇到需要将多层级 JSON 数据渲染为树形结构的需求。本文将介绍如何使用 Vue.js 实现这个功能,包括数据格式化、组件设计和数据渲染等方面的内容。

数据格式化

首先,我们需要将从服务器端获取的原始数据进行格式化,以便在前端进行渲染。我们假设我们从服务器端获取到了如下的 JSON 数据:

-- -------------------- ---- -------
-
  ---- -- ----- ----- --- --------- ---
  ---- -- ----- ----- --- --------- ---
  ---- -- ----- ----- ----- --------- ---
  ---- -- ----- ----- ----- --------- ---
  ---- -- ----- ----- ----- --------- ---
  ---- -- ----- ----- ------- --------- ---
  ---- -- ----- ----- ------- --------- ---
  ---- -- ----- ----- ------- --------- ---
  ---- -- ----- ----- ------- --------- --
-

该数据代表了一个包含多个节点的树形结构,其中 parentId 表示该节点的父节点。为了便于 Vue.js 组件的渲染,我们需要将该数据格式化为以下类似的结构:

-- -------------------- ---- -------
-
  -
    --- --
    ----- ----- ---
    --------- -
      -
        --- --
        ----- ----- -----
        --------- -
          -
            --- --
            ----- ----- -------
            --------- --
          --
          -
            --- --
            ----- ----- -------
            --------- --
          -
        -
      --
      -
        --- --
        ----- ----- -----
        --------- -
          -
            --- --
            ----- ----- -------
            --------- --
          -
        -
      -
    -
  --
  -
    --- --
    ----- ----- ---
    --------- -
      -
        --- --
        ----- ----- -----
        --------- -
          -
            --- --
            ----- ----- -------
            --------- --
          -
        -
      -
    -
  -
-

这样的格式便于我们使用嵌套的组件进行递归渲染。

我们可以写一个函数来实现数据格式化:

-- -------------------- ---- -------
-------- -------------------- -
  ----- --- - ---
  ----- -------- - ---

  ----------------- -- -
    ------------- - ---
    ------------ - -----
  ---

  ----------------- -- -
    ----- ------ - -------------------
    ------ - -------------------------- - --------------------
  ---

  ------ ---------
-

该函数通过遍历数据两次,第一次将每个节点放入一个以 id 为键的 map 中,第二次遍历根据 parentId 将每个节点放入其父节点的 children 数组中,如果该节点没有父节点,则将其放入顶层节点数组 treeData 中。最后返回 treeData 即可。

组件设计

接下来,我们需要设计一个 Vue.js 组件用于渲染树形结构数据。该组件应该包含以下功能:

  1. 递归渲染多层级数据。
  2. 点击展开/关闭子节点。
  3. 记录节点的展开/关闭状态。

我们可以将每个节点渲染为一个 <div>,其中包含节点名称和用于展开/关闭子节点的图标。用户可以点击节点名称或图标来展开或关闭子节点。同时,我们可以为每个节点加入一个布尔型 expanded 值,用于记录节点的展开/关闭状态。

-- -------------------- ---- -------
----------
  ---- -------------
    ---- ------------ ------------------ --------- --------
    ---- ------------ ------------------ ---- --------
    ---- ---------------- ------------------
      ----------
        ------------ -- --------------
        ---------------
        -------------
      --
    ------
  ------
-----------

--------
------ ------- -
  ----- -----------
  ------ -
    ----- ------
  --
  ------ -
    ------ -
      --------- -----
    --
  --
  --------- -
    ------ -
      ------ ------------- - --- - ----
    -
  --
  -------- -
    -------- -
      ------------- - ---------------
    -
  -
--
---------

以上代码实现了我们所需要的功能。每个节点渲染为一个 <div>,其中 name iconchildren 分别对应节点名、展开/关闭图标和子节点。expanded 存储节点展开/关闭状态,并且 icon 根据该状态生成不同的图标。toggle 方法用于将 expanded 的值反转。

需要注意的是,我们使用了递归组件 TreeNode 来实现多层级数据的渲染。每个节点的子节点也是 TreeNode 组件,这样就可以实现嵌套的树形结构。

数据渲染

最后,我们需要将格式化后的数据通过组件渲染到页面之中。我们可以写一个新的 Vue.js 组件来负责加载数据并渲染树形结构。

-- -------------------- ---- -------
----------
  ---- ------------------
    ----------
      ----------- -- ---------
      --------------
      ------------
    --
  ------
-----------

--------
------ -------- ---- -----------------

------ ------- -
  ----- -----------
  ----------- -
    --------
  --
  ------ -
    ----- -----
  --
  --------- -
    ---------- -
      ------ --------------------------
    -
  -
--
---------

以上代码实现了树形结构的渲染,其中 TreeView 组件用于加载 data 并通过 formatTreeData 函数将其格式化为树形结构数据。然后,该组件将使用 TreeNode 组件递归渲染每个节点,最终完成树形结构的渲染。

下面是一个完整的示例代码:

-- -------------------- ---- -------
----------
  ---- ------------------
    ----------
      ----------- -- ---------
      --------------
      ------------
    --
  ------
-----------

--------
------ -------- ---- -----------------

------ ------- -
  ----- -----------
  ----------- -
    --------
  --
  ------ -
    ----- -----
  --
  --------- -
    ---------- -
      ------ --------------------------
    -
  --
  -------- -
    -------------------- -
      ----- --- - ---
      ----- -------- - ---

      ----------------- -- -
        ------------- - ---
        ------------ - -----
      ---

      ----------------- -- -
        ----- ------ - -------------------
        ------ - -------------------------- - --------------------
      ---

      ------ ---------
    -
  -
--
---------

-------
----- -
  -------- -----
  -------------- ----
-

----- -
  ----- --
  ------- --------
-

--------- -
  ------------ -----
-

----- -
  ------ -----
  ----------- -------
  ------- --------
-
--------
-- -------------------- ---- -------
----------
  ---- -------------
    ---- ------------ ------------------ --------- --------
    ---- ------------ ------------------ ---- --------
    ---- ---------------- ------------------
      ----------
        ------------ -- --------------
        ---------------
        -------------
      --
    ------
  ------
-----------

--------
------ ------- -
  ----- -----------
  ------ -
    ----- ------
  --
  ------ -
    ------ -
      --------- -----
    --
  --
  --------- -
    ------ -
      ------ ------------- - --- - ----
    -
  --
  -------- -
    -------- -
      ------------- - ---------------
    -
  -
--
---------

-------
----- -
  -------- -----
  -------------- ----
-

----- -
  ----- --
  ------- --------
-

--------- -
  ------------ -----
-

----- -
  ------ -----
  ----------- -------
  ------- --------
-
--------

使用该组件只需要传入从服务器端获取的原始数据即可:

-- -------------------- ---- -------
----- --- - --- -----
  --- -------
  ----------- -
    --------
  --
  ----- -
    ----- --
  --
  ----- --------- -
    ----- -------- - ----- ------------------------------------
    --------- - ----- ----------------
  -
---

以上代码将从服务器端获取数据,并将其传递给 TreeView 组件进行渲染。

结论

通过本文的介绍,我们了解了如何使用 Vue.js 将多层级 JSON 格式数据渲染为树形结构。我们首先需要将原始数据格式化为树形结构,然后使用 Vue.js 组件递归渲染每个节点,并记录每个节点的展开/关闭状态。最后,我们可以通过使用新的组件来加载数据并渲染树形结构。

希望本文对你有所启发,如果你想深入学习 Vue.js,请参考 Vue.js 官方文档。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67503d0dfbd23cf89075d81e

纠错
反馈