DouyinFE / semi-design

🚀A modern, comprehensive, flexible design system and React UI library. 🎨 Provide more than 3000+ Design Tokens, easy to build your design system. Make Semi Design to Any Design. 🧑🏻‍💻 Design to Code in one click
https://semi.design
Other
8.43k stars 711 forks source link

form组件无法获取formApi #668

Closed easy-do closed 2 years ago

easy-do commented 2 years ago
    formBRef: LegacyRef<Form> | undefined;
    formApi: FormApi | undefined;
    //构造函数 在React组件挂载之前调用
    constructor(props: any) {
        super(props)
        this.getFormApi = this.getFormApi.bind(this);
        this.formBRef = react.createRef<Form>();
}
    getFormApi(formApi:FormApi<any>) {
        this.formApi = formApi;
        // 获取到formApi对象后,你可以使用它来对表单进行任何你想做的修改 ~
    }
            <Modal
                title="修改渠道信息"
                visible={this.state.updateShow}
                onOk={this.updateHandleOk}
                onCancel={this.updateHandleCancel}
                maskClosable={false}
            >
                <Form getFormApi={(formApi)=>this.getFormApi(formApi)} ref={this.formBRef}  onValueChange={(values) => this.updateValueChange(values)}>
                <Form.Input field='channelName' label='渠道名称' style={{ width: '90%' }} />
                        <Form.Select field="channelType" label='渠道类型' style={{ width: '90%' }}>
                            <Form.Select.Option value="DINGTALK">钉钉</Form.Select.Option>
                            <Form.Select.Option value="SOCKET">socket</Form.Select.Option>
                        </Form.Select>
                        <Form.TextArea field='data' label='渠道参数设置' style={{ width: '90%' }} />
                </Form>
            </Modal>

如果把Modal去掉就可以

pointhalo commented 2 years ago

不存在无法获取的情况。getFormApi是Form mounted后的回调,当Form组件挂载后才会执行。

pointhalo commented 2 years ago

1、没看明白你遇到的问题是什么 2、Form 获取formApi的途径有几种,但不太需要 getFormApi与ref同时使用。

easy-do commented 2 years ago

当前实测是这样的,比如我在a class组件中 直接使用from是可以按照官方文档的方式获取的,但是如果我在form组件外再套一个父组件(比如modal)那么我就不能再 a class来直接获取formApi了,当前我找到了一种解决办法,就是吧form单独引到一个B class里,并获取好formApi,然后再 a页面的组件modal中引入这个封装的B calss 然后用父组件操作子组件的方式来实现使用form的forApi进行set等操作

pointhalo commented 2 years ago

你的父组件里要获取子组件中的formApi,是需要通过组件通信自己传递的。父组件里并不会知道子组件里有什么东西。 可以抛开是否有form,这里就是纯粹的父子组件通信问题。