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.
115 lines
2.5 KiB
115 lines
2.5 KiB
2 years ago
|
# 组件生命周期与Model状态控制
|
||
|
|
||
|
新接触FineUI的人很容易搞不清组件生命周期,写出不恰当的状态控制代码
|
||
|
|
||
|
## 误区:在mounted的时候异步初始化数据
|
||
|
|
||
|
举一个常见的例子: 下面的书写形式,在组件mounted之后再去发送请求初始化状态,而后由watch调用组件的setSelected方法修改状态
|
||
|
|
||
|
这样有什么不好吗? 首先请求过慢的话会导致switch开关闪一下,其次mounted之后再修改组件会导致无谓的回流重绘
|
||
|
|
||
|
```javascript
|
||
|
class Model extends Model {
|
||
|
state() {
|
||
|
return {
|
||
|
clusterOpen: false
|
||
|
};
|
||
|
}
|
||
|
|
||
|
actions = {
|
||
|
initConfig: () => {
|
||
|
// res
|
||
|
return Promise.resolve(() => {
|
||
|
this.model.clusterOpen = res.clusterOpen;
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
class Widget extends BI.Widget {
|
||
|
|
||
|
watch = {
|
||
|
clusterOpen: b => this.switch.setSelected(b)
|
||
|
};
|
||
|
|
||
|
mounted() {
|
||
|
this.store.initConfig();
|
||
|
}
|
||
|
|
||
|
render() {
|
||
|
return {
|
||
|
type: "bi.switch",
|
||
|
selected: false
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
恰当的方式是对需要初始化配置的场景采用异步组件形式,在`beforeRender`生命周期中做好状态获取,在组件被挂载到DOM上之前完成组件控制
|
||
|
|
||
|
这期间也可以根据需要做loading与loaded处理.
|
||
|
|
||
|
```javascript
|
||
|
class Model extends Model {
|
||
|
state() {
|
||
|
return {
|
||
|
clusterOpen: false
|
||
|
};
|
||
|
}
|
||
|
|
||
|
actions = {
|
||
|
initConfig: () => {
|
||
|
// res
|
||
|
return Promise.resolve(() => {
|
||
|
this.model.clusterOpen = res.clusterOpen;
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
class Widget extends BI.Widget {
|
||
|
|
||
|
beforeRender() {
|
||
|
return this.store.initConfig();
|
||
|
}
|
||
|
|
||
|
render() {
|
||
|
return {
|
||
|
type: "bi.switch",
|
||
|
selected: this.model.clusterOpen
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## 在初始化state的时候可以直接根据options来
|
||
|
|
||
|
封装一个独立的组件的时候,组件内部用到了model,有时候需要把外部传来的props用做初始状态
|
||
|
|
||
|
```javascript
|
||
|
class Model extends Model {
|
||
|
state() {
|
||
|
const { clusterOpen } = this.options;
|
||
|
return {
|
||
|
clusterOpen: clusterOpen
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@store(Model, {
|
||
|
props: () => {
|
||
|
return {
|
||
|
clusterOpen: this.options.clusterOpen
|
||
|
};
|
||
|
}
|
||
|
})
|
||
|
class Widget extends BI.Widget {
|
||
|
render() {
|
||
|
return {
|
||
|
type: "bi.switch",
|
||
|
selected: false
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
```
|