ãä½ä»£ç å¼æç©æåè®®è§èã
1 ä»ç»â
1.1 æ¬åè®®è§èæ¶åçé®é¢åâ
- å®ä¹æ¬åè®®çæ¬å·è§è
- å®ä¹æ¬åè®®ä¸æ¯ä¸ªåè§èéè¦è¢«æ¯æç Level
- å®ä¹ä¸åå°ç©æç®å½è§èï¼Aï¼
- å®ä¹ä¸åå°ç©æ API è§èï¼Aï¼
- å®ä¹ä¸åå°ç©æå ¥åºè§èï¼Aï¼
- å®ä¹ä¸åå°ç©æå½é åå¤è¯è¨æ¯æè§èï¼AAï¼
- å®ä¹ä¸åå°ç©æä¸»é¢é ç½®è§èï¼AAAï¼
- å®ä¹ä¸åå°ç©ææ éç¢è®¿é®è§èï¼AAAï¼
1.2 åè®®èæ¡èµ·è人â
- æ°åï¼ä¹ç¥ã大æãå 彦ãæåãæç ãå±¹å¡ãéç¦
- 审é ï¼æ½éãæé£ã康为ãåçãè£å½¬ãæä»ã度åãéç¦ ãæåãæç ãçµ®é»
1.3 çæ¬å·â
1.0.0
1.4 åè®®çæ¬å·è§èï¼Aï¼â
æ¬åè®®éç¨è¯ä¹çæ¬å·ï¼çæ¬å·æ ¼å¼ä¸º major.minor.patch çå½¢å¼ã
- major æ¯å¤§çæ¬å·ï¼ç¨äºåå¸ä¸åä¸å ¼å®¹çåè®®æ ¼å¼ä¿®æ¹
- minor æ¯å°çæ¬å·ï¼ç¨äºåå¸åä¸å ¼å®¹çåè®®åè½æ°å¢
- patch æ¯è¡¥ä¸å·ï¼ç¨äºåå¸åä¸å ¼å®¹çåè®®é®é¢ä¿®æ£
1.5 åè®®ä¸åè§è Level å®ä¹â
| è§èç级 | å®ç°è¦æ± |
|---|---|
| A | 强å¶è§èï¼å¿ é¡»å®ç°ï¼è¿åæ¤ç±»è§èçåè®®æè¿°æ°æ®å°æ æ³åå ¥ç©æä¸å¿ï¼ä¸æ¯ææµéã |
| AA | æ¨èè§èï¼æ¨èå®ç°ï¼éµå®æ¤ç±»è§èæå©äºä¸å¡æªæ¥çæ©å±æ§åè·¨å¢éåä½ç åæççæåã |
| AAA | åèè§èï¼æ ¹æ®ä¸å¡åºæ¯å®é è¯æ±å®ç°ï¼æ¯éå¢å±é¢é¼å±çææ¯å®ç°å¼å¯¼ã |
1.6 åè¯æ¯è¯â
- ç©æï¼è½å¤è¢«æ²æ·ä¸æ¥ç´æ¥ä½¿ç¨çå端è½åï¼ä¸è¬è¡¨ç°ä¸ºä¸å¡ç»ä»¶ãåºåãæ¨¡æ¿ã
- ä¸å¡ç»ä»¶ï¼Business Componentï¼ï¼ä¸å¡é¢åå
åºäºåºç¡ç»ä»¶ä¹ä¸å®ä¹çç»ä»¶ï¼å¯è½ä¼å
å«ç¹å®ä¸å¡åçäº¤äºæè
æ¯ä¸å¡æ°æ®ï¼å¯¹å¤ä»
æ´é²å¯é
ç½®ç屿§ï¼ä¸å¿
é¡»åå¸å°å
¬åï¼å¦é¿é NPMï¼ï¼å¨åä¸ä¸ªä¸å¡åå
å¯ä»¥æµéï¼ä½ä¸éè¦ç¡®ä¿å¯ä»¥è·¨ä¸å¡åå¤ç¨ã
- ä½ä»£ç ä¸å¡ç»ä»¶ï¼Low-Code Business Componentï¼ï¼éè¿ä½ä»£ç ç¼è¾å¨æå»ºèæ¥ï¼æå«äºæºç å¼åçä¸å¡ç»ä»¶ï¼å±äºä¸å¡ç»ä»¶ä¸çä¸ç§ç±»åï¼éµå¾ªä¸å¡ç»ä»¶çå®ä¹ï¼åæ¶ä½ä»£ç ä¸å¡ç»ä»¶è¿å¯ä»¥éè¿ä½ä»£ç ç¼è¾å¨ç»§ç»å¤æ¬¡ç¼è¾ã
- åºåï¼Blockï¼ï¼éè¿ä½ä»£ç æå»ºçæ¹å¼ï¼å°ä¸ç³»åä¸å¡ç»ä»¶ãå¸å±ç»ä»¶è¿è¡åµå¥ç»åèæï¼ä¸å¯¹å¤æä¾å¯é ç½®ç屿§ãå¯éè¿åºå容å¨ç»ä»¶çå 裹ï¼å®ç°åºåå é¨å ·å¤æå®æ´çæ ·å¼ãäºä»¶ãçå½å¨æç®¡çãç¶æç®¡çãæ°æ®æµè½¬æºå¶ãè½ç¬ç«åå¨åè¿è¡ï¼å¯éè¿å¤å¶ schema å®ç°è·¨é¡µé¢ãè·¨åºç¨çå¿«éå¤ç¨ï¼ä¿éåè½åæ°æ®çæ£å¸¸ã
- 模æ¿ï¼Templateï¼ï¼ç¹å®åç´ä¸å¡é¢åå çä¸å¡ç»ä»¶ãåºåå¯ç»å为å个页é¢ï¼æè æ¯åé åè·¯ç±ç»å为å¤ä¸ªé¡µé¢éï¼ç»ç§°ä¸ºæ¨¡æ¿ã
1.7 ç©æè§èèæ¯â
ç®åéå¢ä¸å¡èåé¢ç¹ï¼èç©æè§èçä¸ç»ä¸ç»ä¸å¡èå带æ¥é¢å¤ç髿æ¬ï¼å¦ä¸æ¹é¢éå¢å个 BU çåç«¯ç©æä¹åå¨ä¸åç¨åº¦çéå¤å»ºè®¾ãæä»¬ææéè¿éå¢å±é¢çç©æéä¸é»ç¢ä¸å¡èåçåå±ï¼åæ¶éè¿éå¢å±é¢çç©ææµéæ¥æåç©æä¸°å¯åº¦ï¼éè¿ä¸°å¯ç©æçå¤ç¨æ¥ææä¸åå°ç³»ç»ç åï¼åæ¶ä¹è½ç»æ°ä¸å¡åºæ¯æä¾é«è´¨éçå¯å¨ç©æã
1.8 ç©æè§èå®ä¹â
- æºç ç©æè§èï¼ä¸å¥é¢åå¼åè çç®å½è§èï¼ç¨äºè§èå约æå¼åè¿ç¨ä¸ç代ç ãææ¡£ãæ¥å£è§èï¼ä»¥æ¹ä¾¿ç©æå¨éå¢å çæµéã
- æå»ºç©æè§èï¼ä¸å¥é¢åå¼åè ç Schema è§èï¼ç¨äºè§èå约æå¼åè¿ç¨ä¸ç代ç ãææ¡£ãæ¥å£è§èï¼ä»¥æ¹ä¾¿ç©æå¨éå¢å çæµéã
2. ç©æè§è - ä¸å¡ç»ä»¶è§èâ
2.1 æºç è§èâ
2.1.1 ç®å½è§èï¼Aï¼â
component // ç»ä»¶åç§°, æ¯å¦ biz-button
âââ build // ãç¼è¯çæããå¿
éã
â âââ index.html // ãç¼è¯çæããå¿
éãå¯ç´æ¥é¢è§æä»¶
âââ lib // ãç¼è¯çæããå¿
éã
â âââ index.js // ãç¼è¯çæããå¿
éãjs å
¥å£æä»¶
â âââ index.scss // ãç¼è¯çæããå¿
éãcss å
¥å£æä»¶
â âââ style.js // ãç¼è¯çæããå¿
éãjs çæ¬ css å
¥å£æä»¶ï¼æ¹ä¾¿å»é
âââ demo // ãå¿
éãç»ä»¶ææ¡£ç®å½ï¼å¯ä»¥æå¤ä¸ª md æä»¶
â âââ basic.md // ãå¿
éãç»ä»¶ææ¡£ç¤ºä¾ï¼ç¨äºçæç»ä»¶å¼åé¢è§ï¼ä»¥åçæç»ä»¶ææ¡£
âââ src // ãå¿
éãç»ä»¶æºç
â âââ index.js // ãå¿
éãç»ä»¶åºå£æä»¶
â âââ index.scss // ãå¿
éãä»
å
å«ç»ä»¶èªèº«æ ·å¼çæºç æä»¶
âââ README.md // ãå¿
éãç»ä»¶è¯´æå API
âââ package.json // ãå¿
éãç»ä»¶ package.json
README.mdâ
- README.md åºè¯¥å å«ä¸å¡ç»ä»¶çæºä¿¡æ¯ã使ç¨è¯´æä»¥å APIï¼ç¤ºä¾å¦ä¸ï¼
# æé® // è¿ä¸è¡æ¯æ é¢
æé®ç¨äºå¼å§ä¸ä¸ªå³æ¶æä½ã // è¿ä¸è¡æ¯æè¿°
{è¿æ®µéè¿å·¥ç¨è½åèªå¨æ³¨å
¥, å¼åè
æ éç¼å
## å®è£
æ¹æ³
npm install @alifd/ice-layout -S
}
## API
| åæ° | 说æ | ç±»å | å¯éå¼ | é»è®¤å¼ |
| ---- | ---- | ------ | ------------------- | ------ |
| type | ç±»å | String | `primary`ã`normal` | `normal` |
- README.en-US.mdï¼æä»¶å½åéå bcp47 è§èï¼å¤è¯è¨çæ åµï¼å¯é
# Button
Button use to trigger an action.
{è¿æ®µéè¿å·¥ç¨è½åèªå¨æ³¨å
¥, å¼åè
æ éç¼å
## Install
npm install @alifd/ice-layout -S
}
## API
| Param | Description | Type | Enum | Default |
| ----- | ----------- | ------ | ------------------- | ------- |
| type | type | String | `primray`ã`normal` | normal |
package.jsonâ
package.json ä¸å
å«äºä¸äºä¾èµä¿¡æ¯åé
置信æ¯ï¼ç¤ºä¾å¦ä¸ï¼
{
"name": "@alife/1688-button",
"description": "ä¸å¡ç»ä»¶æè¿°",
"version": "0.0.1",
"main": "lib/index.js",
"stylePath": "lib/style.js", // ãç§æåæ®µãæ ·å¼æä»¶å°åï¼webpack æä»¶å¼ç¨
"files": [
"demo/",
"lib/",
"build/" // åæ¾ç¼è¯åç demoï¼åå¸ååºè¯¥ç¼è¯çæè¯¥ç®å½
],
"dependencies": {
"@alifd/next": "1.x" // ãå¯éãå¯ä»¥æ¯ä¸ä¸ª util ç±»åçç»ä»¶ï¼å¦æä¾èµ nextï¼è¯·å¡å¿
åè¯ä¹åçæ¬å·ï¼ä¸è¦å*è¿ç§
},
"devDependencies": {
"react": "^16.5.0",
"react-dom": "^16.5.0"
},
"peerDependencies": {
"react": "^16.5.0"
},
"componentConfig": { // ãç§æåæ®µãç»ä»¶é
置信æ¯
"name": "button", // ç»ä»¶è±æå
"title": "æé®", // ç»ä»¶ä¸æå
"category": "form" // ç»ä»¶åç±»
}
}
src/index.jsâ
å å«ç»ä»¶çåºå£æä»¶ï¼ç¤ºä¾å¦ä¸ï¼
import Button from './Button.jsx';
import ButtonGroup from './ButtonGroup.jsx';
export const Group = ButtonGroup; // åç»ä»¶æ¨èåæ³
export default Button;
æ¨èç¨æ³
import Button, { Group } form '@scope/button';
src/index.scssâ
/* ä¸å¼å
¥ä¾èµç»ä»¶çæ ·å¼ï¼æ¯å¦ç»ä»¶ import { Button } from '@alifd/next'; */
/* ä¸éè¦å¨ index.scss ä¸å¼å
¥ @import '~@alifd/next/lib/button/index.scss'; */
/* 妿éè¦å¼å
¥ä¸»é¢åéå¼å
¥æ¤æ®µ */
@import '~@alifd/next/variables.scss';
/* ç»ä»¶èªèº«æ ·å¼ */
.custom-component {
color: $color-brand1-1;
}
demoâ
demo ç®å½åæ¾çæ¯ç»ä»¶çææ¡£ï¼æ ææ¡£çä¸å¡ç»ä»¶æ æ³å¸¦æ¥ä»»ä½ä»·å¼ï¼å æ¤ demo æ¯å¿ é项ãdemo ç®å½ä¸çæä»¶éå markdown çåæ³ï¼å¯ä»¥æ¯å¤ä¸ªæä»¶ï¼ç¤ºä¾ï¼demo/basic.mdï¼å¦ä¸ï¼
demo/basic.md
---
title: {æé®ç±»å}
order: {ææ¡£çæåºï¼æ°åï¼0 æå°ï¼ä»å°å°å¤§æåº}
---
æé®æä¸ç§è§è§å±æ¬¡ï¼ä¸»æé®ã次æé®ãæ®éæé®ãä¸åçç±»åå¯ä»¥ç¨æ¥åºå«æé®çéè¦ç¨åº¦ã
:::lang=en-US
---
title: Container
order: 3
---
Change the default container by passing a function to `container`;
enable `useAbsolute` to use `absolute position` to implement affix component;
:::
```jsx // 以ä¸å»ºè®®ç¨è±æç¼å
import Button from '@alife/1688-button';
ReactDOM.render(<div className="test">
<Button type="normal">english</Button>
</div>, mountNode);
```
```css
.test {
background: #CCC;
}
```
2.1.2 API è§èï¼A)â
API æ¯ç»ä»¶ç屿§è§£éï¼ç»å¼åè ä½ä¸ºç»ä»¶å±æ§é ç½®çåèã为äºä¿æ API çä¸è´æ§ï¼æä»¬å¶å®è¿ä¸ª API å½åè§èã对äºä¸çéç¨çï¼çº¦å®ä¿æçå½åï¼æä»¬éµå¾ªç¤¾åºç约å®ã对äºä¸çæå¤ç§è§åé¾ä»¥ç¡®å®çï¼æä»¬ç¡®å®å ¶ä¸ä¸ç§ï¼å¤§å®¶å ±åéµå®ã
éç¨è§åâ
- ææç API éç¨å°é©¼å³°ç书åè§åï¼å¦
onChangeãdirectionãdefaultVisibleã - æ ç¾åéç¨å¤§é©¼å³°ä¹¦åè§åï¼å¦
MenuãSliderãDatePickerã
éç¨å½åâ
| API åç§° | ç±»å | æè¿° | 常è§åé |
|---|---|---|---|
| shape | string | å½¢ç¶ï¼ä»ç»ä»¶çå¤å½¢æ¥çæåºå«çæ¶åï¼ä½¿ç¨ shape | |
| direction | enum | æ¹åï¼åå¼éç¨ç¼©åçæ¹å¼ã | hozï¼æ°´å¹³ï¼, verï¼åç´ï¼ |
| align | enum | 坹齿¹å¼ | tl, tc, tr, cl, cc, cr, bl, bc, br |
| status | enum | ç¶æ | normal, success, error, warning |
| size | enum | å¤§å° | small, medium, large æ´å¤§ææ´å°å¯ç¨ (xxs, xs, xl, xxl) |
| type | enum or string | åç±»:1. dom ç»æä¸åãåªæç®è¤çåå 2.ç»ä»¶ç±»ååªæå¹¶åçå ç±» | normal, primary, secondary |
| visible | boolean | æ¯å¦æ¾ç¤º | |
| defaultVisible | boolean | æ¯å¦æ¾ç¤ºï¼éåæ§ï¼ | |
| disabled | boolean | ç¦ç¨ç»ä»¶ | |
| closable | bool/string | å è®¸å ³éçæ¹å¼ | |
| htmlType | string | å½åçç»ä»¶ä¸ Fusion ç»ä»¶ç type 产çå²çªæ¶ï¼åçç»ä»¶ä½¿ç¨ htmlType | |
| link | string | 龿¥ | |
| dataSource | array | åè¡¨æ°æ®æº | [{label, value}, {label, value}] |
| has+'屿§' | boolean | æ¥ææä¸ªå±æ§ | ä¾å¦ hasArrowï¼ hasHeaderï¼ hasClose çç |
å¤éæä¸¾â
å½æä¸ª API çæ¥å£ï¼å
è®¸ç¨æ·æå®å¤ä¸ªæä¸¾å¼çæ¶åï¼æä»¬æè¿ä¸ªæ¥å£å®ä¹ä¸ºå¤éæä¸¾ãä¸ä¸ªå¾å
¸åçä¾åæ¯æä¸ªå¼¹å±ç»ä»¶ç closable 屿§ï¼æä»¬ä¼å
许ï¼é®ç esc æé®ãç¹å» maskãç¹å» close æé®ãç¹å»ç»ä»¶ä»¥å¤çä»»ä½åºåè¿è¡å
³éã
ä¸è¦æä¸ä¸ª API å¼ï¼æ¯æå¤ç§ç±»åãä¾å¦æä¸ªå¼¹å±çç»ä»¶ï¼æä»¬ä¼å 许 escãç¹å» maskãç¹å» close æé®çè¿è¡å ³éãæ¤æ¶ API 设计å¯ä»¥éè¿å¤ä¸ª API æ¿è½½ï¼ä¾å¦ï¼
closable?: boolean; // é»è®¤ä¸º true
closeMode?: CM[] | string; // é»è®¤å¼æ¯ ['close', 'mask', 'esc']
true 表示触åè§åé½ä¼å ³éï¼false 表示触åè§åä¸ä¼å ³éã
示ä¾ï¼
<Dialog closable closeMode={['close', 'mask', 'esc']} />ï¼ææåæ³æ¡ä»¶é½ä¼å ³é<Dialog closable={false} />ï¼ä»»ä½æ åµä¸é½ä¸å ³éï¼åªè½éè¿åæ§è®¾ç½® visible<Dialog closable closeMode={['close', 'esc']} />ï¼ç¨æ·æ esc æè ç¹å»å ³éæé®ä¼å ³é
äºä»¶â
- æ åäºä»¶æè
èªå®ä¹ç符å w3c æ åçäºä»¶ï¼å½åå¿
é¡» on å¼å¤´ï¼Â å³
on + äºä»¶åï¼å¦ onExpandã
表åè§èâ
- æ¯æåæ§æ¨¡å¼(value + onChange) ï¼A)
- value æ§å¶ç»ä»¶æ°æ®å±ç°
- onChange ç»ä»¶åçååæ¶åçåè°å½æ°ï¼ç¬¬ä¸ä¸ªåæ°å¯ä»¥ç»å° value)
value={undefined}çæ¶åæ¸ ç©ºæ°æ®ï¼field ç reset 彿°ä¼ç»ææç»ä»¶ä¸å undefined æ°æ® (AA))- 䏿¬¡å®æ´æä½æä¸æ¬¡ onChange äºä»¶Â
建议 æ¯å¦æ Process 表示è¿å±ä¸çç¶æï¼å»ºè®®å¢å APIÂonProcessï¼å¦ææ Start 表示å¯å¨ç¶æï¼å»ºè®®å¢å APIÂonStart  (AA)
屿§çä¼ éâ
1. ååç»ä»¶ï¼Atomic Componentï¼
æå°ç²åï¼ä¸è½åæåçç»ä»¶
举ä¾ï¼Input/Button/NumberPicker
ææä½¿ç¨èµ·æ¥åæ®éç html æ ç¾ä¸æ ·ï¼è½å¤æç¨æ·ä¼ å ¥çåæ°ï¼éä¼ å°çæ£çèç¹ä¸ã
<Input id="my-input" aria-label="this is input" />
渲æåç dom ç»æï¼
<span class="next-input next-medium">
<input id="my-input" aria-label="this is input" height="100%" autocomplete="off" value="">
</span>
2. å¤åç»ä»¶ï¼Composite componentï¼
å¤åç»ä»¶ä¸è¬ç±ä¸¤ä¸ªå以ä¸çååç»ä»¶/å¤åç»ä»¶ææï¼æ¯å¦ï¼Select ç± Inupt + å¼¹çªç»æï¼Search ç± Select + Button ç»æï¼TreeSelect ç± Tree + Select ç»æã
ä¸ºäºæé«ç»ä»¶ä½¿ç¨çä¾¿å©æ§ï¼å¯¹ API 屿§çè¦æ±å¦ä¸ï¼
- å¤åç»ä»¶æ ¸å¿çååç»ä»¶ï¼æ¯å¦ Search çæ ¸å¿ååç»ä»¶æ¯ Inputï¼ç屿§ä»¥å使ç¨é¢çé«ç屿§å»ºè®®æå¹³åï¼è®©å¤åç»ä»¶å¯ä»¥ç´æ¥ä½¿ç¨å ¶å±æ§ï¼
- å¤åç»ä»¶å
çéæ ¸å¿ååç»ä»¶ï¼åéè¿Â
xxxProps ï¼å¦ inputProps/btnPropsï¼çæ¹å¼ï¼å°åæ°ä¼ éå°ç¸åºååç»ä»¶ä¸ã
屿§æå¹³åä¾åï¼
æ¯å¦ Search ç»ä»¶ç± Input å Button ææï¼ä½æ¯Â Search æ´åæ¯ Input ï¼å æ¤æ Input ä½ä¸ºä¸»è¦ç»ä»¶ï¼å°å±æ§æå¹³åãå³å¨ Search ç»ä»¶ä¸ç´æ¥ä½¿ç¨ä¸äº Input ç屿§ã <Search innerBefore="before text">
æ¯å¦ Select TreeSelect 齿弹å±é¨åï¼Overlay Overlay.Popup ç visible 屿§ä½¿ç¨çè¾é«ï¼ä¸è¬ç¨äº fixed å¸å±ä¸çå¼¹çªæ»å¨è·éãå æ¤æè¯¥å±æ§æ´é²å°æå¤å±ï¼ç®å使ç¨Â <Select visible={true}>Â
xxxProps ä¾åï¼
æ¯å¦Â Search ç»ä»¶ç±Â Input å Button ææï¼Button ç屿§éè¿Â buttonPropsÂ ä¼ éç»å
é¨ç Buttonã<Search buttonProps={{loading: true}}>
2.1.3 å ¥åºæ¹å¼ (A)â
å ¥åºæ¯æï¼åå¸ç»ä»¶ï¼å¹¶ä¸åå¨å°éå¢ç©æä¸å¿ï¼æ¹ä¾¿ç»ä¸ç®¡çåæµéã
step 1: åå¸ç»ä»¶å° tnpm
$ tnpm publish
step 2: 忥å°éå¢ç©æä¸å¿
# å®è£
å·¥å
·
$ tnpm i iceworks -g
# æ§è¡åæ¥
$ iceworks sync
2.1.4 å½é åå¤è¯è¨æ¯æè§èï¼AAï¼â
æä»¶å½åéå bcp47 è§è
ç®å½è§èâ
å¨Â src ç®å½æ°å¢Â locale ç®å½ç¨äºç®¡çä¸åè¯è¨çææ¡ã
|- BizHello
|-- src
|---- locale
|------ zh-CN.js
|------ en-US.js
|------ ja-JP.js
å®ä¹ä¸åçè¯è¨â
// zh-CN.js
export default {
hello: 'ä½ å¥½ï¼ä¸ç'
};
// en-US.js
export default {
hello: 'hello world'
};
// ja-JP.js
export default {
hello: 'ããã«ã¡ã¯ãä¸ç'
};
ç»ä»¶æ¯æå¤è¯è¨å»ºè®®æ¹æ¡â
// index.jsx
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import zhCN from './locale/zh-CN.js'; // å¼å
¥é»è®¤è¯è¨
export default class BizHello extends Component {
static componentName = 'BizHello';
static propTypes = {
locale: PropTypes.object, // å¢å localeï¼ç¨äºé
ç½®ææ¡
};
static defaultProps = {
locale: zhCN,
};
render() {
const { locale } = this.props;
return (
<div>{locale.hello}</div>
);
}
}
ç»ä»¶æ¯æå ¨å±æ¿æ¢å½é åææ¡â
é å ConfigProvider æ¯æå ¨å±æ¿æ¢å½é åææ¡ã
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { ConfigProvider } from '@alifd/next';
import zhCN from './locale/zh-CN.js'; // å¼å
¥é»è®¤è¯è¨
class BizHello extends Component {
static propTypes = {
locale: PropTypes.object, // å¢å localeï¼ç¨äºé
ç½®ææ¡
};
static defaultProps = {
locale: zhCN,
};
render() {
const { locale } = this.props;
return (
<div>{locale.hello}</div>
);
}
}
export default ConfigProvider.config(BizHello, {
componentName: 'BizHello' // æå®ç»ä»¶åç§°ï¼é»è®¤åç»ä»¶ç displayName
});
2.1.5 主é¢åæ¢è§èï¼AAï¼â
ä¸å¡ç»ä»¶ä¸å¦ææèªå®ä¹çéè¦è·é主é¢è²ç UIï¼ä¸å®è¦å¼å ¥åéçå½¢å¼ï¼å¢å ç»ä»¶çæµéæ§ã
src/index.scssâ
/* 妿éè¦å¼å
¥ä¸»é¢åéå¼å
¥æ¤æ®µ */
@import '~@alifd/next/variables.scss';
/* ç»ä»¶èªèº«æ ·å¼ */
.custom-component {
color: $color-brand1-1;
}
2.1.6 [Deprecated]æ¯æè½¬è®¾è®¡ç¨¿ï¼AAAï¼â
å¯¹æ¥ sketch æä»¶ï¼FusionCoolï¼çç®çæ¯ä¸ºäºè®©å¼å产åºçä¸å¡ç»ä»¶è½å¤ç´æ¥ç»è®¾è®¡å¸ä½¿ç¨ï¼ç¨æ³ç±»ä¼¼ç°å¨ Fusion Next åºç¡ç»ä»¶ã
æ°å¢æä»¶Â adaptor/index.js ã
import BizButton from '@alifd/biz-button';
export default {
name: 'BizButton',
editor: () => ({
props: [{
name: 'level',
type: 'enum',
options: ['normal', 'primary', 'secondary'],
}, {
name: 'size',
type: 'enum',
options: ['large', 'medium', 'small'],
default: 'medium',
}],
data: {
default: 'hello',
}
}), // å
容ç¼è¾å¨
adaptor: ({ data, level, size, ...others }) => {
return <BizButton type={level} size={size}>{data}</BizButton>;
},
}
api 屿§æ ååè https://fusion.design/help.html#/dev-biz
2.1.7 æ éç¢è®¿é®è§è (AAA)â
æ éç¢éè¦ç¬¦å WCAG 2.1 A 级æ åï¼å¯åè W3C æ éç¢æä½³å®è·µãFusion æ éç¢æå¼ 2.3.1 ç« èçã
å¢å a11y.md æ éç¢ demoâ
å¿
é¡»åå© API æè½å®ææ éç¢å·¥ä½çç»ä»¶å¿
须为å¼åè
æä¾æ éç¢çä½¿ç¨ææ¡£ï¼è¯·åèç»ä»¶ API ä¸ ARIA and Keyboard ï¼å»ºè®®å¨ demo ç®å½æ°å¢ a11y.md æä»¶ç¨äºæ¼ç¤ºç»ä»¶çæ éç¢ä½¿ç¨ã
component
ââ demo
ââ a11y.md
ââ basic.md
è¯¦ç»æå¼æ¥çæ éç¢å¼åæå https://alibaba-fusion.github.io/next/part1/basics.htmlã
éè¿é®çå¿«é访é®â
ä¸è¬é®çäºä»¶æ Up Arrow/Down Arrow/Enter/Esc/Tab
ä¾åï¼Select çé®çäºä»¶è¯´æ
| æé® | 说æ |
|---|---|
| Up Arrow | è·åå½å项åä¸é¡¹ç¦ç¹ |
| Down Arrow | è·åå½å项åä¸é¡¹ç¦ç¹ |
| Enter | æå¼å表æéæ©å½å项 |
| Esc | å ³éå表 |
对读å±è½¯ä»¶å好â
- 对äºç»ä»¶ï¼æä»¬ä¸ºå¼åè
å
ç½®
roleåç¹å®aria-_屿§ï¼å¼åè ä¹å¯ä»¥å¯¹éç»ä»¶ API 屿§é½å¯ä»¥éä¼ è³ DOM å ç´ ï¼è¿è¡ä¿®æ¹roleåaria-_åæ°ï¼ä½æ¯è¦æ³¨æå¯¹åºå ³ç³»ï¼è¯·åèã - 对ä¸äºç¹æ®çç»ä»¶ä¼ éåæ°æè½æ¯ææ éç¢ï¼è®¾ç½®
idï¼autoFocusåä¼ åæ°ï¼å¦ä¸ï¼- id -Â
Balloonï¼Rating - autoFocus - å¼¹å±èªå¨èç¦ï¼ä¾å¦
Dialogï¼Overlayï¼Dropdown - ä¼ åæ° - æäºç»ä»¶éè¦æ ¹æ®å
·ä½çä¸å¡ï¼å®ç°ä¸åçå¯è®¿é®æ§ï¼è¿é为å¼åè
å
ç½®ä¸äºåæ°ï¼æ³ä½¿ç¨æ éç¢çæ¶åï¼ç¨æ·åªéè¦æ ¹æ®ç°æçéæ±ï¼éæ©å¯¹åºçå
ç½®åæ°ï¼ä¾å¦è®¾ç½® aria-labelï¼ä»¥ä¸ç»ä»¶éè¦ç¨æ·ä¼ åæ°ææ¯ææ éç¢ç»ä»¶å¦ä¸ï¼
NumberPickerãTransfer
- id -Â
2.2 ä½ä»£ç è§èâ
2.2.1 ç»ä»¶è§èâ
éè¿ä½ä»£ç ç¼è¾å¨æå»ºèæ¥ï¼æå«äºæºç å¼åçä¸å¡ç»ä»¶ï¼å±äºä¸å¡ç»ä»¶ä¸çä¸ç§ç±»åï¼éµå¾ªä¸å¡ç»ä»¶çå®ä¹ï¼åæ¶ä½ä»£ç ä¸å¡ç»ä»¶è¿å¯ä»¥éè¿ä½ä»£ç ç¼è¾å¨ç»§ç»å¤æ¬¡ç¼è¾ã
| æ ¹å±æ§æè¿° | 说æ | ç±»å |
|---|---|---|
| version | åè®®çæ¬å· | String |
| componentsMap | æè¿°ç»ä»¶æ å°å ³ç³»çéå | Array |
| componentsTree | ä½ä»£ç ä¸å¡ç»ä»¶æ æè¿°ï¼æ¯é¿åº¦åºå®ä¸º 1 çæ°ç»ï¼å³æ°ç»å ä» å 嫿 ¹å®¹å¨çæè¿°ï¼ä½ä»£ç ä¸å¡ç»ä»¶å®¹å¨ç±»åï¼ | Array |
| utils | å·¥å ·ç±»æ©å±æ å°å ³ç³» | Array |
| i18n | å½é åè¯æ | Object |
æè¿°ä¸¾ä¾ï¼
{
"version": "1.0.0",
"componentsMap": [{ }],
"componentsTree": [{ // ä½ä»£ç ä¸å¡ç»ä»¶æ ï¼é¡¶å±ç±ä½ä»£ç ä¸å¡ç»ä»¶å®¹å¨å
裹ï¼
"componentName": "Component", // ä½ä»£ç ä¸å¡ç»ä»¶å®¹å¨ç»ä»¶å
"fileName": "SearchComp", // ä½ä»£ç ä¸å¡ç»ä»¶æä»¶åï¼åæ¶ä¼å°é¦åæ¯å¤§åï¼ä½ä¸ºä½ä»£ç ä¸å¡ç»ä»¶å
"props": {}, // ä¸è¬ä¸å®ä¹ï¼å¦æææ°æ®ç¨äºæ¨¡æå¤é¨ä¼ å
¥ç屿§å¼
"css": "body {font-size: 12px;}",
"state": {
"name": "lucy",
},
"static": {}, // ç¨äºå®ä¹èªå®ç»ä»¶ç static 屿§
"defaultProps": { // é»è®¤ propsï¼éå¡«ä»
ç¨äºå®ä¹ä½ä»£ç ä¸å¡ç»ä»¶çé»è®¤å±æ§åºå®å¯¹è±¡
"name": "xxx"
},
"children": [{
"componentName": "Div",
"props": {
"className": "className1"
},
"children": [{
"componentName": "Button",
"props": {
"text": "ç¹å»å¼¹åºæçå§å",
"onClick": {
"type": "JSFunction",
"value": "function(e){\
alert(this.state.name)\
}"
}
}
}]
}]
}],
"i18n": { }
}
2.2.2 ç»ä»¶æè¿°åè®®â
对æºç ç»ä»¶å¨ä½ä»£ç æå»ºå¹³å°ä¸ä½¿ç¨æ¶æå ·å¤çé ç½®è½åå交äºè¡ä¸ºè¿è¡è§èåæè¿°ï¼è®©ä¸åå¹³å°å¯¹ç»ä»¶æ¥å ¥çå®ç°ä¿æä¸è´ï¼è®©ç»ä»¶é对ä¸åçæå»ºå¹³å°æ¥å ¥æ¶å¯ä»¥ä½¿ç¨ä¸ä»½ç»ä¸çæè¿°å 容ï¼è®©ç»ä»¶å¨ä¸åçä¸å¡ä¸æµéæä¸ºå¯è½ã
2.2.2.1 åè®®ç»æâ
å个ç»ä»¶æè¿°å 容为 json ç»æï¼ä¸»è¦å å«ä»¥ä¸ä¸é¨åå 容ï¼åå«ä¸ºï¼
- åºç¡ä¿¡æ¯ (A)ï¼ æè¿°ç»ä»¶çåºç¡ä¿¡æ¯ï¼é常å å«å ä¿¡æ¯ãç»ä»¶åç§°ãæ é¢ãæè¿°çã
- ç»ä»¶å±æ§ä¿¡æ¯ (A)ï¼ æè¿°ç»ä»¶å±æ§ä¿¡æ¯ï¼é常å å«åæ°ã说æãç±»åãé»è®¤å¼ 4 项å 容ã
- è½åé ç½®/ä½éªå¢å¼ºï¼ æ¨èç¨äºä¼åæå»ºäº§åç¼è¾ä½éªï¼å®å¶ç¼è¾è½åçé 置信æ¯ã
2.2.2.2 åºç¡ä¿¡æ¯ï¼Aï¼â
| åæ®µ | åæ®µæè¿° | åæ®µç±»å | å 许空 |
|---|---|---|---|
| componentName | ç»ä»¶åç§° | String | å¦ |
| title | ç»ä»¶ä¸æåç§° | String | å¦ |
| description | ç»ä»¶æè¿° | String | æ¯ |
| docUrl | ç»ä»¶ææ¡£é¾æ¥ | String | å¦ |
| screenshot | ç»ä»¶å¿«ç § | String | å¦ |
| icon | ç»ä»¶çå°å¾æ | String (URL) | æ¯ |
| tags | ç»ä»¶æ ç¾ | String | æ¯ |
| keywords | ç»ä»¶å ³é®è¯ï¼ç¨äºæç´¢èæ³ | String | æ¯ |
| devMode | ç»ä»¶ç 忍¡å¼ | String (proCode,lowCode) | æ¯ |
| npm | npm æºå¼å ¥å®æ´æè¿°å¯¹è±¡ | Object | å¦ |
| npm.package | æºç ç»ä»¶åºå | String | å¦ |
| npm.exportName | æºç ç»ä»¶åç§° | String | å¦ |
| npm.subName | åç»ä»¶å | String | å¦ |
| npm.destructuring | è§£æ | Bool | å¦ |
| npm.main | ç»ä»¶è·¯å¾ | String | å¦ |
| npm.version | æºç ç»ä»¶çæ¬å· | String | å¦ |
| snippets | å 容为ç»ä»¶ä¸åç¶æä¸çä½ä»£ç schema (å¯ä»¥æå¤ä¸ª)ï¼ç¨æ·ä»ç»ä»¶é¢æ¿æå ¥ç»ä»¶å°è®¾è®¡å¨æ¶ä¼åé¡µé¢ schema ä¸æå ¥ snippets ä¸å®ä¹çç»ä»¶ä½ä»£ç schema | Object[] | å¦ |
| group | ç¨äºæè¿°å½åç»ä»¶ä½äºç»ä»¶é¢æ¿çåªä¸ª tab | String | å¦ |
| category | ç¨äºæè¿°ç»ä»¶ä½äºç»ä»¶é¢æ¿åä¸ tab çåªä¸ªåºå | String | å¦ |
| priority | ç¨äºæè¿°ç»ä»¶å¨åä¸ category ä¸çæåº | String | å¦ |
2.2.2.3 ç»ä»¶å±æ§ä¿¡æ¯ props (A)â
æè¿°ç»ä»¶å±æ§ä¿¡æ¯ï¼é常å å«åç§°ãç±»åãæè¿°ãé»è®¤å¼ 4 项å 容ã
| åæ®µ | åæ®µæè¿° | åæ®µç±»å | å 许空 |
|---|---|---|---|
| name | 屿§åç§° | String | å¦ |
| propType | 屿§ç±»å | String/Object | å¦ |
| description | 屿§æè¿° | String | æ¯ |
| defaultValue | 屿§é»è®¤å¼ | Any | æ¯ |
propType ç±»ååè PropTypesï¼åå¨åºæ¬ç±»ååå¤åç±»åï¼æè¿°å¦ä¸ï¼
åºæ¬ç±»å
| propTypeÂ å¼ | ç±»åæè¿° | åè PropTypes ç±»å |
|---|---|---|
| 'array' | æ°ç»ç±»å | PropTypes.array |
| 'bool' | å¸å°ç±»å | PropTypes.bool |
| 'func' | 彿°ç±»å | PropTypes.func |
| 'number' | æ°åç±»å | PropTypes.number |
| 'object' | 对象类å | PropTypes.object |
| 'string' | å符串类å | PropTypes.string |
| 'node' | èç¹ç±»å | PropTypes.node |
| 'element' | å ç´ ç±»å | PropTypes.element |
| 'any' | ä»»æå¼ç±»å | PropTypes.any |
| {  type: 'xxx',  isRequired: true } | æå®ç±»åï¼ä¸æ¯å¿ è¦å±æ§ | PropTypes.xxxx.isRequired |
注æï¼ä¸è¿°ç±»å忝æ PropTypes.xxx.isRequired é¾å¼æè¿°æ¹å¼æè¿°è¯¥å±æ§æ¯å¦ä¸ºå¿ è¦å±æ§ã
æè¿°ä¸¾ä¾ï¼
// ç»ä»¶æºç
export default class FusionForm extends PureComponent {
static displayName = 'FusionForm';
static propTypes = {
name: PropTypes.string,
age: PropTypes.number,
friends: PropTypes.array,
};
render(){
return ...;
}
}
// ç»ä»¶å±æ§æè¿°
{
props: [{
name: 'name',
propType: {
type: 'string',
isRequired: true,
},
description: 'è¿æ¯ç¨äºæè¿°å§å',
defaultValue: 'å¼ ä¸',
}, {
name: 'age',
propType: 'number',
description: 'è¿æ¯ç¨äºæè¿°å¹´é¾',
defaultValue: 18,
}, {
name: 'friends',
propType: 'array',
description: 'è¿æ¯ç¨äºæè¿°å¥½åå表',
defaultValue: [ 'æå', 'çäº', 'èµµå
' ],
}],
}
å¤åç±»å
| propType å¼ | ç±»åæè¿° | PropTypes ç±»å |
|---|---|---|
| {  type: 'oneOf',  value: ['a', 'b', 'c', '...'] } | æä¸¾å¼ç±»å | PropTypes.oneOf(...) |
| {  type: 'oneOfType',  value: ['string', 'number', {    type: 'array',   isRequired: true  }] } | æå®ç±»åä¸çä¸ç§ï¼æ¯æéå½æè¿° | PropTypes.oneOfType(...) |
| {  type: 'arrayOf',  value: 'number' } | æå®ç»ä¸æåå¼ç±»åçæ°ç»ç±»å | PropTypes.arrayOf(...) |
| {  type: 'objectOf',  value: 'string' } | æå®ç»ä¸å¯¹è±¡å±æ§å¼ç±»åç对象类å | PropTypes.objectOf(...) |
| {  type: 'shape',  value: [{   name: 'color',   propType: 'string'  }, {   name: 'fontSize',   propType: {    type: 'number',    isRequied: true   }   }] } | æå®å¯¹è±¡çé¨å屿§ååå¼ç±»åç对象类å | PropTypes.shape(...) |
| {  type: 'exact',  value: [{   name: 'name',   propType: 'string'   }, {   name: 'quantity',   propType: 'number'  }] } | ä¸¥æ ¼æå®å¯¹è±¡å ¨é¨å±æ§ååå¼ç±»åç对象类å | PropTypes.exact(...) |
æè¿°ä¸¾ä¾ï¼
// ç»ä»¶æºç
export default class FusionForm extends PureComponent {
static displayName = 'FusionForm';
static propTypes = {
title: PropTypes.oneOf(['News', 'Photos']),
message: PropTypes.oneOfType([
PropTypes.string,
PropTypes.number,
PropTypes.instanceOf(Message),
]),
size: PropTypes.arrayOf(PropTypes.number),
bodyStyle: PropTypes.shape({
color: PropTypes.string,
fontSize: PropTypes.number,
}),
extraContext: function (props, propName, componentName) {
if (!/matchme/.test(props[propName])) {
return new Error(
'Invalid prop `' + propName + '` supplied to' +
' `' + componentName + '`. Validation failed.'
);
}
},
};
render() {
return ...;
}
}
// ç»ä»¶å±æ§æè¿°
{
props: [{
name: 'title',
propType: {
type: 'oneOf',
value: ['News', 'Photos'],
},
description: 'è¿æ¯ç¨äºæè¿°æ é¢',
defaultValue: 'æ é¢ä¸',
}, {
name: 'message',
propType: {
type: 'oneOfType',
value: ['string', 'number', {
type: 'array',
isRequired: true,
}],
},
description: 'è¿æ¯ç¨äºæè¿°æ¶æ¯å
容',
defaultValue: 'xxx',
}, {
name: 'size',
propType: {
type: 'arrayOf',
value: 'number',
},
description: 'è¿æ¯ç¨äºæè¿°å¤§å°å表',
defaultValue: [1, 2, 3],
}], {
name: 'bodyStyle',
propType: {
type: 'shape',
value: [{
name: 'color',
propType: 'string',
}, {
name: 'fontSize',
propType: {
type: 'number',
isRequied: true,
}
}],
},
description: 'è¿æ¯ç¨äºæè¿°ä¸»ä½æ ·å¼',
defaultValue: [1, 2, 3],
}],
}
2.2.2.4 ç¼è¾ä½éªå¢å¼º configureâ
æ¨èç¨äºä¼åæå»ºäº§åçç¼è¾ä½éªï¼å®å¶ç¼è¾è½åçé 置信æ¯ï¼éè¿è½åæ½è±¡åç±»ï¼ä¸»è¦å å«å¦ä¸å 个维度çé 置项ï¼
| åæ®µ | åæ®µæè¿° | åæ®µç±»å | 夿³¨ |
|---|---|---|---|
| props (A) | 屿§é¢æ¿é ç½® | Array | ç¨äºå±æ§é¢æ¿è½åæè¿° |
| component(A) | ç»ä»¶è½åé ç½® | Object | ä¸ç»ä»¶ç¸å ³çè½åã约æãè¡ä¸ºçæè¿°ï¼æäºä¿¡æ¯å¯ä»ç»ä»¶è§å¾å®ä¾ä¸ç´æ¥è·å |
| supports (AA) | éç¨æ©å±é ç½®è½åæ¯ææ§ | Object | ç¨äºéç¨æ©å±é¢æ¿è½åæè¿° |
| advanced (AAA) | é«çº§ç¹æ§é ç½® | Object | ç¨æ·å¯ä»¥å¨è¿äºé ç½®éè¿å¼æä¸ä¸ææ§å¶ç»ä»¶å¨è®¾è®¡å¨ä¸ç表ç°ï¼ä¾å¦èªå¨åå§åç»ä»¶çåç»ä»¶ãæªè·ç»ä»¶çæä½äºä»¶è¿è¡ä¸ªæ§åå¤çç |
| ãå·²åºå¼ãexperimental (AAA) | å°å¼æçä¸äºå®éªæ§ç¹æ§æ¾å¨è¿ä¸ªé ç½®é | Object | ç¨æ·å¯ä»¥æåä½éªè¿äºç¹æ§ |
2.2.2.4.1 屿§é¢æ¿é ç½® props (A)â
props æ°ç»ä¸å¯¹è±¡å段æè¿°ï¼
| åæ®µ | åæ®µæè¿° | åæ®µç±»å | 夿³¨ |
|---|---|---|---|
| type | æå®ç±»å | Enum | å¯éå¼ä¸º `'field' |
| display | æå®ç±»å | Enum | å¯éå¼ä¸º 'accordion' \| 'inline' \| 'block' \| 'plain' \| 'popup' \| 'entry' ï¼é»è®¤ä¸º 'inline' |
| title | åç±»æ é¢ | 屿§æ é¢ | String |
| items | åç±»ä¸ç屿§å表 | Array\<Object> | type = 'group' çæ |
| name | 屿§å | String | type = 'field' çæ |
| defaultValue | é»è®¤å¼ | Any(è§å段类åèå®) | type = 'field' çæ |
| supportVariable | æ¯å¦æ¯æé ç½®åé | Boolean | type = 'field' çæ |
| condition | é ç½®å½å prop æ¯å¦å±ç¤º | (target: IPublicModelSettingField) => boolean; | - |
| ignoreDefaultValue | é ç½®å½å prop æ¯å¦å¿½ç¥é»è®¤å¼å¤çé»è¾ï¼å¦æè¿å弿¯ true 弿ä¸ä¼å¤çé»è®¤å¼ | (target: IPublicModelSettingField) => boolean; | - |
| setter | å个æ§ä»¶ (setter) æè¿°ï¼æå»ºåºç¡åè®®ç»ä»¶çæè¿°å¯¹è±¡ï¼æ¯æ JSExpression / JSFunction / JSSlot | String\|Object\|Function | type = 'field' çæ |
| extraProps | å ¶ä»é ç½®å±æ§ï¼ä¸åæµéè¦æ±ï¼ | Object | å ¶ä»é ç½® |
| extraProps.getValue | setter æ¸²ææ¶è¢«è°ç¨ï¼setter 伿 ¹æ®è¯¥å½æ°çè¿åå¼è®¾ç½® setter å½åå¼ | Function | (target: IPublicModelSettingField, value: any) => any; |
| extraProps.setValue | setter å å®¹ä¿®æ¹æ¶è°ç¨ï¼å¼åè å¯å¨è¯¥å½æ°å é¨ä¿®æ¹èç¹ schema æè è¿è¡å ¶ä»æä½ | Function | (target: IPublicModelSettingField, value: any) => void; |
æ ¹æ®å±æ§å¼ç±»å propTypeï¼ç¡®å®å¯¹åºæ§ä»¶ç±»å (setter) ã
2.2.2.4.2 éç¨æ©å±é¢æ¿æ¯ææ§é ç½® supports (AA)â
æ ·å¼é ç½®é¢æ¿è½åæè¿°ï¼æè¿°æ¯å¦æ¯æè¡ä¸æ ·å¼ç¼è¾ãæ¯å¦æ¯æç±»å设置çã
{
"configure": {
// æ¯æçäºä»¶æä¸¾
"supports": {
// æ¯æäºä»¶å表
"events": ["onClick", "onChange"],
// æ¯æå¾ªç¯è®¾ç½®
"loop": true,
// æ¯ææ¡ä»¶è®¾ç½®
"condition": true,
// æ¯ææ ·å¼è®¾ç½®
"style": true,
}
}
}
2.2.2.4.3 ç»ä»¶è½åé ç½® componentâ
ä¸ç»ä»¶ç¸å ³çè½åã约æãè¡ä¸ºçæè¿°ï¼æäºä¿¡æ¯å¯ä»ç»ä»¶è§å¾å®ä¾ä¸ç´æ¥è·åï¼å å«å¦ä¸å段ï¼
| åæ®µ | ç¨é | ç±»å |
|---|---|---|
| isContainer(A) | æ¯å¦å®¹å¨ç»ä»¶ | Boolean |
| isModal(A) | ç»ä»¶æ¯å¦å¸¦æµ®å±ï¼æµ®å±ç»ä»¶æå ¥è®¾è®¡å¨æ¶ä¼é®æ¡ç»å¸åºåï¼æ¤æ¶åºå½è¾ å©ä¸äºäº¤äºä»¥é²æ¢é»æ¡ | Boolean |
| descriptor(A) | ç»ä»¶æ æè¿°ä¿¡æ¯ | String |
| nestingRule(A) | åµå¥æ§å¶ï¼é²æ¢é误çèç¹åµå¥ï¼æ¯å¦ a åµå¥ a, FormField åªè½å¨ Form 容å¨ä¸ï¼Column åªè½å¨ Table ä¸ç | Object |
| nestingRule.childWhitelist | åèç¹ç±»åç½åå | String\|Function |
| nestingRule.parentWhitelist | ç¶èç¹ç±»åç½åå | String\|Function |
| nestingRule.descendantBlacklist | åè£èç¹ç±»åé»åå | String\|Function |
| nestingRule.ancestorWhitelist | ç¥ç¶èç¹ç±»åç½åå | String\|Function |
| isNullNode(AAA) | æ¯å¦å卿¸²æçæ ¹èç¹ | Boolean |
| isLayout(AAA) | æ¯å¦æ¯ layout å¸å±ç»ä»¶ | Boolean |
| rootSelector(AAA) | ç»ä»¶é䏿¡ç cssSelector | String |
| disableBehaviors(AAA) | ç¨äºå±è½å¨è®¾è®¡å¨ä¸éä¸ç»ä»¶æ¶æä¾çæä½é¡¹ï¼é»è®¤æä½é¡¹æ copyãhideãremove | String[] |
| actions(AAA) | ç¨äºè¯¦ç»é ç½®ä¸è¿°æä½é¡¹çå 容 | Object |
| isMinimalRenderUnit | æ¯å¦æ¯æå°æ¸²æåå ï¼æå°æ¸²æåå ä¸çç»ä»¶æ¸²æåæ´æ°é½ä»åå çæ ¹èç¹å¼å§æ¸²æåæ´æ°ã妿åµå¥äºå¤å±æå°æ¸²æåå ï¼æ¸²æä¼ä»æå¤å±çæå°æ¸²æåå å¼å§æ¸²æã | Boolean |
æè¿°ä¸¾ä¾ï¼
{
configure: {
component: {
isContainer: true,
isModal: false,
descriptor: 'title',
nestingRule: {
childWhitelist: ['SelectOption'],
parentWhitelist: ['Select', 'Table'],
},
rootSelector: '.next-dialog',
disableBehaviors: ['copy', 'remove'],
actions: {
name: 'copy', // string;
content: 'ï¼', // string | ReactNode | ActionContentObject;
items: [], // ComponentAction[];
condition: 'always', // boolean | ((currentNode: any) => boolean) | 'always';
important: true, // boolean;
},
},
},
}
2.2.2.4.4 é«çº§åè½é ç½® advanced (AAA)â
ç»ä»¶å¨ä½ä»£ç å¼æè®¾è®¡å¨ä¸çäºä»¶åè°å hooks çé«çº§åè½é ç½®ï¼å å«å¦ä¸å段ï¼
| åæ®µ | ç¨é | ç±»å | 夿³¨ |
|---|---|---|---|
| initialChildren | ç»ä»¶æå ¥â设计å¨âæ¶æ ¹æ®æ¤é ç½®èªå¨çæ children èç¹ schema | NodeData[]/Function NodeData[] | ((target: IPublicModelSettingField) => NodeData[]); |
| getResizingHandlers | ç¨äºé 置设计å¨ä¸ç»ä»¶ resize æä½å·¥å ·çæ ·å¼åå 容 | Function | (currentNode: any) => Array<{ type: 'N' |
| callbacks | é ç½® callbacks 坿è·å¼ææåºçä¸äºäºä»¶ï¼ä¾å¦ onNodeAddãonResize ç | Callback | - |
| callbacks.onNodeAdd | å¨å®¹å¨ä¸æå ¥ç»ä»¶æ¶è§¦åçäºä»¶åè° | Function | (e: MouseEvent, currentNode: any) => any |
| callbacks.onNodeRemove | å¨å®¹å¨ä¸å é¤ç»ä»¶æ¶è§¦åçäºä»¶åè° | Function | (e: MouseEvent, currentNode: any) => any |
| callbacks.onResize | è°æ´å®¹å¨å°ºå¯¸æ¶è§¦åçäºä»¶åè°ï¼å¸¸å¸¸ä¸ getResizingHandlers æé ä½¿ç¨ | Function | è¯¦è§ Types å®ä¹ |
| callbacks.onResizeStart | è°æ´å®¹å¨å°ºå¯¸å¼å§æ¶è§¦åçäºä»¶åè°ï¼å¸¸å¸¸ä¸ getResizingHandlers æé ä½¿ç¨ | Function | è¯¦è§ Types å®ä¹ |
| callbacks.onResizeEnd | è°æ´å®¹å¨å°ºå¯¸ç»ææ¶è§¦åçäºä»¶åè°ï¼å¸¸å¸¸ä¸ getResizingHandlers æé ä½¿ç¨ | Function | è¯¦è§ Types å®ä¹ |
| callbacks.onSubtreeModified | 容å¨èç¹ç»ææ åçååæ¶è§¦åçåè° | Function | (currentNode: any, options: any) => void; |
| callbacks.onMouseDownHook | é¼ æ æä¸æä½åè° | Function | (e: MouseEvent, currentNode: any) => any; |
| callbacks.onClickHook | é¼ æ å廿ä½åè° | Function | (e: MouseEvent, currentNode: any) => any; |
| callbacks.onDblClickHook | é¼ æ å廿ä½åè° | Function | (e: MouseEvent, currentNode: any) => any; |
| callbacks.onMoveHook | èç¹è¢«æå¨åè° | Function | (currentNode: any) => boolean; |
| callbacks.onHoverHook | èç¹è¢« hover åè° | Function | (currentNode: any) => boolean; |
| callbacks.onChildMoveHook | 容å¨èç¹çåèç¹è¢«æå¨åè° | Function | (childNode: any, currentNode: any) => boolean; |
æè¿°ä¸¾ä¾ï¼
{
configure: {
advanced: {
callbacks: {
onNodeAdd: (dragment, currentNode) => {
}
},
getResizingHandlers: () => {
return [ 'E' ];
},
initials: [
{
name: 'linkType',
initial: () => 'link'
},
]
},
}
}
2.2.2.5 TypeScript å®ä¹â
export interface ConfigureProp {
/**
* 颿¿é
ç½®é¶å±äºå个 field è¿æ¯åç»
*/
type?: 'field' | 'group';
/**
* the name of this setting field, which used in quickEditor
*/
name: string | number;
/**
* the field title
* @default sameas .name
*/
title?: TitleContent;
/**
* åä¸ªå±æ§ç setter é
ç½®
*
* the field body contains when .type = 'field'
*/
setter?: SetterType | DynamicSetter;
/**
* the setting items which group body contains when .type = 'group'
*/
items?: ConfigureProp[];
/**
* extra props for field
* å
¶ä»é
ç½®å±æ§ï¼ä¸åæµéè¦æ±ï¼
*/
extraProps?: ExtraProps;
}
export interface ConfigureSupport {
/**
* æ¯æäºä»¶å表
*/
events?: ConfigureSupportEvent[];
/**
* æ¯æ className 设置
*/
className?: boolean;
/**
* æ¯ææ ·å¼è®¾ç½®
*/
style?: boolean;
/**
* æ¯æçå½å¨æè®¾ç½®
*/
lifecycles?: any[];
// general?: boolean;
/**
* æ¯æå¾ªç¯è®¾ç½®
*/
loop?: boolean;
/**
* æ¯ææ¡ä»¶å¼æ¸²æè®¾ç½®
*/
condition?: boolean;
}
export interface ConfigureComponent {
/**
* æ¯å¦å®¹å¨ç»ä»¶
*/
isContainer?: boolean;
/**
* ç»ä»¶æ¯å¦å¸¦æµ®å±ï¼æµ®å±ç»ä»¶æå
¥è®¾è®¡å¨æ¶ä¼é®æ¡ç»å¸åºåï¼æ¤æ¶åºå½è¾
å©ä¸äºäº¤äºä»¥é²æ¢é»æ¡
*/
isModal?: boolean;
/**
* æ¯å¦å卿¸²æçæ ¹èç¹
*/
isNullNode?: boolean;
/**
* ç»ä»¶æ æè¿°ä¿¡æ¯
*/
descriptor?: string;
/**
* åµå¥æ§å¶ï¼é²æ¢é误çèç¹åµå¥
* æ¯å¦ a åµå¥ a, FormField åªè½å¨ Form 容å¨ä¸ï¼Column åªè½å¨ Table ä¸ç
*/
nestingRule?: NestingRule;
/**
* æ¯å¦æ¯æå°æ¸²æåå
* æå°æ¸²æåå
ä¸çç»ä»¶æ¸²æåæ´æ°é½ä»åå
çæ ¹èç¹å¼å§æ¸²æåæ´æ°ã妿åµå¥äºå¤å±æå°æ¸²æåå
ï¼æ¸²æä¼ä»æå¤å±çæå°æ¸²æåå
å¼å§æ¸²æã
*/
isMinimalRenderUnit?: boolean;
/**
* ç»ä»¶é䏿¡ç cssSelector
*/
rootSelector?: string;
/**
* ç¦ç¨çè¡ä¸ºï¼å¯ä»¥ä¸º `'copy'`, `'move'`, `'remove'` æå®ä»¬ç»æçæ°ç»
*/
disableBehaviors?: string[] | string;
/**
* ç¨äºè¯¦ç»é
ç½®ä¸è¿°æä½é¡¹çå
容
*/
actions?: ComponentAction[];
}
export interface Advanced {
/**
* @todo å¾
è¡¥å
ææ¡£
*/
context?: { [contextInfoName: string]: any };
/**
* @todo å¾
è¡¥å
ææ¡£
*/
view?: ComponentType<any>;
/**
* @todo å¾
è¡¥å
ææ¡£
*/
transducers?: any;
/**
* @todo å¾
è¡¥å
ææ¡£
*/
filters?: FilterItem[];
/**
* @todo å¾
è¡¥å
ææ¡£
*/
autoruns?: AutorunItem[];
/**
* é
ç½® callbacks 坿è·å¼ææåºçä¸äºäºä»¶ï¼ä¾å¦ onNodeAddãonResize ç
*/
callbacks?: Callbacks;
/**
* æå
¥å®¹å¨æ¶ï¼èªå¨å¸¦å
¥ children å表
*/
initialChildren?: NodeData[] | ((target: IPublicModelSettingField) => NodeData[]);
/**
* @todo å¾
è¡¥å
ææ¡£
*/
isAbsoluteLayoutContainer?: boolean;
/**
* @todo å¾
è¡¥å
ææ¡£
*/
hideSelectTools?: boolean;
/**
* æ ·å¼ å ä½ç½®ï¼handleä¸å¿
é¡»ææç¡®çæ è¯ä»¥ä¾¿äºä»¶è·¯ç±å¤æï¼æè
主å¨è®¾ç½®äºä»¶ç¬å 模å¼
* NWSE æ¯äº¤ç»å¼æè®¡ç®æ¾ç½®ä½ç½®ï¼ReactElement å¿
é¡»èªå·±æ§å¶åå§ä½ç½®
*/
/**
* ç¨äºé
置设计å¨ä¸ç»ä»¶ resize æä½å·¥å
·çæ ·å¼åå
容
* - hover æ¶æ§å¶æé«äº®
* - mousedown æ¶è¯·æ±ç¬å
* - dragstart 请æ±éç¨ resizing æ§å¶ è¯·æ± hud æ¾ç¤º
* - drag æ¶ è®¡ç®å¹¶è®¾ç½®ææï¼æ´æ°æ§å¶æä½ç½®
*/
getResizingHandlers?: (
currentNode: any,
) => (
| Array<{
type: 'N' | 'W' | 'S' | 'E' | 'NW' | 'NE' | 'SE' | 'SW';
content?: ReactElement;
propTarget?: string;
appearOn?: 'mouse-enter' | 'mouse-hover' | 'selected' | 'always';
}>
| ReactElement[]
);
/**
* Live Text Editingï¼å¦æ children å
容æ¯çº¯ææ¬ï¼æ¯æåå»ç´æ¥ç¼è¾
*/
liveTextEditing?: LiveTextEditingConfig[];
}
export interface Configure {
/**
* 屿§é¢æ¿é
ç½®
*/
props?: ConfigureProp[];
/**
* ç»ä»¶è½åé
ç½®
*/
component?: ConfigureComponent;
/**
* éç¨æ©å±é¢æ¿æ¯ææ§é
ç½®
*/
supports?: ConfigureSupport;
/**
* é«çº§ç¹æ§é
ç½®
*/
advanced?: Advanced;
}
export interface Snippet {
/**
* ç»ä»¶åç±»title
*/
title?: string;
/**
* snippet æªå¾
*/
screenshot?: string;
/**
* snippet ææ
*
* @deprecated ææªä½¿ç¨
*/
label?: string;
/**
* å¾
æå
¥ç schema
*/
schema?: NodeSchema;
}
export interface ComponentDescription { // ç»ä»¶æè¿°åè®®ï¼éè¿ npm ä¸ç exportName 对åºå° package
componentName: string;
title: string;
description?: string;
docUrl: string;
screenshot: string;
icon?: string;
tags?: string[];
keywords?: string[];
devMode?: 'proCode' | 'lowCode';
npm: Npm;
props: Prop[];
configure: Configure;
snippets: Snippet[];
group: string;
category: string;
priority: number;
}
2.2.3 èµäº§å åè®®â
2.2.3.1 åè®®ç»æâ
åè®®æé¡¶å±ç»æå¦ä¸ï¼å å« 5 æ¹é¢çæè¿°å 容ï¼
- version { String } å½ååè®®çæ¬å·
- packages{ Array } ä½ä»£ç ç¼è¾å¨ä¸å è½½çèµæºå表
- components { Array } ææç»ä»¶çæè¿°åè®®å表
- sort { Object } ç¨äºæè¿°ç»ä»¶é¢æ¿ä¸ç tab å category
2.2.3.2 version (A)â
å®ä¹å½ååè®® schema ççæ¬å·ï¼
| æ ¹å±æ§åç§° | ç±»å | 说æ | å鿝æ | é»è®¤å¼ |
|---|---|---|---|---|
| version | String | åè®®çæ¬å· | - | 1.0.0 |
2.2.3.3 packages (A)â
å®ä¹ä½ä»£ç ç¼è¾å¨ä¸å è½½çèµæºå表ï¼å å«å ¬å ±åºåç»ä»¶ (åº) cdn èµæºçï¼
| åæ®µ | åæ®µæè¿° | åæ®µç±»å | 夿³¨ |
|---|---|---|---|
| packages[].title? (A) | èµæºæ é¢ | String | èµæºæ é¢ |
| packages[].package (A) | npm å å | String | ç»ä»¶èµæºå¯ä¸æ è¯ |
| packages[].version(A) | npm å çæ¬å· | String | ç»ä»¶èµæºçæ¬å· |
| packages[].library(A) | ä½ä¸ºå ¨å±åéå¼ç¨æ¶çåç§°ï¼ç¨æ¥å®ä¹å ¨å±åéå | String | ä½ä»£ç 弿éè¿è¯¥å段è·åç»ä»¶å®ä¾ |
| packages[].editUrls (A) | ç»ä»¶ç¼è¾æè§å¾æå åç CDN url å表ï¼å å« js å css | Array\<String> | ä½ä»£ç 弿ç¼è¾å¨ä¼å è½½è¿äº url |
| packages[].urls (AA) | ç»ä»¶æ¸²ææè§å¾æå åç CDN url å表ï¼å å« js å css | Array\<String> | ä½ä»£ç å¼ææ¸²ææ¨¡åä¼å è½½è¿äº url |
æè¿°ä¸¾ä¾ï¼
{
"packages": [
{
"package": "moment",
"version": "2.24.0",
"urls": [
"https://g.alicdn.com/mylib/moment/2.24.0/min/moment.min.js"
],
"library": "moment"
},
{
"package": "lodash",
"library": "_",
"urls": [
"https://g.alicdn.com/platform/c/lodash/4.6.1/lodash.min.js"
]
},
{
"title": "fusion ç»ä»¶åº",
"package": "@alifd/next",
"version": "1.24.18",
"urls": [
"https://g.alicdn.com/code/lib/alifd__next/1.24.18/next.min.css",
"https://g.alicdn.com/code/lib/alifd__next/1.24.18/next-with-locales.min.js"
],
"library": "Next"
},
{
"package": "@alilc/lowcode-materials",
"version": "1.0.0",
"library": "AlilcLowcodeMaterials",
"urls": [
"https://alifd.alicdn.com/npm/@alilc/lowcode-materials@1.0.0/dist/AlilcLowcodeMaterials.js",
"https://alifd.alicdn.com/npm/@alilc/lowcode-materials@1.0.0/dist/AlilcLowcodeMaterials.css"
],
"editUrls": [
"https://alifd.alicdn.com/npm/@alilc/lowcode-materials@1.0.0/build/lowcode/view.js",
"https://alifd.alicdn.com/npm/@alilc/lowcode-materials@1.0.0/build/lowcode/view.css"
]
},
{
"package": "@alifd/fusion-ui",
"version": "1.0.0",
"library": "AlifdFusionUi",
"urls": [
"https://alifd.alicdn.com/npm/@alifd/fusion-ui@1.0.0/build/lowcode/view.js",
"https://alifd.alicdn.com/npm/@alifd/fusion-ui@1.0.0/build/lowcode/view.css"
],
"editUrls": [
"https://alifd.alicdn.com/npm/@alifd/fusion-ui@1.0.0/build/lowcode/view.js",
"https://alifd.alicdn.com/npm/@alifd/fusion-ui@1.0.0/build/lowcode/view.css"
]
}
]
}
2.2.3.4 components (A)â
å®ä¹ææç»ä»¶çæè¿°åè®®å表ï¼ç»ä»¶æè¿°åè®®éµå¾ªæ¬è§èç« è 2.2.2 çå®ä¹ï¼
2.2.3.5 sort (A)â
å®ä¹ç»ä»¶å表åç»
| æ ¹å±æ§åç§° | ç±»å | 说æ | å鿝æ | é»è®¤å¼ |
|---|---|---|---|---|
| sort.groupList | String[] | ç»ä»¶åç»ï¼ç¨äºç»ä»¶é¢æ¿ tab å±ç¤º | - | ['ç²¾éç»ä»¶', 'ååç»ä»¶'] |
| sort.categoryList | String[] | ç»ä»¶é¢æ¿ä¸åä¸ä¸ª tab ä¸çä¸ååºé´ç¨ category åºåï¼category çæåºä¾ç § categoryList é¡ºåºæå | - | ['éç¨', 'æ°æ®å±ç¤º', 'è¡¨æ ¼ç±»', '表åç±»'] |
2.2.3.6 TypeScript å®ä¹â
export interface ComponentSort {
groupList?: String[]; // ç¨äºæè¿°ç»ä»¶é¢æ¿ç tab 项åå
¶æåºï¼ä¾å¦ï¼["ç²¾éç»ä»¶", "ååç»ä»¶"]
categoryList?: String[]; // ç»ä»¶é¢æ¿ä¸åä¸ä¸ª tab ä¸çä¸ååºé´ç¨ category åºåï¼category çæåºä¾ç
§ categoryList é¡ºåºæåï¼
}
export interface Assets {
version: string; // èµäº§å
åè®®çæ¬å·
packages?: Array<Package>; // 大å
å表ï¼externalä¸packageçæ¦å¿µç¸ä¼¼ï¼èåå¨ä¸èµ·
components: Array<ComponentDescription> | Array<RemoteComponentDescription>; // ææç»ä»¶çæè¿°åè®®å表
componentList?: ComponentCategory[]; // ãå¾
åºå¼ãç»ä»¶åç±»å表ï¼ç¨æ¥æè¿°ç©æé¢æ¿
sort: ComponentSort; // æ°å¢å段ï¼ç¨äºæè¿°ç»ä»¶é¢æ¿ä¸ç tab å category
}
export interface RemoteComponentDescription {
exportName: string; // ç»ä»¶æè¿°å¯¼åºååï¼å¯ä»¥éè¿ window[exportName] è·åå°ç»ä»¶æè¿°ç Object å
容ï¼
url: string; // ç»ä»¶æè¿°çèµæºé¾æ¥ï¼
package: { // ç»ä»¶(åº)ç npm ä¿¡æ¯ï¼
npm: string;
}
}
3 ç©æè§è - åºåè§èâ
3.1 æºç è§èâ
è±æ block, å¯å¤ç¨ç代ç çæ®µï¼æ¯ä¸ªåºå对åºä¸ä¸ª npmã
3.1.1 ç®å½ (A)â
block/
âââ build
â  âââ index.css // ãç¼è¯çæã
â âââ index.html // ãç¼è¯çæããå¿
éãå¯ç´æ¥é¢è§æä»¶
â  âââ index.js // ãç¼è¯çæã
â  âââ views // ã3A ç¼è¯çæãhtml2sketch
â  âââ block_view1.html // ã3A ç¼è¯çæãç» sketch ç¨ç html
â  âââ block_view1.png // ã3A ç¼è¯çæãæªå¾
âââ src // ãå¿
éãåºåæºç
â âââ index.jsx // ãå¿
éãå
¥å£
â âââ index.module.scss // ãå¯éãå¦ææ ·å¼è¯·ä½¿ç¨ CSS Modules é¿å
å²çª
âââ README.md // ãå¯éãæ æ ¼å¼è¦æ±
âââ package.json // ãå¿
éã
3.1.2 package.json (A)â
{
"name": "",
"version": "",
"description": "",
"files": ["src/", "build/", "screenshot.png"],
"blockConfig": {
"name": "user-landing",
"title": "ç¨æ·æ¬¢è¿ä¿¡æ¯",
"category": "form",
"screenshot": "https://unpkg.com/@icedesign/user-landing-block/screenshot.png"
}
}
3.1.3 html2sketch (3A)â
3.1.3.1 package.json å blockConfig ç»æâ
{
"blockConfig": {
"name": "user-landing",
"title": "ç¨æ·æ¬¢è¿ä¿¡æ¯",
"category": "form",
"screenshot": "https://unpkg.com/@icedesign/user-landing-block/screenshot.png",
"views": [{ // åºåè§å¾ï¼é
ç½®æ¤é¡¹åä¼è¿å
¥ fusion cool
"title": "è§å¾ 1 æ é¢", // åºåè§å¾æ é¢
"props": { // åºåæ¯æç props
"type": "primary"
},
"screenshot": "build/views/block_view1.png", // ãç¼è¯èªå¨å¡«å
ãè§å¾æªå¾ï¼ä¼å¨ build æ¶èªå¨çæ
"html": "build/views/block_view1.html", // ãç¼è¯èªå¨å¡«å
ãè§å¾æ¸²æå html ç»æï¼ä¼å¨ build æ¶èªå¨çæ
},{
"title": "è§å¾ 2 æ é¢", // åºåè§å¾æ é¢
"props": { // åºåæ¯æç props
"type": "sencondary"
},
"screenshot": "build/views/block_view2.png", // ãç¼è¯èªå¨å¡«å
ãè§å¾æªå¾ï¼ä¼å¨ build æ¶èªå¨çæ
"html": "build/views/block_view2.html", // ãç¼è¯èªå¨å¡«å
ãè§å¾æ¸²æå html ç»æï¼ä¼å¨ build æ¶èªå¨çæ
}]
}
}
3.2 ä½ä»£ç è§èâ
ç±ä¸å¡ç»ä»¶ãå¸å±ç»ä»¶è¿è¡åµå¥ç»åèæãä¸å¯¹å¤æä¾å¯é ç½®ç屿§ãå¯éè¿åºå容å¨ç»ä»¶çå 裹ï¼å®ç°å®¹å¨å é¨å ·å¤æå®æ´çæ ·å¼ãäºä»¶ãçå½å¨æç®¡çãç¶æç®¡çãæ°æ®æµè½¬æºå¶ãè½ç¬ç«åå¨åè¿è¡ï¼å¯å®ç°è·¨é¡µé¢ãè·¨åºç¨çå¿«éå¤ç¨ï¼ä¿éåè½åæ°æ®çæ£å¸¸ã
| æ ¹å±æ§æè¿° | 说æ | ç±»å |
|---|---|---|
| version | åè®®çæ¬å· | String |
| componentsMap | æè¿°ç»ä»¶æ å°å ³ç³»çéå | Array |
| componentsTree | åºåç»ä»¶æ æè¿°ï¼é¡¶å±ä¸éå®ç»ä»¶ç±»å | Array |
| utils | å·¥å ·ç±»æ©å±æ å°å ³ç³» | Array |
| i18n | å½é åè¯æ | Object |
æè¿°ä¸¾ä¾ 1ï¼
{
"version": "1.0.0",
"componentsMap": [{ }],
"componentsTree": [{ // åºåç»ä»¶æ ï¼é¡¶å±ç±åºå容å¨ç»ä»¶å
裹ï¼
"componentName": "Block", // åºå容å¨ç»ä»¶å
"fileName": "block1", // åºåå®¹å¨ 1
"props": {},
"css": "body {font-size: 12px;}",
"state": {
"name": "lucy"
},
"children": [{
"componentName": "Div",
"props": {
"className": "className1"
},
"children": [{
"componentName": "Button",
"props": {
"text": "ç¹å»å¼¹åºæçå§å",
"onClick": {
"type": "JSFunction",
"value": "function(e){\
alert(this.state.name)\
}"
}
}
}]
}]
}],
"i18n": { }
}
æè¿°ä¸¾ä¾ 2ï¼
{
"version": "1.0.0",
"componentsMap": [{ }],
"componentsTree": [{ //åºåç»ä»¶æ ï¼ç±æ®éç»ä»¶æè¿°ç»åèæï¼æ åºå容å¨
"componentName": "Input",
"props": {
"placeholder": "请è¾å
¥æç´¢å
³é®è¯"
},
}, {
"componentName": "Button",
"props": {
"text": "æç´¢",
"onClick": {
"type": "JSFunction",
"value": "\
// some comments \
function(e){\
//...\
}"
}
}
}],
"i18n": { }
}
4 ç©æè§è - 模æ¿è§èâ
4.1 æºç è§èâ
4.1.1 ç®å½è§èï¼Aï¼â
䏿 åæºç build-scripts 对é½
âââ META/ # ä½ä»£ç å
æ°æ®ä¿¡æ¯ï¼ç¨äºå¤åæ¯å²çªè§£å³ãæ°æ®åæ»çåè½
âââ build
â  âââ index.css # ãç¼è¯çæã
â âââ index.html # ãç¼è¯çæããå¿
éãå¯ç´æ¥é¢è§æä»¶
â  âââ index.js # ãç¼è¯çæã
â  âââ views # ã3A ç¼è¯çæãhtml2sketch
â  âââ page1.html # ã3A ç¼è¯çæãç» sketch ç¨ç html
â  âââ page1.png # ã3A ç¼è¯çæãæªå¾
âââ public/ # éææä»¶ï¼æå»ºæ¶ä¼ copy å° build/ ç®å½
â âââ index.html # åºç¨å
¥å£ HTML
â âââ favicon.png # Favicon
âââ src/
â âââ components/ # åºç¨å
çä½ä»£ç ä¸å¡ç»ä»¶
â â âââ GuideComponent/
â â âââ index.js # ç»ä»¶å
¥å£
â â âââ components.js # ç»ä»¶ä¾èµçå
¶ä»ç»ä»¶
â â âââ schema.js # schema æè¿°
â â âââ index.scss # css æ ·å¼
â âââ pages/ # 页é¢
â â âââ HomePage/ # Home 页é¢
â â âââ index.js # 页é¢å
¥å£
â â âââ index.scss # css æ ·å¼
â âââ layouts/
â â âââ BasicLayout/ # layout ç»ä»¶åç§°
â â âââ index.js # layout å
¥å£
â â âââ components.js # layout ç»ä»¶ä¾èµçå
¶ä»ç»ä»¶
â â âââ schema.js # layout schema æè¿°
â â âââ index.scss # layout css æ ·å¼
â âââ config/ # é
置信æ¯
â â âââ components.js # åºç¨ä¸ä¸æææç»ä»¶
â â âââ routes.js # 页é¢è·¯ç±å表
â â âââ constants.js # å
¨å±å¸¸éå®ä¹
â â âââ app.js # åºç¨é
ç½®æä»¶
â âââ utils/ # å·¥å
ጼ
â â âââ index.js # åºç¨ç¬¬ä¸æ¹æ©å±å½æ°
â âââ stores/ # [å¯é] å
¨å±ç¶æç®¡ç
â â âââ user.js
â âââ locales/ # [å¯é] å½é
åèµæº
â â âââ en-US
â â âââ zh-CN
â âââ global.scss # å
¨å±æ ·å¼
â âââ index.jsx # åºç¨å
¥å£èæ¬ï¼ä¾èµ config/routes.js çè·¯ç±é
ç½®å¨æçæè·¯ç±ï¼
âââ webpack.config.js # 项ç®å·¥ç¨é
ç½®ï¼å
嫿件é
ç½®åèªå®ä¹ `webpack` é
ç½®ç
âââ README.md
âââ package.json
âââ .editorconfig
âââ .eslintignore
âââ .eslintrc.js
âââ .gitignore
âââ .stylelintignore
âââ .stylelintrc.js
å ¥å£æä»¶â
(/src/index.jsx)
import React from 'react';
import ReactDOM from 'react-dom';
import { hot } from 'react-hot-loader/root';
import pkg from '../package.json';
import router from './router';
import './index.scss';
const App = hot(router);
ReactDOM.render(<App />, document.getElementById(pkg.config && pkg.config.targetRootID || 'root'));
åºç¨åæ°é ç½®æä»¶â
(/src/config/app.js)
- æ¯æé
ç½®è·¯ç±æ¹å¼ï¼historyMode
- æ¯æ 2 ç§è·¯ç±æ¹å¼ï¼
- æµè§å¨è·¯ç±ï¼browser
- åå¸è·¯ç±ï¼hash
- æ¯æéä¼ è·¯ç±äº§ççåæ°å°ææç»ä»¶çä¸ä¸æ this 对象ä¸
- history 对象ï¼this.history
- location 对象ï¼this.location
- æ¯æå ç½® query åæ°çè§£æï¼this.location.query
- match 对象ï¼this.match
- æ¯æ 2 ç§è·¯ç±æ¹å¼ï¼
- æ¯ææ¸²æçç®æ èç¹ IDï¼targetRootID
- æ¯æé ç½®åºç¨ç fusion 主é¢é£æ ¼ï¼theme
- æ¯æé ç½® layout çç»ä»¶åç§°å屿§é ç½®ï¼layout
- æ¯æé ç½®æ¸²ææ¨¡åçæ¬å·ï¼sdkVersion
- æ¯æé ç½®åºå®ä¾èµç»ä»¶å表ï¼compDependencies
export default {
"sdkVersion": "1.0.3",
"historyMode": "hash", // æµè§å¨è·¯ç±ï¼browser åå¸è·¯ç±ï¼hash
"targetRootID": "ice-container",
"layout": {
"componentName": "BasicLayout",
"props": {},
},
"theme": {
"package": "@alife/theme-fusion",
"version": "^0.1.0"
},
"compDependencies": []
}
åºç¨æ©å±é ç½®è§èï¼â
(/src/utils/index.js)
- æ¯æ npm å ç¬¬ä¸æ¹æ©å±ï¼
- æ¯æåºç¨èå´çèªå®ä¹æ©å±å½æ°ï¼
import { Message, Dialog } from '@alifd/next';
import moment from 'moment';
export default {
Message, // npm å
ä¾èµ
Dialog,
moment,
xxx: function(item) { // èªå®ä¹å½æ°
return ...
}
}
åºç¨å¸¸éé ç½®â
(/src/config/constants.js)
export default {
"ISIDE": false
}
åºç¨æ ·å¼é ç½®â
(/src/global.scss)
a {
color: #2077ff;
text-decoration: none;
}
.transparent {
opacity: 0;
}
4.1.2 html2sketch (AAA)â
4.1.2.1 package.json å scaffoldConfig ç»æâ
{
"scaffoldConfig": {
"name": "user-landing",
"title": "ç¨æ·æ¬¢è¿ä¿¡æ¯",
"category": "form",
"screenshot": "https://unpkg.com/@icedesign/user-landing-block/screenshot.png",
"views": [{ // 模æ¿è§å¾ï¼é
ç½®æ¤é¡¹åä¼è¿å
¥ fusion cool
"title": "è§å¾ 1 æ é¢", // 模æ¿è§å¾æ é¢
"path": "#/dashboard/monitor", // 读åè·¯ç±å表çæï¼hash è·¯ç±å¿
é¡»å #
"screenshot": "build/views/page0.png", // ãç¼è¯èªå¨å¡«å
ãè§å¾æªå¾ï¼ä¼å¨ build æ¶èªå¨çæ
"html": "build/views/page0.html", // ãç¼è¯èªå¨å¡«å
ãè§å¾æ¸²æå html ç»æï¼ä¼å¨ build æ¶èªå¨çæ
},{
"title": "è§å¾ 2 æ é¢", // åºåè§å¾æ é¢
"path": "#/dashboard/list", // 读åè·¯ç±å表çæï¼hash è·¯ç±å¿
é¡»å #
"screenshot": "build/views/page1.png", // ãç¼è¯èªå¨å¡«å
ãè§å¾æªå¾ï¼ä¼å¨ build æ¶èªå¨çæ
"html": "build/views/page1.html", // ãç¼è¯èªå¨å¡«å
ãè§å¾æ¸²æå html ç»æï¼ä¼å¨ build æ¶èªå¨çæ
}]
}
}