1、antd手动更新Radio失败?
使用antd组件库Radio,在Form中包裹Radio.Group -> Radio,设置Radio.Group的value为useState的值,该值更新后Radio视图没更新?
const [uploadFileType, setUploadFileType] = useState(DATA_TYPES.SINGLE_BOUT);
setUploadFileType(DATA_TYPES.MULTIPLE_BOUT);
<Form
initialValues={{
['dataType']: DATA_TYPES.SINGLE_BOUT,
}}
>
<Form.Item
name="dataType"
label="数据类型"
>
<Radio.Group value={uploadFileType}>
<Radio value={DATA_TYPES.SINGLE_BOUT}>单轮</Radio>
<Radio value={DATA_TYPES.MULTIPLE_BOUT}>多轮</Radio>
</Radio.Group>
</Form.Item>
</Form>
看官方文档可知,是因为Form包裹的缘故:
被设置了 name 属性的 Form.Item 包装的控件,表单控件会自动添加 value(或 valuePropName 指定的其他属性) onChange(或 trigger 指定的其他属性),数据同步将被 Form 接管,这会导致以下结果:
- 你不再需要也不应该用 onChange 来做数据收集同步(你可以使用 Form 的 onValuesChange),但还是可以继续监听 onChange 事件。
- 你不能用控件的 value 或 defaultValue 等属性来设置表单域的值,默认值可以用 Form 里的 initialValues 来设置。注意 initialValues 不能被 setState 动态更新,你需要用 setFieldsValue 来更新。
- 你不应该用 setState,可以使用 form.setFieldsValue 来动态改变表单值。
2、antd单文件上传Upload怎么设置上传列表只展示最后一个文件?
3、子组件渲染触发父组件重新渲染,这时因为useEffect中的请求函数没有在卸载时被取消而报错?
Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.
useEffect(() => {
init();
console.log('component DoLabel useEffect init..........');
return () => {
console.log('component DoLabel useEffect 卸载 init..........');
}
}, [])
const init = async () => {
setStartTime(new Date().getTime());
const resultJson = await queryUnmarkedData({projectId});
handleInitData(resultJson, 'init');
}
原因:组件卸载时,异步请求返回,去执行setState操作,而此时组件已经被卸载!所以报错
解决:
1、增加一个标志变量,为false则表示组件已卸载,setState之前判断一些这个变量是否为true
2、在useEffect中return一个取消请求的操作函数,这里可以封装一个自定义的hook,详见链接:(stackoverflow.com/questions/5…)
在antd组件Select外层又包了一层,点击出现下拉框有时会报错?
NaN is an invalid value for the top css style property.