React开发问题集

1,554 阅读2分钟

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.