zarm icon indicating copy to clipboard operation
zarm copied to clipboard

Modal 模态框内使用 Input 组件,onChange 触发之后,Input 的 value 值不生效。

Open Nick930826 opened this issue 3 years ago • 3 comments

Modal.confirm({ title: '添加备注', content: <Input autoHeight showLength maxLength={50} type="text" rows={3} value={remark} placeholder="请输入备注信息" onChange={(val) => setRemark(val)} /> })

Nick930826 avatar Apr 24 '21 00:04 Nick930826

的确有问题,感谢反馈

JeromeLin avatar Apr 24 '21 08:04 JeromeLin

@Nick930826

由于 Modal.confirm 的背后实现是通过动态 appendChild + ReactDOM.render 去实现的,所以 Modal.confirm 创建出来的组件其实已经脱离了当前 Class 组件的上下文,并不在当前 Class 组件的 render 范围内,即 Modal.confirm 组件不会因为调用 setRemark 而重新渲染。可以看到 Ant.Design 也是这样:https://codesandbox.io/s/guojihua-antd4153-forked-slgl0?file=/index.js

解决方案有两种:

  1. Modal 采用 JSX 的写法,写在 render 方法里,这样 Class 组件内部的 setRemark 就可以引发 Modal 的渲染。
  2. Input 组件改为非受控,直接用 this.value 的方式去取值。
Modal.confirm({
  title: '添加备注',
  content: <Input
    autoHeight
    showLength
    maxLength={50}
    type="text"
    rows={3}
    placeholder="请输入备注信息"
    onChange={(value) => {
      this.value = value; // 直接取this.value去使用
    }}
  />
})

edison-hm avatar Apr 27 '21 02:04 edison-hm

@edison-hm 考虑一下开放 Confirm 的 JSX 的写法,这样比用 Modal 去重新构造使用上方便一点。

JeromeLin avatar Apr 27 '21 05:04 JeromeLin