You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
4.6 KiB
167 lines
4.6 KiB
2 years ago
|
有了响应式,我们在开发组件的时候也可以体验到数据双向绑定.省去了进行状态控制需要额外定义store的流程
|
||
|
|
||
|
类似于Fix.Model, 我们约定state属性用来保存状态,在beforeCreate生命周期中定义.
|
||
|
|
||
|
```js
|
||
|
|
||
|
const Pager = BI.inherit(BI.Widget, {
|
||
|
props: {
|
||
|
total: 1,
|
||
|
page: 1,
|
||
|
},
|
||
|
|
||
|
beforeCreate: function () {
|
||
|
this.state = Fix.define({
|
||
|
currentPage: this.options.page,
|
||
|
total: this.options.total,
|
||
|
});
|
||
|
},
|
||
|
|
||
|
render: function () {
|
||
|
|
||
|
return {
|
||
|
type: "bi.vertical_adapt",
|
||
|
columnSize: [24, 24, "fill", "", 24, 24],
|
||
|
hgap: 5,
|
||
|
items: [
|
||
|
{
|
||
|
type: "bi.icon_button",
|
||
|
cls: "pre-page-h-font",
|
||
|
disabled: () => {
|
||
|
return this.state.currentPage === 1;
|
||
|
},
|
||
|
handler: () => {
|
||
|
this.state.currentPage = 1;
|
||
|
this.fireEvent("EVENT_CHANGE", this.getValue());
|
||
|
},
|
||
|
}, {
|
||
|
type: "bi.icon_button",
|
||
|
cls: "pre-page-h-font",
|
||
|
disabled: () => {
|
||
|
return this.state.currentPage === 1;
|
||
|
},
|
||
|
handler: () => {
|
||
|
this.state.currentPage--;
|
||
|
this.fireEvent("EVENT_CHANGE", this.getValue());
|
||
|
},
|
||
|
}, {
|
||
|
type: "bi.text_editor",
|
||
|
ref: ref => this.editor = ref,
|
||
|
value: () => this.state.currentPage,
|
||
|
validationChecker: (v) => (BI.parseInt(v) >= 1) && (BI.parseInt(v) <= this.state.total),
|
||
|
errorText: "error",
|
||
|
listeners: [
|
||
|
{
|
||
|
eventName: "EVENT_CHANGE",
|
||
|
action: () => {
|
||
|
this.state.currentPage = BI.parseInt(this.editor.getValue());
|
||
|
this.fireEvent("EVENT_CHANGE", this.getValue());
|
||
|
},
|
||
|
},
|
||
|
],
|
||
|
}, {
|
||
|
type: "bi.label",
|
||
|
text: () => "/" + this.state.total,
|
||
|
}, {
|
||
|
type: "bi.icon_button",
|
||
|
cls: "next-page-h-font",
|
||
|
disabled: () => {
|
||
|
return this.state.currentPage === this.state.total;
|
||
|
},
|
||
|
handler: () => {
|
||
|
this.state.currentPage++;
|
||
|
this.fireEvent("EVENT_CHANGE", this.getValue());
|
||
|
},
|
||
|
}, {
|
||
|
type: "bi.icon_button",
|
||
|
cls: "next-page-h-font",
|
||
|
disabled: () => {
|
||
|
return this.state.currentPage === this.state.total;
|
||
|
},
|
||
|
handler: () => {
|
||
|
this.state.currentPage = this.state.total;
|
||
|
this.fireEvent("EVENT_CHANGE", this.getValue());
|
||
|
},
|
||
|
},
|
||
|
],
|
||
|
};
|
||
|
},
|
||
|
|
||
|
getValue: function () {
|
||
|
return this.state.currentPage;
|
||
|
},
|
||
|
|
||
|
populate: function () {
|
||
|
this.state.currentPage = this.options.page;
|
||
|
this.state.total = this.options.total;
|
||
|
},
|
||
|
});
|
||
|
|
||
|
BI.shortcut("pager", Pager);
|
||
|
|
||
|
let pager;
|
||
|
|
||
|
BI.createWidget({
|
||
|
type: "bi.vertical",
|
||
|
vgap: 20,
|
||
|
items: [
|
||
|
{
|
||
|
type: "pager",
|
||
|
ref: ref => pager = ref,
|
||
|
height: 24,
|
||
|
width: 250,
|
||
|
total: 100,
|
||
|
page: 2,
|
||
|
}, {
|
||
|
type: "bi.button",
|
||
|
text: "populate",
|
||
|
handler: () => {
|
||
|
pager.attr("total", 500);
|
||
|
pager.attr("page", 400);
|
||
|
pager.populate();
|
||
|
},
|
||
|
},
|
||
|
],
|
||
|
});
|
||
|
|
||
|
```
|
||
|
|
||
|
如果使用的是es6或者typescript开发,那么可以直接定义类的state属性
|
||
|
|
||
|
```javascript
|
||
|
import { shortcut } from "@core";
|
||
|
|
||
|
@shortcut()
|
||
|
export class Steps extends BI.Widget {
|
||
|
|
||
|
static xtype = "steps";
|
||
|
|
||
|
props = {
|
||
|
current: 1,
|
||
|
};
|
||
|
|
||
|
state = Fix.define({
|
||
|
current: 1,
|
||
|
});
|
||
|
|
||
|
beforeCreate() {
|
||
|
this.state.current = this.options.current;
|
||
|
}
|
||
|
|
||
|
render() {
|
||
|
return {
|
||
|
type: "bi.label",
|
||
|
text: () => `第${this.state.current}步`,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
setValue(step) {
|
||
|
return this.state.current = step;
|
||
|
}
|
||
|
|
||
|
getValue() {
|
||
|
return this.state.current;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
```
|