组件在异步数据到来前已经完成初始化,是导致constructor中无法取到所需数据的原因。所以最直接的方法,就是修改组件创建的时间
//把原来的组件内部控制显示
/* <ComponentName show={modelName.show}/> */
//更改为状态直接控制组件是否存在
{
modelName.show && <ComponentName/>
}
//或者
{
modelName.show ? <ComponentName/> : null
}
//或者更严谨一点
//由于项目中加入了用户数据获取失败,需重新登录,所以也就没有加上后面这个
{
modelName.show && modelName.needData && <ComponentName/>
}
目标组件不会在页面加载时就初始化
而是在用户点击控制按钮,需要使用组件时,才初始化
问题and心得:
1.初始化数据是怎么执行的。
2.connect怎么传输数据的。
3.什么时候写全局model,什么时候写局部model。
4.什么时候会是同步,什么时候使用同步。
5.能否使用@connect({sms})来把model层的数据传递到当前组件。通过this.props.sms可以获取到model里sms.js中的state数据)
6.流程:dispatch时候models里面的effect,models中的effect会yield call已经import进来的service里面的action,然后service里面,action会调用request,把url和数据传输给后台,然后在models里面yield完毕后,能获取到responce传过来的数据。
7.model相当于vue的vuex,里面包含了但向数据流的所有的控制
8.在vue中我们一般定义一个全局的头部标题字段,并且在mounted中调dispatch改变,但在dva的model中这段分为了两个部分,其中effects是异步修改数据时调用的, 也就是在react的componentDidMount的生命周期里面需要调用的是异步的effects的action,但如果是用户操作的某个方法是,可以直接调用reducers里面的action
9、注意如果在组件中要调用dispatch的话,必须导入connect,并且注入,才可以调用,不然会报不存在的方法
10、dva规定比较强制,如果你是异步的方法必须调用effects的action,绝对不能调用同步的reducers,否则会报错,但同步的操作可以调用异步的effects,但因为是异步的操作,数据有时不会直接变过来,如果是操作的话,建议用reducers的同步
11.call:执行异步函数(以异步的方式调用函数)
put:发出一个 Action,类似于 dispatch
select:从state中获取相关的数据
take 获取发送的数据
12.需要数据时,是否需要在componentDidMount里面去请求。
13.query是请求的哪儿
14.延迟加载
1.能否使用@connect({sms})来把model层的数据传递到当前组件。通过this.props.sms可以获取到model里sms.js中的state数据)
2.流程:dispatch时候models里面的effect,models中的effect会yield call已经import进来的service里面的action,然后service里面,action会调用request,把url和数据传输给后台,然后在models里面yield完毕后,能获取到responce传过来的数据
@font-face { font-family: "Times New Roman"; }@font-face { font-family: "宋体"; }@font-face { font-family: "Calibri"; }p.MsoNormal { margin: 0pt 0pt 0.0001pt; text-align: justify; font-family: Calibri; font-size: 10.5pt; }span.msoIns { text-decoration: underline; color: blue; }span.msoDel { text-decoration: line-through; color: red; }div.Section0 { }