react+antd的Modal和Form復(fù)合使用

Modal的使用
Modal是一個(gè)使用頻率很高的組件
antd對(duì)于Modal提供的方法和屬性其實(shí)已經(jīng)很全面了,而日常用法在遇到一些特殊的情況的時(shí)候會(huì)覺(jué)得很麻煩,比如
1、一個(gè)組件有多個(gè)Modal,因?yàn)樾枰獀isible來(lái)控制是否顯示,state里面需要寫很多個(gè)visible。
2、一個(gè)組件里有多個(gè)Form,而且Form還放在Modal里面(這也是一個(gè)很常見(jiàn)的操作,彈出一個(gè)模態(tài)框然后填一些數(shù)據(jù),然后提交)。
3、Modal里面包含了Table+搜索框等內(nèi)容。

解決的思路很簡(jiǎn)單

  • 情況1的話使用Modal.confirm()或者M(jìn)odal.info()。根據(jù)是否需要提交操作選擇。

  • 情況2、3寫一個(gè)新的組件,所有Modal里組件的顯示、變化都在當(dāng)前組件控制。只需要在父組件中調(diào)用并傳入visible,onOk等參數(shù)

具體實(shí)現(xiàn)代碼

方法一:直接彈出Modal(不需要visible控制,可支持提交、可支持關(guān)閉時(shí)銷毀)
優(yōu)點(diǎn):
1、可以直接在方法中調(diào)用,不需要用visible控制顯示,使用destroy()關(guān)閉。
2、可以不通過(guò)更新state來(lái)更新Modal,使用update()直接更新Modal。
缺點(diǎn):
1、只有兩個(gè)按鈕,不可設(shè)置更多的按鈕,適合只需要一個(gè)關(guān)閉,一個(gè)提交的情況。
[Modal.info/success/error/warning只有一個(gè)按鈕]。

showConfirm = () => {
  const modal = Modal.confirm();
  modal.update({
    title: '標(biāo)題',
    okText: '保存',//默認(rèn)為確認(rèn)
    cancelText: '關(guān)閉',//默認(rèn)為取消
    destroyOnClose: true,
    //默認(rèn)false。默認(rèn)關(guān)閉后狀態(tài)不會(huì)自動(dòng)清空, 如果希望每次打開都是新內(nèi)容需要設(shè)置true
    content: (
        <div>
         //Modal內(nèi)其他組件
        </div>
      ),
    onOk() {
    //調(diào)用點(diǎn)擊確定時(shí)回調(diào)的方法
    },
    onCancel() {
    //點(diǎn)擊取消/遮罩層的時(shí)候回調(diào)的方法
      modal.destroy();//這是調(diào)用Modal.confirm()后返回的引用,可以通過(guò)該引用更新和關(guān)閉彈窗
    },
  });
}

方法二:使用Modal+Form實(shí)現(xiàn)一個(gè)Modal子組件。
優(yōu)點(diǎn):不需要設(shè)置ref。直接在子組件里控制Form的變化。由于變成了一個(gè)單獨(dú)組件,父組件里不用監(jiān)控Modal里其他組件的變化。
缺點(diǎn):沒(méi)覺(jué)得有什么缺點(diǎn)。

class CreatePlan extends Component {
  constructor() {
    super();
  }

  onOk = () => {
    this.props.form.validateFields((err, values) => {
      if (err) return;//檢查Form表單填寫的數(shù)據(jù)是否滿足rules的要求
      this.props.onOk(values);//調(diào)用父組件給的onOk方法并傳入Form的參數(shù)。
    })
  };
  onCancel = () => {
    this.props.form.resetFields();//重置Form表單的內(nèi)容
    this.props.onCancel()//調(diào)用父組件給的方法
  };

  render() {
    const {getFieldDecorator} = this.props.form;
    return (
      <Modal
        onOk={this.onOk}
        onCancel={this.onCancel}
        visible={this.props.visible}
        title='新增自動(dòng)升級(jí)'
      >
        <Form>
          <FormItem label="升級(jí)計(jì)劃名稱">
            {getFieldDecorator('planName', {
              rules: [{required: true, message: '請(qǐng)?zhí)顚懮?jí)計(jì)劃名稱'}],
            })(
              <Input/>
            )}
          </FormItem>
          <FormItem label="自動(dòng)升級(jí)時(shí)間">
            {getFieldDecorator('upgradeTime', {
              initialValue: moment(),
              rules: [{required: true, message: '請(qǐng)選擇自動(dòng)升級(jí)時(shí)間'}],
            })(
              <DatePicker
                style={{width: 300}}
                showTime
                format="YYYY-MM-DD HH:mm:ss"
                placeholder="選擇自動(dòng)升級(jí)時(shí)間"
              />
            )}
          </FormItem>
        </Form>
      </Modal>
    )
  }
}
export const CreatePlanFormModal = Form.create()(CreatePlan);

//以下父組件里的代碼
 <CreatePlanModal
    visible={this.state.createPlanModalVisible}
    onOk={(values) => this.judgeCreatePlan(values)}
    onCancel={this.handleCancel}
/>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容