React-hooks 父组件通过ref获取子组件数据和方法

科技资讯 投稿 5700 0 评论

React-hooks 父组件通过ref获取子组件数据和方法

class RefTest extends React.Component{
    constructor(props{
        super(props;
        this.myRef=React.createRef(;
    }
    componentDidMount({
        console.log(this.myRef.current;
    }
    render({
        return <input ref={this.myRef}/>
    }
}

useImperativeHandle 和 forwardRef 配合就能达到效果。

useImperativeHandle

useImperativeHandle:可以配合 forwardRef 自定义暴露给父组件的实例值。

useImperativeHandle 接收三个参数:

② 第二个参数 createHandle:处理函数,返回值作为暴露给父组件的 ref 对象
③ 第三个参数 deps:依赖项 deps,依赖项更改形成新的 ref 对象。
forwardRef 会创建一个 React 组件,这个组件能够将其接受的 ref 属性转发到其组件树下的另一个组件中。

// 子组件

const CollectAmountFormItem = forwardRef(({ isDisabled, val, handleChange }: Props, onRef: any => {

    const [isShow, setIsShow] = useState<boolean>(val == 1; // 是否展示募集资金和剩余募集资金

	// 暴露给父组件的属性
    useImperativeHandle(onRef, ( => ({
        isShow,
        setIsShow
    };

    useEffect(( => {
        if (val == 1 setIsShow(true
        else setIsShow(false
    }, [val]

    /**
     * 是否募集回调
     * @param val 下拉框id
     * @param option 下拉框对象
     */
    const handleSelect = (val: any, option: any => {
        setIsShow(val == 1;
        handleChange && handleChange(val, option;
    };

    return (
        <>
            <Col xs={20} sm={16} md={12} lg={8} xl={6}>
                <Form.Item name="isRaiseMoney" label="是否募集资金" rules={[{ required: true }]}>
                    <Select placeholder="请选择" disabled={isDisabled} onChange={handleSelect}>
                        <Select.Option value={1}>是</Select.Option>
                        <Select.Option value={0}>否</Select.Option>
                    </Select>
                </Form.Item>
            </Col>
            {
                isShow && (
                    <>
                        <Col xs={20} sm={16} md={12} lg={8} xl={6}>
                            <Form.Item name="usedMoney" label="已使用资金" rules={[{ required: isShow }]}>
                                <InputNumber
                                    formatter={value => `${value}`.replace(/\d{1,3}(?=(\d{3}+(\.\d*?$/g, '$&,'}
                                    parser={value => `${value}`.replace(/\$\s?|(,*/g, ''}
                                    style={{width: '100%'}}
                                    precision={2}
                                    disabled
                                    placeholder="自动计算"
                                />
                            </Form.Item>
                        </Col>
                        <Col xs={20} sm={16} md={12} lg={8} xl={6}>
                            <Form.Item name="remainMoney" label="剩余资金" rules={[{ required: isShow }]}>
                                <InputNumber
                                    formatter={value => `${value}`.replace(/\d{1,3}(?=(\d{3}+(\.\d*?$/g, '$&,'}
                                    parser={value => `${value}`.replace(/\$\s?|(,*/g, ''}
                                    style={{width: '100%'}}
                                    precision={2}
                                    disabled
                                    placeholder="自动计算"
                                />
                            </Form.Item>
                        </Col>
                    </>
                
            }
        </>
  
}

// 在父组件中使用 // 1、首先引入该子组件 import CollectAmountFormItem from '@/components/CollectAmountFormItem'; // 2、定义一个ref const collectRef = useRef<any>( // 3、使用 <CollectAmountFormItem isDisabled={isDisable} val={formData.isRaiseMoney} ref={collectRef} handleChange={handleChangeAmount} /> // 然后就可以在父组件中的一些方法中获取子组件暴露出来的方法或值,比如: collectRef.current.setIsShow(false

编程笔记 » React-hooks 父组件通过ref获取子组件数据和方法

赞同 (31) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽