使用redux-thunk时,更新state组件没有重新渲染(render)
2017-11-07 18:58
330 查看
之前使用redux-thunk异步访问服务器时,发现state更新了,组件却并没有重新渲染,和以前的代码对照了很久之后,发现原因在于偷懒没写status。
在异步action对应的reducer里面,除了改变相应state之外,还应该改变status,明确的告诉组件数据获取到了,状态树和以前不同了,再进行重新渲染。
使用redux-thunk的正确姿势举例如下:
博主也是刚接触react,如有错误请在评论区中指出,谢谢啦~
在异步action对应的reducer里面,除了改变相应state之外,还应该改变status,明确的告诉组件数据获取到了,状态树和以前不同了,再进行重新渲染。
使用redux-thunk的正确姿势举例如下:
//actionType.js const GET_FM_STARTED = 'FM/GET_STAETED'; const GET_FM_SUCCESS = 'FM/GET_SUCCESS'; const GET_FM_FAILURE = 'FM/GET_FAILURE';
//status.js const Status = { LOADING: 'loading', SUCCESS: 'success', FAILURE: 'failure' }
//action.js const getFMStarted = () => ({ type: GET_FM_STARTED }); const getFMSuccess = (result, areaUid) => { result = JSON.parse(result); result.data = eval(result.data); return { type: GET_FM_SUCCESS, result: result, areaUid: areaUid } }; const getFMFailure = (error) => ({ type: GET_FM_FAILURE, error }); let FMNextId = 0; const getFM = (areaUid) => { return (dispatch) => { const url = `/Area/GetFlowMeterByAreaUid?areaUid=${areaUid}`; //(Guid areaUid)` const seqId = ++FMNextId; const dispatchIfVaild = (action) => { if (seqId === FMNextId) { return dispatch(action); } } dispatchIfVaild(getFMStarted()); fetch(url).then((response) => { if (response.status !== 200) { throw new Error('Fail to get response with status ' + response.status); } response.json().then((responseJson) => { dispatchIfVaild(getFMSuccess(responseJson, areaUid)); }).catch((error) => { console.error(error); dispatchIfVaild(getFMFailure(error)); }); }).catch((error) => { console.log(error); dispatchIfVaild(getFMFailure(error)); }) }; }
//Components/Card.js class Card extends React.Component { constructor(props) { super(props); } render() { const { status, warn, header } = this.props; if (!warn) { return null; } console.log(status); let content = null; switch (status) { case Status.LOADING: { content = <h3>信息加载中...</h3>; break; } case Status.SUCCESS: { content = this.props.children; break; } case Status.FAILURE: { content = <h3>信息加载失败,请重试</h3>; break; } case 'init': { content = <h3>{this.props.init || '信息加载中...' }</h3>; } default: { content = <h3>{this.props.init || '信息加载中...'}</h3>; //throw new Error('unexpected status ' + status); } } return ( <div className="devices"> <article className="ibox"> <header className="ibox-title"> <Header header={header} /> </header> <article className='ibox-content'> {content} </article> </article> </div > ); } }
博主也是刚接触react,如有错误请在评论区中指出,谢谢啦~
相关文章推荐
- D3D中设置渲染SetRenderState()使用
- 刷新组件RENDER(重新渲染)的三种方式详解
- 【React Native】刷新组件RENDER(重新渲染)的三种方式详解
- 【REACT NATIVE 系列教程之四】刷新组件RENDER(重新渲染)的三种方式详解
- Cocos2d-x--Box2D使用GLES-Render.h渲染查看刚体
- 使用RCP组件实现程序在线升级更新
- 安卓四大组件使用过程碰到的问题汇总-不定时更新
- js中使用getElementsByTagName,getElementsById等获取html元素失败,没有获取到,很有可能是页面还没有渲染完就去获取了
- React第三方组件5(状态管理之Redux的使用⑤异步操作)
- 编写组件,使用JavaScript更新UpdatePanel (转载)
- SetRenderState 设置渲染状态
- .net服务器没有COM+组件情况下使用NOPI和MyXls导入导出excel
- Reactjs开发自制编程语言Monkey的编译器:使用组件的state机制实现屏幕取词
- VC++ ComboBox组件使用大全(不断更新中)
- 在组件使用react-router,和redux的注意事项
- redux中间件之redux-thunk的具体使用
- android使用notifyDataSetChanged()方法,adapter的数据更新了,但是ListView的内容没有更新;
- 使用git pull时,项目没有更新?
- ReactDom.render调用后没有渲染
- IIS网站问题-内部服务器错误-没有权限查看该目录或页-必须使用一个可更新的查询