typescript 为什么destroyOnClose={true}在React中不起作用

3okqufwl  于 2023-05-19  发布在  TypeScript
关注(0)|答案(3)|浏览(365)

我正在使用TypeScript开发一个基于React hook的函数式应用程序,我正在使用ant design中的modal。我正在通过modal提交表格。因此,将不止一次地调用该模式来填充表的不同行。
问题是,当模态在第二次、第三次或横向时间弹出时,它总是携带先前的值。
为了避免这种情况,我设置了模式EnableViewState="false",但它不起作用。我设置了destroyOnClose={true}。但没成功在modal documentation中,当destroyOnClose不工作时,我们需要使用它。但在哪里定义它呢?因为,当我在模态形式中设置为<Form onSubmit={props.inputSubmit} preserve={false}时,我得到一个错误,显示为Type '{ children: Element[]; onSubmit: any; preserve: boolean; }' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes<Form>......?
你用什么方法来保证每次模式重载时,它都是空的?我不想在输入的表单值字段中分配状态。是否有其他选项,例如destroyOnClose={true}?
这是我的模型

<Form onSubmit={props.inputSubmit}>
  <Row>
    <Col span={10}>
      <Form.Item>
        <Text strong={true}>Article name: </Text>
      </Form.Item>
    </Col>
    <Col span={12}>
      <Form.Item>
        <Input
          style={{ backgroundColor: '#e6f9ff' }}
          name="articleName"
          onChange={props.handleArticleModalInput}
        />
      </Form.Item>
    </Col>
  </Row>
</Form>

这里是调用模态函数的地方

return (
  <>
    <ArticleTableModal
      destroyOnClose={true}
      isVisible={modalVisibilty}
      inputSubmit={inputSubmit}
      handleCancel={handleCancel}
      filledData={fetchedData}
      articleNumber={articleNumber}
      handleArticleModalInput={handleArticleModalInput}

    />

    <Table
      pagination={false}
      dataSource={articleDataSource}
      columns={articleColumns}
      scroll={{ y: 400 }}
      bordered
    />
  </>
)

任何帮助都非常感谢。

2w3rbyxf

2w3rbyxf1#

您需要在每次模态启动时为表单中的字段生成动态键。
这里有一个沙盒可以玩。如果不对键进行任何更改,模态将保留其中的值。如果更改键并启动模式,则该值将被清除。
Sandbox Link

import React from "react";
import ReactDOM from "react-dom";
import "antd/dist/antd.css";
import "./index.css";
import { Modal, Button, Input } from "antd";

class App extends React.Component {
  state = { visible: false, theKey: "dummy" };

  showModal = () => {
    this.setState({
      visible: true
    });
  };

  handleOk = (e) => {
    console.log(e);
    this.setState({
      visible: false
    });
  };

  handleCancel = (e) => {
    console.log(e);
    this.setState({
      visible: false
    });
  };

  handleChange = ({ target: { value } }) => {
    this.setState({ theKey: value });
  };

  render() {
    return (
      <>
        <Input onChange={this.handleChange} placeholder="key for input field"/>
        <br />
        <Button type="primary" onClick={this.showModal}>
          Open Modal
        </Button>
        <Modal
          title="Basic Modal"
          visible={this.state.visible}
          onOk={this.handleOk}
          onCancel={this.handleCancel}
        >
          <Input
            key={this.state.theKey}
            style={{ backgroundColor: "#e6f9ff" }}
            name="articleName"
          />
        </Modal>
      </>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("container"));
nkoocmlb

nkoocmlb2#

在这里,我们将使用一个自定义钩子,它从其他地方(比如第三方UI库) Package ModalDialog组件,并返回一个setter和一个自包含component/null的元组。钩子使这变得更整洁,但您仍然可以使用类组件完成所有这些,代价是有点冗长。由于您标记了Typescript,这应该很简单,但您可能必须指定useState的使用是useState<React.ReactChild>();,以避免类型错误。

const useDialog = (ModalComponent) => {
  const [modalDialogState, setModalDialogState] = useState();
  return modalDialogState
    ? [
      setModalDialogState,
      // You may have to tweak this a bit depending on
      // how your library works.
      () => (
        <ModalComponent onClose={() => setModalDialogState('')> 
          {modalDialogState}
        </ModalComponent>
      ),
    ]
    : [setModalDialogState, null];
};

const MyComponent = () => {
  const [setModal, Modal] = useDialog(WhateverLibraryComponent);
  useEffect(() => {
    // Cleanup function, run on unMount and clears dialog contents.
    return () => setModal('');
  }, [setModal]);

  return Modal
    ? (
      <>
        <Modal />
        /* Normal render stuff */
      </>
    )
    // You can optionally render a button here with onClick
    // set to a function that calls setModal with some 
    // appropriate contents.
    : (/* Normal render stuff */)
};
jv4diomz

jv4diomz3#

表单状态由useForm在Modal之外维护。
“destroyOnClose”是Modal中的API,因此它只处理与Modal相关的逻辑,而不是Form。
在antd 4.5版本以上,你可以简单地使用“保留” prop 。例如:

<Modal destroyOnClose>
    <Form preserve={false} />
</Modal />

相关问题