> ## Documentation Index
> Fetch the complete documentation index at: https://help.dingtalk.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 循环渲染

> 了解如何使用宜搭的循环渲染功能，包括静态循环数据、远程数据源循环以及嵌套循环的应用场景与设置方法。

| **能力** | **免费版** | **轻享版** | **专业版** | **专属版** |
| ------ | ------- | ------- | ------- | ------- |
| 自定义页面  | 不支持     | 不支持     | 支持      | 支持      |

## 1. 概念说明

对于需要循环渲染的场景，宜搭也准备了循环渲染设置能力

循环数据要求是数组结构，字符串数组、数字数组或者对象数组都可以

## 2. 使用场景案例

### 场景一：静态循环数据

「循环数据」定义一个静态数组，在循环体里，可以通过 this.item 获取循环值，this.index 获取循环下标。当然，item / index 也可以通过编辑「循环参数」来自定义，比如 content / idx

在【循环数据】中编辑数据，录入循环数据

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1635401420470-b53e903b-3367-4414-ab8a-3c2afb568a34.png)
</Frame>

表单编辑页面

在需要的设置中绑定循环变量

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1635401450640-8279bb5f-1b22-4424-9648-4a3e62fceb01.png)
</Frame>

绑定变量

效果图如下：

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1612085754397-ba62dcf1-c03a-4361-bbb7-c6457db74963.png)
</Frame>

### 场景二：循环远程数据源

创建一个远程数据源

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1635401483947-eaeb1c39-cc9f-45f1-ba05-84b5a1af8f4c.png)
</Frame>

将数据源绑定到循环变量上：

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1635401508197-39f9094d-bcf1-4ce7-a4ee-2e50716edfa9.png)
</Frame>

然后绑定循环变量中的值到组件中：

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1635402027256-c390a749-94c7-4d01-b42a-2e850358712a.png)
</Frame>

跟场景一比起来，主要多了一个定义远程数据源和将组件的循环数据绑定到该数据源上

效果图如下：

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1612086092706-eb442fc4-c8ba-4a06-b4c6-75886ade0cdf.png)
</Frame>

### 场景三：嵌套循环

比如远程数据源返回的数据结构如下：

```javascript theme={"theme":{"light":"github-light","dark":"github-dark"}}
[
  {
    type: '我是标题一',
    detail: [
      '内容一',
      '内容二',
      '内容三'
    ]
	},
  {
    type: '我是标题一',
    detail: [
      '内容一',
      '内容二',
      '内容三'
    ]
	},
  ...
]
```

那么我们可以实现内外两层嵌套循环，以此类推，其实 N 层（N \< Infinity）也是支持的

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1635402073355-34502c8b-6667-4609-9b6e-f398003afefb.png)
</Frame>

通常对于两个组件搭配到一起应用嵌套循环时，我们会在外层包裹一层容器组件，在容器组件上设置外层循环数据，在内部的组件（此例为文本组件）设置内层循环数据

外层的设置方式跟场景二一样，关键看下内层怎么设置：

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1635402099425-89b15f14-92d5-4c35-8955-70eb8ed9081d.png)
</Frame>

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1612086567514-aa733d83-8c7c-4c46-8b06-5d823d7ad6bb.png)
</Frame>

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1635402139103-65de570a-69f7-4918-ba62-5629df3ed7b5.png)
</Frame>

细心的你一定发现，为什么外层循环值用的是 this.item，而内层用的是 this.content，这是故意这样设置（通过编辑内层的「循环参数」），为了在内层也能拿到外层的值，否则两个都是 this.item，内层会将外层屏蔽。

效果如图：

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1612086626505-e05d89db-c377-4378-a050-5a305af09060.png)
</Frame>

## 3. 注意事项

### 3.1 关于循环中的 this 使用

在整个搭建页面中，this 其实是有层级的，当前作用域是 this，父级作用域是 this.$super，顶级作用域是 this.$top。

比如对表单容器做循环渲染，表单标识为 'fooForm'，在 **循环体** 里使用 `this.$('fooForm').getValue()` 可以拿到当次循环表单的值，若要获取所有循环表单的值，需要通过 `this.$super.$('fooForm').map(item => item.getValue())`
