自定义组件文档

This commit is contained in:
rickcole 2019-06-11 10:30:31 +08:00
parent fb898f5e2c
commit 23b098f328
1 changed files with 283 additions and 10 deletions

View File

@ -3,12 +3,14 @@ title: 自定义组件
shortname: dev
---
自定义组件主要分两类。表单类和非表单类。
自定义组件共分为两大类,表单类(FormItem和OptionControl)和非表单类(Renderer)。[示例页面](http://amis.baidu.com/group/demo/custom)
> amis是基于React进行开发的所以更推荐使用React开发自定义组件如果实在不熟悉React也没关系平台也支持使用 [Vue](#vue) 和 [San](#san)
## React
### FormItem
即表单类,它主要用来扩充表单项。先看个例子。
```jsx
import * as React from 'react';
import {FormItem} from 'amis';
@ -45,6 +47,15 @@ export default class CustomCheckbox extends React.PureComponent {
}
```
表单项开发主要关心两件事。
1. 呈现当前值。如以上例子,勾选了则显示`已勾选`,否则显示`请勾选`。
2. 接收用户交互,修改表单项值。如以上例子,当用户点击按钮时,切换当前选中的值。
至于其他功能如label/description 的展示、表单验证功能、表单布局(常规、左右或者内联)等等,只要是通过 FormItem 注册进去的都无需自己实现。
#### 使用方法
有了这个代码后,页面配置 form 的 controls 里面就可以通过这样的配置启动了。
```js
@ -61,13 +72,6 @@ export default class CustomCheckbox extends React.PureComponent {
}
```
表单项开发主要关心两件事。
1. 呈现当前值。如以上例子,勾选了则显示`已勾选`,否则显示`请勾选`。
2. 接收用户交互,修改表单项值。如以上例子,当用户点击按钮时,切换当前选中的值。
至于其他功能如label/description 的展示、表单验证功能、表单布局(常规、左右或者内联)等等,只要是通过 FormItem 注册进去的都无需自己实现。
### Renderer
非表单类的组件自定义,主要通过 `Renderer` 实现。在开始阅读之前,请先阅读 [amis 工作原理](./sdk.md#工作原理)。
@ -103,6 +107,275 @@ class CustomRenderer extends React.Component {
请注意 `this.props` 中的 `render` 方法,它用来实现容器功能,通过它可以让使用者动态的配置其他渲染模型。
## Vue
Vue的实现思路非常简单可以看[这里](https://github.com/baidu/amis/issues/31),平台基于此进行了一层封装以便用户使用,且内置了[Element](https://element.eleme.cn/2.0/#/zh-CN)作为UI组件库。以下示例代码则都基于UI库当然你也完全可以不依赖UI库。
> 组件的使用方法同 [React](#使用方法)
### FormItem
下面示例将实现一个简单的自定义输入框组件:
```jsx
import { FormItem } from 'amis/vue';
@FormItem({
type: 'vue-text'
})
class VueText {
// 这里v-model直接绑定amis中的value属性
template = `<el-input v-model="value" placeholder="请输入内容"></el-input>`;
watch = {
value: function (newValue, oldValue) {
// 可以触发amis的onChange事件进行表单项的修改且同步给amis
this.$emit('change', newValue);
}
}
}
```
### OptionControl
OptionControl也是FormItem的一种只是更适用于例如下拉框选择器这类的组件在这里我们实现一个简单的下拉框选择器
```jsx
import { OptionsControl } from 'amis/vue';
@OptionsControl({
type: 'vue-select'
})
class VueSelect {
// 这里v-model直接绑定amis中的value属性而且绑定amis的options变量
// 这样就可以和其他amis组件一样通过source配置远程拉取数据接口并将拉取到的数据同步到options变量中例如
// {
// "type": "vue-select",
// "label": "Vue-Select",
// "name": "vueSelect",
// "source": "/api/mock2/form/getOptions?waitSeconds=1"
// }
template = `<template>
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options" // 这里直接使用amis的options变量source拉取完数据后会自动同步到这个变量中
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</template>`;
watch = {
value: function (newValue, oldValue) {
// 可以触发amis的onChange事件进行表单项的修改
this.$emit('change', newValue);
}
}
}
```
### Renderer
```jsx
import { Renderer } from 'amis/vue';
@Renderer({
test: /(^|\/)vue\-button$/
})
class VueButton {
template = `
<div>
这是一个Element-UI按钮
<el-button @click="visible = true">按钮1</el-button> // 这里触发一个Element的弹框
<el-dialog :visible.sync="visible" title="Hello world">
<p>欢迎使用 Element</p>
</el-dialog>
<el-button @click="handleClick">按钮2</el-button> // 这里则触发一个amis的弹框
</div>
`;
data = {
visible: false
};
methods = {
handleClick() {
// 触发amis的onAction事件调起弹框
this.$emit('action', [
null,
{
actionType: 'dialog',
dialog: {
title: '来个弹框',
body: 'Bom Bom Bom ${a} ${b}'
}
},
{
a: 1,
b: 2
}
]);
}
};
}
```
## San
`San`内置了 [San-Mui](https://ecomfe.github.io/san-mui/#/components/TextField) 作为UI组件库。
> 组件的使用方法同 [React](#使用方法)
### FormItem
这里我们同样实现一个简单的Text输入框组件
```jsx
import * as san from 'san';
import { FormItem } from 'amis/san';
import { TextField } from 'san-mui';
@FormItem({
type: 'san-text'
})
class SanComponent extends san.Component {
constructor(options) {
super(options);
// .....
}
// value 直接绑定 amis 的 value
static template = `
<div>
<san-text-field hintText="提示文字" inputValue="{=value=}"/>
</div>
`;
static components = {
'san-text-field': TextField,
};
attached() {
this.watch('value', (value) => {
// 可以触发amis的onChange事件进行表单项的修改
this.dispatch('change', value);
});
};
initData() {
return {
value: ''
};
}
}
```
### OptionsControl
这里实现一个简单的List组件
```jsx
import * as san from 'san';
import {
OptionsControl
} from 'amis/san';
@OptionsControl({
type: 'san-list'
})
export class SanListControl extends san.Component {
// 这里还是直接绑定 options 变量,通过配置 source 拉取远端数据自动同步到options中
static template = `
<template>
<div class="a-ListControl-item {{value === opt.value ? 'is-active' : ''}}" s-for="opt in options" on-click="onClick(opt)">
<div class="a-ListControl-itemLabel">
{{opt.label}}
</div>
</div>
</template>
`
onClick(option) {
// 触发 amis 的 onChange 事件
this.dispatch('change', option.value);
}
}
```
### Renderer
```jsx
import * as san from 'san';
import { Renderer } from 'amis/san';
import { Button } from 'san-mui';
@Renderer({
test: /(^|\/)san\-button$/,
})
class SanComponent extends san.Component {
constructor(options) {
super(options);
// .....
}
static template = `
<template>
<section>
<san-button variants="raised primary" on-click="handleClick">主色</san-button>
<san-button variants="raised secondery" on-click="handleClick">次色</san-button>
<san-button variants="raised danger" on-click="handleClick">危险</san-button>
<san-button variants="raised warning" on-click="handleClick">警告</san-button>
<san-button variants="raised success" on-click="handleClick">成功</san-button>
<san-button variants="raised info" on-click="handleClick">通知</san-button>
<san-button variants="raised info" disabled="{{!0}}" on-click="handleClick">禁用</san-button>
</section>
</template>
`;
static components = {
'san-button': Button
};
handleClick() {
// 触发 amis 的 onAction 事件
this.dispatch('action', [
null,
{
actionType: 'dialog',
dialog: {
title: '来个弹框',
body: 'Bom Bom Bom ${a} ${b}'
}
},
{
a: 1,
b: 2
}
])
}
}
```
## 暴露的变量及方法
各种类型的组件都可以直接获取amis已支持的配置项例如label、name或者value等等除此之外还暴露了一些属性和方法方便开发。
### 属性
- `selectedOptions`:使用`OptionControl`类型注册器时可用,当前表单项已选中的`options`
### 方法
- `render`渲染器方法可以在自定义组件中渲染已有的amis组件参数
- `region`给当前组件设置一个key
- `node`amis组件的配置项
- `subProps`:可以不填,额外的一些配置项
- `onAction`:所有类型的注册器都可用,具体使用方法可以参考上述代码示例。参数:
- `e`:可以忽略,传入`null`就行了
- `action`:传入你想要执行的动作,可以参考 [Action](./renderers/Action.md)
- `ctx`:给当前`Action`内传入一些数据
- `onChange`:当使用`FormItem`和`OptionControl`时可用,修改当前表单项组件的值,参数:
- `value`:新的值
- `setOptions`:使用`OptionControl`类型注册器时可用,手动设置 `options` 变量,参数:
- `options`:新的`options`需要符合amis选项规则
## 工具
目前主要提供以下工具。