React 是由FB开发的一款高性能的前端渲染框架。我们在公司的内部项目中也开始采用React 来替换原有的开发框架。由于前端资源不足,所以自告奋勇提出由自己来完成一部分的前端工作,从此开始接触到React.
由于我也是刚接触到React, 所以这一篇不讲(其实是讲不出来)什么原理性的东西,只是把我这几天用React 碰到的一些问题给记录下。
首先是推荐一款优秀的前端组件库: antd
。是由蚂蚁金服的同学发起并维护的。官网地址。整体设计非常简洁,模块化,用起来非常容易上手。
碰到的第一个问题其实也跟 antd
相关,在表单中使用了表单的 getFieldProps
属性。刚开始也是瞎蒙的,看着示例代码就开搞。在使用了这个属性的同时又设置了 onChange 属性。 如下:
<Select {...getFieldProps('componentId', {
initialValue: (PageData.create && PageData.create.id) ? PageData.create.componentId : '',
rules: [
{required: true, message: '请选择组件实例分类'},
],
)} onChange={this.handleComponentChange}>
{
this.props.componentDatas.map((o, n)=>{return (
<Option value={'' + o.id} key={n}>{o.name}</Option>
)})
}
</Select>
测试过程中碰到的问题就是死活无法选中下拉框中的选项,但是事件又触发了。去掉onChange
属性能够选中选项,但没法处理事件。检查文档发现 getFieldProps
已经包含了id
value
ref
onChange
属性,不能重复设置属性。 所以正确的做法是在 getFieldProps
中指定时间处理函数。
第二个问题跟CodeMirror相关。项目中需要编辑代码,自然想到就是将CodeMirror引入到项目中来。搜索后发现react-codemirror 还不错,就引入到项目中。第一次尝试很成功一次就过,但是当同一个页面中出现多个CodeMirror 的实例时会出现 状态变化后, 只有最底下的一个实例能够响应状态的变更。这个显然不是我想要的结果。GitHub 项目中的 issue 是个好东西,你碰到过的问题肯定有其他人也碰到过。该项目的
issue #46 issue #47 issue #49都提到了这个问题。 这个问题的原因就是 componentWillReceiveProps
这个方法被 debounce
后变成异步执行的了,所有只会有最后一个实例才会收到状态变更的消息。
解决办法就是将 componentWillReceiveProps
改为同步执行的。目前作者还没有修复这个问题,只能在代码中通过重写这个方法来完成。具体的实现参见 解决方案
两个问题都不是什么大问题,但是从发现问题到解决问题还是花费了我不少的时间。三个解决问题的经验:
- 查看文档。文档中通常都会详细的说明一些需要特殊注意的场景,而这些场景往往就是出问题的地方。
- 如果是开源项目,那就先检查 issues 中是否已经有过类似的问题了。看是不是可以通过升级版本解决问题。
- 再不行的话只能通过万能的 Google 了,前提是要能科学上网。